diff options
Diffstat (limited to 'doc/tutorial/resource')
| -rw-r--r-- | doc/tutorial/resource/MorphoEng.gf | 65 | ||||
| -rw-r--r-- | doc/tutorial/resource/MorphoIta.gf | 33 | ||||
| -rw-r--r-- | doc/tutorial/resource/SyntaxEng.gf | 19 | ||||
| -rw-r--r-- | doc/tutorial/resource/SyntaxIta.gf | 10 | ||||
| -rw-r--r-- | doc/tutorial/resource/TestEng.gf | 32 |
5 files changed, 104 insertions, 55 deletions
diff --git a/doc/tutorial/resource/MorphoEng.gf b/doc/tutorial/resource/MorphoEng.gf index 829688c01..b2255d0d4 100644 --- a/doc/tutorial/resource/MorphoEng.gf +++ b/doc/tutorial/resource/MorphoEng.gf @@ -2,14 +2,61 @@ resource MorphoEng = open Prelude in { + -- the lexicon construction API + + oper + mkN : overload { + mkN : (bus : Str) -> Noun ; + mkN : (man,men : Str) -> Noun ; + } ; + + mkA : (warm : Str) -> Adjective ; + + mkV : overload { + mkV : (kiss : Str) -> Verb ; + mkV : (do,does : Str) -> Verb ; + } ; + + mkV2 : overload { + mkV2 : (love : Verb) -> Verb2 ; + mkV2 : (talk : Verb) -> (about : Str) -> Verb2 ; + } ; + + -- grammar-internal definitions + param Number = Sg | Pl ; oper Noun, Verb : Type = {s : Number => Str} ; + Adjective : Type = {s : Str} ; + Verb2 : Type = Verb ** {c : Str} ; + + mkN = overload { + mkN : (bus : Str) -> Noun = \s -> mkNoun s (add_s s) ; + mkN : (man,men : Str) -> Noun = mkNoun ; + } ; - NP = {s : Str ; n : Number} ; - VP = {s : Bool => Bool => Number => Str * Str} ; -- decl, pol + mkA : (warm : Str) -> Adjective = ss ; + + mkV = overload { + mkV : (kiss : Str) -> Verb = \s -> mkVerb s (add_s s) ; + mkV : (do,does : Str) -> Verb = mkVerb ; + } ; + + mkV2 = overload { + mkV2 : (love : Verb) -> Verb2 = \love -> love ** {c = []} ; + mkV2 : (talk : Verb) -> (about : Str) -> Verb2 = + \talk,about -> talk ** {c = about} ; + } ; + + add_s : Str -> Str = \w -> case w of { + _ + "oo" => w + "s" ; -- bamboo + _ + ("s" | "z" | "x" | "sh" | "o") => w + "es" ; -- bus, hero + _ + ("a" | "o" | "u" | "e") + "y" => w + "s" ; -- boy + x + "y" => x + "ies" ; -- fly + _ => w + "s" -- car + } ; mkNoun : Str -> Str -> Noun = \x,y -> { s = table { @@ -18,19 +65,5 @@ resource MorphoEng = open Prelude in { } } ; - regNoun : Str -> Noun = \s -> case last s of { - "s" | "z" => mkNoun s (s + "es") ; - "y" => mkNoun s (init s + "ies") ; - _ => mkNoun s (s + "s") - } ; - mkVerb : Str -> Str -> Verb = \x,y -> mkNoun y x ; - - regVerb : Str -> Verb = \s -> case last s of { - "s" | "z" => mkVerb s (s + "es") ; - "y" => mkVerb s (init s + "ies") ; - "o" => mkVerb s (s + "es") ; - _ => mkVerb s (s + "s") - } ; - } diff --git a/doc/tutorial/resource/MorphoIta.gf b/doc/tutorial/resource/MorphoIta.gf index 2d5272812..7bf4de1a1 100644 --- a/doc/tutorial/resource/MorphoIta.gf +++ b/doc/tutorial/resource/MorphoIta.gf @@ -4,6 +4,13 @@ resource MorphoIta = open Prelude in { + -- the lexicographer's API + + oper + masculine, feminine : Gender ; + + + param Number = Sg | Pl ; Gender = Masc | Fem ; @@ -16,6 +23,10 @@ Verb : Type = {s : Number => Str} ; + -- two-place verbs have a preposition + + Verb2 : Type = Verb ** {c : Str} ; + -- this function takes the gender and both singular and plural forms mkNoun : Gender -> Str -> Str -> Noun = \g,vino,vini -> { @@ -28,16 +39,18 @@ -- this function takes the singular form - regNoun : Str -> Noun = \vino -> - let - vin = init vino ; - o = last vino - in - case o of { - "a" => mkNoun Fem vino (vin + "e") ; -- pizza - "o" | "e" => mkNoun Masc vino (vin + "i") ; -- vino, pane - _ => mkNoun Masc vino vino -- tram - } ; + regNoun : Str -> Noun = \vino -> + case vino of { + vin + c@("c" | "g") + "a" + => mkNoun Fem vino (vin + c + "he") ; -- banche + vin + "a" + => mkNoun Fem vino (vin + "e") ; -- pizza + vin + c@("c" | "g") + "o" + => mkNoun Masc vino (vin + c + "hi") ; -- boschi + vin + ("o" | "e") + => mkNoun Masc vino (vin + "i") ; -- vino, pane + _ => mkNoun Masc vino vino -- tram + } ; -- to make nouns such as "carne", "università" feminine diff --git a/doc/tutorial/resource/SyntaxEng.gf b/doc/tutorial/resource/SyntaxEng.gf index 4eac0058e..f1de47e21 100644 --- a/doc/tutorial/resource/SyntaxEng.gf +++ b/doc/tutorial/resource/SyntaxEng.gf @@ -6,17 +6,17 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { Phr = {s : Str} ; S = {s : Str} ; QS = {s : Str} ; - NP = MorphoEng.NP ; - IP = MorphoEng.NP ; + NP = NounPhrase ; + IP = NounPhrase ; CN = Noun ; Det = {s : Str ; n : Number} ; AP = {s : Str} ; AdA = {s : Str} ; - VP = MorphoEng.VP ; + VP = VerbPhrase ; N = Noun ; A = {s : Str} ; V = Verb ; - V2 = Verb ** {c : Str} ; + V2 = Verb2 ; lin PhrS = postfixSS "." ; @@ -31,13 +31,13 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { IPPosV2 ip np v2 = { s = let - vp : MorphoEng.VP = {s = \\q,b,n => predVerb v2 q b n} ; + vp : VerbPhrase = {s = \\q,b,n => predVerb v2 q b n} ; in bothWays (ip.s ++ (predVP False True np vp).s) v2.c } ; IPNegV2 ip np v2 = { s = let - vp : MorphoEng.VP = {s = \\q,b,n => predVerb v2 q b n} ; + vp : VerbPhrase = {s = \\q,b,n => predVerb v2 q b n} ; in bothWays (ip.s ++ (predVP False False np vp).s) v2.c } ; @@ -77,7 +77,10 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { very_AdA = {s = "very"} ; oper - predVP : Bool -> Bool -> MorphoEng.NP -> MorphoEng.VP -> SS = + NounPhrase = {s : Str ; n : Number} ; + VerbPhrase = {s : Bool => Bool => Number => Str * Str} ; -- decl, pol + + predVP : Bool -> Bool -> NounPhrase -> VerbPhrase -> SS = \q,b,np,vp -> { s = let vps = vp.s ! q ! b ! np.n in case q of { @@ -92,7 +95,7 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { } ; do : Bool -> Number -> Str = \b,n -> - posneg b ((regVerb "do").s ! n) ; + posneg b ((mkV "do").s ! n) ; predVerb : Verb -> Bool -> Bool -> Number -> Str * Str = \verb,q,b,n -> let diff --git a/doc/tutorial/resource/SyntaxIta.gf b/doc/tutorial/resource/SyntaxIta.gf index a0c2405e7..4721a5d4e 100644 --- a/doc/tutorial/resource/SyntaxIta.gf +++ b/doc/tutorial/resource/SyntaxIta.gf @@ -8,16 +8,16 @@ concrete SyntaxIta of Syntax = open Prelude, MorphoIta in { QS = {s : Str} ; NP = {s : Str ; g : Gender ; n : Number} ; IP = {s : Str ; g : Gender ; n : Number} ; - CN = {s : Number => Str ; g : Gender} ; + CN = Noun ; Det = {s : Gender => Str ; n : Number} ; AP = {s : Gender => Number => Str} ; AdA = {s : Str} ; VP = {s : Bool => Gender => Number => Str} ; - N = {s : Number => Str ; g : Gender} ; - A = {s : Gender => Number => Str} ; - V = {s : Number => Str} ; - V2 = {s : Number => Str ; c : Str} ; + N = Noun ; + A = Adjective ; + V = Verb ; + V2 = Verb2 ; lin PhrS = postfixSS "." ; diff --git a/doc/tutorial/resource/TestEng.gf b/doc/tutorial/resource/TestEng.gf index 3bfe52dfd..4099753f1 100644 --- a/doc/tutorial/resource/TestEng.gf +++ b/doc/tutorial/resource/TestEng.gf @@ -3,21 +3,21 @@ concrete TestEng of Test = SyntaxEng ** open Prelude, MorphoEng in { lin - Wine = regNoun "wine" ; - Cheese = regNoun "cheese" ; - Fish = mkNoun "fish" "fish" ; - Pizza = regNoun "pizza" ; - Waiter = regNoun "waiter" ; - Customer = regNoun "customer" ; - Fresh = ss "fresh" ; - Warm = ss "warm" ; - Italian = ss "Italian" ; - Expensive = ss "expensive" ; - Delicious = ss "delicious" ; - Boring = ss "boring" ; - Stink = regVerb "stink" ; - Eat = regVerb "eat" ** {c = []} ; - Love = regVerb "love" ** {c = []} ; - Talk = regVerb "talk" ** {c = "about"} ; + Wine = mkN "wine" ; + Cheese = mkN "cheese" ; + Fish = mkN "fish" "fish" ; + Pizza = mkN "pizza" ; + Waiter = mkN "waiter" ; + Customer = mkN "customer" ; + Fresh = mkA "fresh" ; + Warm = mkA "warm" ; + Italian = mkA "Italian" ; + Expensive = mkA "expensive" ; + Delicious = mkA "delicious" ; + Boring = mkA "boring" ; + Stink = mkV "stink" ; + Eat = mkV2 (mkV "eat") ; + Love = mkV2 (mkV "love") ; + Talk = mkV2 (mkV "talk") "about" ; } |
