Files
gf-core/examples/tutorial/syntax/MorphoIta.gf
2007-08-16 16:18:54 +00:00

101 lines
2.7 KiB
Plaintext

--# -path=.:prelude
-- This is a simple Italian resource morphology for the GF tutorial.
resource MorphoIta = open Prelude in {
-- the lexicographer's API
oper
masculine, feminine : Gender ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
Noun : Type = {s : Number => Str ; g : Gender} ;
Adjective : Type = {s : Gender => Number => Str} ;
-- we will only use present indicative third person verb forms
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 -> {
s = table {
Sg => vino ;
Pl => vini
} ;
g = g
} ;
-- this function takes the singular form
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
femNoun : Noun -> Noun = \mano -> {
s = mano.s ;
g = Fem
} ;
-- this takes both genders and numbers
mkAdjective : (x1,_,_,x4 : Str) -> Adjective = \nero,nera,neri,nere -> {
s = table {
Masc => (mkNoun Masc nero neri).s ;
Fem => (mkNoun Fem nera nere).s
}
} ;
-- this takes the masculine singular form
regAdjective : Str -> Adjective = \nero ->
let ner = init nero in
case last nero of {
"o" => mkAdjective (ner + "o") (ner + "a") (ner + "i") (ner + "e") ;
"e" => mkAdjective (ner + "e") (ner + "e") (ner + "i") (ner + "i") ;
_ => mkAdjective nero nero nero nero
} ;
-- this function takes the singular and plural forms
mkVerb : Str -> Str -> Verb = \ama,amano -> {
s = table {
Sg => ama ;
Pl => amano
}
} ;
-- this function takes the infinitive form
regVerb : Str -> Verb = \amare ->
let am = Predef.tk 3 amare in
case Predef.dp 3 amare of {
"ere" => mkVerb (am + "e") (am + "ono") ; -- premere
"ire" => mkVerb (am + "isce") (am + "iscono") ; -- finire
_ => mkVerb (am + "a") (am + "ano") -- amare
} ;
}