diff options
Diffstat (limited to 'examples/tutorial/embedded')
| -rw-r--r-- | examples/tutorial/embedded/Makefile | 4 | ||||
| -rw-r--r-- | examples/tutorial/embedded/Query.gf | 17 | ||||
| -rw-r--r-- | examples/tutorial/embedded/QueryEng.gf | 15 | ||||
| -rw-r--r-- | examples/tutorial/embedded/TransferDef.hs | 26 | ||||
| -rw-r--r-- | examples/tutorial/embedded/TransferLoop.hs | 21 |
5 files changed, 83 insertions, 0 deletions
diff --git a/examples/tutorial/embedded/Makefile b/examples/tutorial/embedded/Makefile new file mode 100644 index 000000000..f1a61cb92 --- /dev/null +++ b/examples/tutorial/embedded/Makefile @@ -0,0 +1,4 @@ +all: + gfc --make --output-format=haskell QueryEng.gf + ghc --make -o ./math TransferLoop.hs + strip math diff --git a/examples/tutorial/embedded/Query.gf b/examples/tutorial/embedded/Query.gf new file mode 100644 index 000000000..b1ba23a87 --- /dev/null +++ b/examples/tutorial/embedded/Query.gf @@ -0,0 +1,17 @@ +abstract Query = { + + flags startcat=Question ; + + cat + Answer ; Question ; Object ; + + fun + Even : Object -> Question ; + Odd : Object -> Question ; + Prime : Object -> Question ; + Number : Int -> Object ; + + Yes : Answer ; + No : Answer ; +} + diff --git a/examples/tutorial/embedded/QueryEng.gf b/examples/tutorial/embedded/QueryEng.gf new file mode 100644 index 000000000..a740056ee --- /dev/null +++ b/examples/tutorial/embedded/QueryEng.gf @@ -0,0 +1,15 @@ +concrete QueryEng of Query = { + lincat + Answer, Question, Object = Str ; + + lin + Even x = "is" ++ x ++ "even" ; + Odd x = "is" ++ x ++ "odd" ; + Prime x = "is" ++ x ++ "prime" ; + Number n = n.s ; + + Yes = "yes" ; + No = "no" ; + +} + diff --git a/examples/tutorial/embedded/TransferDef.hs b/examples/tutorial/embedded/TransferDef.hs new file mode 100644 index 000000000..37d81c6dc --- /dev/null +++ b/examples/tutorial/embedded/TransferDef.hs @@ -0,0 +1,26 @@ +module TransferDef where + +import PGF (Tree) +import Query -- generated from GF + +transfer :: Tree -> Tree +transfer = gf . answer . fg + +answer :: GQuestion -> GAnswer +answer p = case p of + GOdd x -> test odd x + GEven x -> test even x + GPrime x -> test prime x + +value :: GObject -> Int +value e = case e of + GNumber (GInt i) -> fromInteger i + +test :: (Int -> Bool) -> GObject -> GAnswer +test f x = if f (value x) then GYes else GNo + +prime :: Int -> Bool +prime x = elem x primes where + primes = sieve [2 .. x] + sieve (p:xs) = p : sieve [ n | n <- xs, n `mod` p > 0 ] + sieve [] = [] diff --git a/examples/tutorial/embedded/TransferLoop.hs b/examples/tutorial/embedded/TransferLoop.hs new file mode 100644 index 000000000..58498da11 --- /dev/null +++ b/examples/tutorial/embedded/TransferLoop.hs @@ -0,0 +1,21 @@ +module Main where + +import PGF +import TransferDef (transfer) + +main :: IO () +main = do + gr <- readPGF "Query.pgf" + loop (translate transfer gr) + +loop :: (String -> String) -> IO () +loop trans = do + s <- getLine + if s == "quit" then putStrLn "bye" else do + putStrLn $ trans s + loop trans + +translate :: (Tree -> Tree) -> PGF -> String -> String +translate tr gr s = case parseAllLang gr (startCat gr) s of + (lg,t:_):_ -> linearize gr lg (tr t) + _ -> "NO PARSE" |
