summaryrefslogtreecommitdiff
path: root/src/GF/Canon/GFCC/Shell.hs
blob: bc33e7949181f9bfe8b5ebe7e31139b10ef943a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
module Main where

import GF.Canon.GFCC.GFCCAPI
import qualified GF.Canon.GFCC.GenGFCC as G ---
import GF.Canon.GFCC.AbsGFCC (CId(CId)) ---
import System.Random (newStdGen)
import System (getArgs)


-- Simple translation application built on GFCC. AR 7/9/2006 -- 19/9/2007

main :: IO ()
main = do
  file:_  <- getArgs
  grammar <- file2grammar file
  putStrLn $ "languages:  " ++ unwords (languages grammar)
  putStrLn $ "categories: " ++ unwords (categories grammar)
  loop grammar

loop :: MultiGrammar -> IO ()
loop grammar = do
  s <- getLine
  if s == "quit" then return () else do
    treat grammar s
    loop grammar

treat :: MultiGrammar -> String -> IO ()
treat grammar s = case words s of
  "gt":cat:n:_ -> do
    mapM_ prlinonly $ take (read n) $ G.generate grammar (CId cat)
  "gtt":cat:n:_ -> do
    mapM_ prlin $ take (read n) $ G.generate grammar (CId cat)
  "gr":cat:n:_ -> do
    gen <- newStdGen
    mapM_ prlinonly $ take (read n) $ G.generateRandom gen grammar (CId cat)
  "grt":cat:n:_ -> do
    gen <- newStdGen
    mapM_ prlin $ take (read n) $ G.generateRandom gen grammar (CId cat)
  "p":lang:cat:ws -> do
    let ts = parse grammar lang cat $ unwords ws
    mapM_ (putStrLn . showTree) ts 
  "search":cat:n:ws -> do
    case G.parse (read n) grammar (CId cat) ws of
      t:_ -> prlin t
      _ -> putStrLn "no parse found" 
  _ -> lins $ readTree grammar s
 where
  langs = languages grammar
  lins t = mapM_ (lint t) $ langs 
  lint t lang = do
----    putStrLn $ showTree $ linExp grammar lang t 
    lin t lang
  lin t lang = do
    putStrLn $ linearize grammar lang t
  prlins t = do
    putStrLn $ showTree t
    lins t
  prlin t = do
    putStrLn $ showTree t
    prlinonly t
  prlinonly t = mapM_ (lin t) $ langs