diff options
Diffstat (limited to 'examples/tutorial')
| -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 | ||||
| -rw-r--r-- | examples/tutorial/resource-foods/FoodsSwe.gf | 5 | ||||
| -rw-r--r-- | examples/tutorial/resource-foods/LexFoodsIta.gf | 7 | ||||
| -rw-r--r-- | examples/tutorial/resource-foods/LexFoodsSwe.gf | 20 |
8 files changed, 114 insertions, 1 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" diff --git a/examples/tutorial/resource-foods/FoodsSwe.gf b/examples/tutorial/resource-foods/FoodsSwe.gf new file mode 100644 index 000000000..a77f924ad --- /dev/null +++ b/examples/tutorial/resource-foods/FoodsSwe.gf @@ -0,0 +1,5 @@ +--# -path=.:../foods:present + +concrete FoodsSwe of Foods = FoodsI with + (Syntax = SyntaxSwe), + (LexFoods = LexFoodsSwe) ; diff --git a/examples/tutorial/resource-foods/LexFoodsIta.gf b/examples/tutorial/resource-foods/LexFoodsIta.gf index be120a24e..2148953c3 100644 --- a/examples/tutorial/resource-foods/LexFoodsIta.gf +++ b/examples/tutorial/resource-foods/LexFoodsIta.gf @@ -1,6 +1,6 @@ --# -path=.:../foods:present:prelude -instance LexFoodsIta of LexFoods = open SyntaxIta, ParadigmsIta in { +instance LexFoodsIta of LexFoods = open SyntaxIta, ParadigmsIta, BeschIta in { oper wine_N = mkN "vino" ; pizza_N = mkN "pizza" ; @@ -12,4 +12,9 @@ instance LexFoodsIta of LexFoods = open SyntaxIta, ParadigmsIta in { expensive_A = mkA "caro" ; delicious_A = mkA "delizioso" ; boring_A = mkA "noioso" ; + drink_V2 = mkV2 (verboV (bere_27 "bere")) ; + eat_V2 = mkV2 (mkV "mangiare") ; + pay_V2 = mkV2 (mkV "pagare") ; + gentleman_N = mkN "signore" ; + lady_N = mkN "signora" ; } diff --git a/examples/tutorial/resource-foods/LexFoodsSwe.gf b/examples/tutorial/resource-foods/LexFoodsSwe.gf new file mode 100644 index 000000000..12a2aaeee --- /dev/null +++ b/examples/tutorial/resource-foods/LexFoodsSwe.gf @@ -0,0 +1,20 @@ +instance LexFoodsSwe of LexFoods = open SyntaxSwe, ParadigmsSwe, IrregSwe in { + oper + wine_N = mkN "vin" "vinet" "viner" "vinerna" ; + pizza_N = mkN "pizza" ; + cheese_N = mkN "ost" ; + fish_N = mkN "fisk" ; + fresh_A = mkA "färsk" ; + warm_A = mkA "varm" ; + italian_A = mkA "italiensk" ; + expensive_A = mkA "dyr" ; + delicious_A = mkA "läcker" "läckert" "läckra" "läckrare" "läckrast" ; + boring_A = mkA "tråkig" ; + + eat_V2 = mkV2 (mkV "äta" "åt" "ätit") ; + drink_V2 = mkV2 (mkV "dricka" "drack" "druckit") ; + pay_V2 = mkV2 "betala" ; + lady_N = mkN "dam" "damer" ; + gentleman_N = mkN "herr" ; + +} |
