diff --git a/lib/src/romanian/AdjectiveRon.gf b/lib/src/romanian/AdjectiveRon.gf new file mode 100644 index 000000000..e1d4f99f8 --- /dev/null +++ b/lib/src/romanian/AdjectiveRon.gf @@ -0,0 +1,67 @@ +incomplete concrete AdjectiveRon of Adjective = + CatRon ** open ResRon, Prelude in { + + lin + + PositA a = { + s = a.s ; + isPre = a.isPre + } ; + ComparA a np = { + s = \\af => more_CAdv.s ++ a.s ! af ++ conjThan ++ (np.s ! Ac).comp ; + isPre = False + } ; + + CAdvAP ad ap np = { + s = \\af => case af of + { AF g n sp c => artDem g n c ++ ad.s ++ ap.s ! (AF g n Indef c) ++ ad.p ++ (np.s ! No).comp ; + AA => ad.s ++ ap.s ! af ++ ad.p ++ (np.s ! No).comp + }; + isPre = False + } ; + + UseComparA a = { + s = \\af => more_CAdv.s ++ a.s ! af ; + isPre = False + } ; + + AdjOrd ord = { + s = \\af => case af of { + AF g n sp c => ord.s ! n ! g ! (convACase c) ; + _ => ord.s ! Sg ! Masc ! No + } ; + isPre = True + } ; + +-- $SuperlA$ belongs to determiner syntax in $Noun$. + + ComplA2 adj np = { + s = \\af => adj.s ! af ++ appCompl adj.c2 np ; + isPre = False + } ; + + ReflA2 adj = { + s = \\af => case af of + { AF g n sp c => adj.s ! af ++ adj.c2.s ++ + reflPron n P3 (convCase adj.c2.c) ++ reflPronHard g n P3; + AA => adj.s ! af ++ adj.c2.s ++ reflPron Sg P3 (convCase adj.c2.c) ++ reflPronHard Masc Sg P3 + }; + isPre = False + } ; + + SentAP ap sc = { + s = \\a => ap.s ! a ++ sc.s ; --- mood + isPre = False + } ; + + AdAP ada ap = { + s = \\a => ada.s ++ ap.s ! a ; + isPre = ap.isPre + } ; + + UseA2 a = { + s = a.s ; + isPre = False + } ; + +}; diff --git a/lib/src/romanian/AdverbRon.gf b/lib/src/romanian/AdverbRon.gf new file mode 100644 index 000000000..25f9d86d8 --- /dev/null +++ b/lib/src/romanian/AdverbRon.gf @@ -0,0 +1,30 @@ +incomplete concrete AdverbRon of Adverb = + CatRon ** open ResRon, Prelude in { + + lin + PositAdvAdj a = { + s = a.s ! AA + } ; + ComparAdvAdj cadv a np = { + s = cadv.s ++ a.s ! AA ++ cadv.p ++ (np.s ! No).comp + + } ; + ComparAdvAdjS cadv a s = { + s = cadv.s ++ a.s ! AA ++ cadv.p ++ s.s ! Indic + } ; + + PrepNP prep np = {s = case prep.needIndef of + {False => prep.s ++ (np.s ! prep.c).comp; + _ => prep.s ++ np.indForm} + }; + + AdAdv ada adv = {s = ada.s ++ adv.s } ; + + SubjS subj s = { + s = subj.s ++ s.s ! Indic + } ; + + AdnCAdv cadv = {s = cadv.s ++ conjThan} ; +-- doesn't yield to a correct form for more_CAdv + +} diff --git a/lib/src/romanian/BeschRon.gf b/lib/src/romanian/BeschRon.gf index 4511833ac..87e10a4db 100644 --- a/lib/src/romanian/BeschRon.gf +++ b/lib/src/romanian/BeschRon.gf @@ -2,10 +2,10 @@ resource BeschRon = open Prelude, MorphoRon,CatRon in { flags optimize=noexpand ; -- faster and smaller than =all -oper VerbeN = {s: VForm => Str } ; -oper mkNV : Verbe -> V = \ve -> {s = ve ; lock_V = <> } ; -oper mkRV : Verbe -> V = \ve -> {s = ve ; lock_V = <>} ; - +oper VerbeN = {s: VForm => Str ; isRefl : Agr => RAgr; nrClit : VClit} ; +oper mkNV : Verbe -> V = \ve -> {s = ve.s ; isRefl = \\_ => RNoAg ; nrClit = VNone ;lock_V = <> } ; +oper mkRVAcc : Verbe -> V = \ve -> {s = ve.s ; isRefl = \\a => aRefl a; nrClit = VRefl ;lock_V = <>} ; +oper mkRVDat : Verbe -> V = \ve -> {s = ve.s ; isRefl = \\a => dRefl a; nrClit = VRefl ;lock_V = <>}; -- for Group 1 - verbs ending in a (last sylablle) - the default behaviour is conjugation with "ez" -- with small mutation, depending on the second last letter (80 % verbs - especially neological) diff --git a/lib/src/romanian/CatRon.gf b/lib/src/romanian/CatRon.gf index a43aa5d3b..8db6861a7 100644 --- a/lib/src/romanian/CatRon.gf +++ b/lib/src/romanian/CatRon.gf @@ -2,7 +2,7 @@ concrete CatRon of Cat = CommonX - [Temp,TTAnt,Tense,TPres,TPast,TFut,TCond] - ** open Prelude, ResRon, (R = ParamX) in { + ** open Prelude, ResRon, MorphoRon,(R = ParamX) in { flags optimize=all_subs ; @@ -10,11 +10,47 @@ concrete CatRon of Cat = lincat +-- Tensed/Untensed + + S = {s : Mood => Str} ; + QS = {s : QForm => Str} ; + RS = {s : Mood => Agr => Str ; c : NCase} ; + SSlash = { + s : AAgr => Mood => Str ; + c2 : Compl + } ; +-- Sentence + + Cl = {s : Direct => RTense => Anteriority => Polarity => Mood => Str} ; + ClSlash = { + s : AAgr => Direct => RTense => Anteriority => Polarity => Mood => Str ; + c2 : Compl + } ; + Imp = {s : Polarity => ImpForm => Gender => Str} ; + +-- Relative + + RCl = { + s : Agr => RTense => Anteriority => Polarity => Mood => Str ; + c : NCase + } ; + RP = {s : AAgr => NCase => Str ; a : AAgr ; hasAgr : Bool; hasRef : Bool} ; -- Verb - -- VP = ResRon.VP ; - -- VPSlash = ResRon.VP ** {c2 : Compl} ; + VP = { + s : VForm => Str ; + isRefl : Agr => RAgr ; + nrClit : VClit ; + isFemSg : Bool ; -- needed for the correct placement of the Accusative clitic + neg : Polarity => Str ; -- ne-pas not needed - just "nu" + clAcc : RAgr ; -- le/se -- not needed if they are used in the noun + clDat : RAgr ; -- lui -- not needed if they are used in the noun + comp : Agr => Str ; -- content(e) ; à ma mère ; hier - + ext : Polarity => Str ; -- que je dors / que je dorme - so that it always comes after all the complements + } ; + + VPSlash = VP ** {c2 : Compl; needAgr : Bool} ; -- Comp = {s : Agr => Str} ; -- Adjective @@ -23,48 +59,113 @@ concrete CatRon of Cat = -- Noun lincat - CN = {s : Number => Str ; g : Gender} ; - -- Pron = Pronoun ; - -- NP = NounPhrase ; - -- Det = { - -- s : Gender => Case => Str ; - -- n : Number ; - -- s2 : Str ; -- -ci - -- sp : Gender => Case => Str -- substantival: mien, mienne - -- } ; - -- Quant = { - -- s : Bool => Number => Gender => Case => Str ; - -- s2 : Str ; - -- sp : Number => Gender => Case => Str - Ord = {s : AForm => Str ; isPre : Bool} ; + CN = {s : Number => Species => ACase => Str; g : NGender; a : Animacy } ; + Pron = {s : NCase => Str ; + c1, c2 : Clitics => Str ; + a : Agr ; + poss : Number => Gender => Str + } ; + NP = NounPhrase ; + --NCase because of the pronoun + + Det = {s : Gender => NCase => Str ; n : Number ; + isDef : Bool ; + post : Gender => NCase => Str ; + sp : Gender => NCase => Str ; -- pentru Lexicon e aceeasi forma totusi ! posibil + -- probabil pentru ca orice Quant -> Det + size : Str ; --because of the numerals + hasRef : Bool + }; + Predet = {s : AAgr => ACase => Str ; c : NCase} ; + -- Art = {s : Bool => Number => Gender => NCase => Str ; isDef : Bool } ; + Quant = { + s : Bool => Number => Gender => ACase => Str ; + sp : Number => Gender => ACase => Str ; -- diferente si in Lexicon, ex : acesta, aceasta + isDef : Bool ; + isPost : Bool ; + hasRef : Bool + }; + -- Numeral - Numeral = {s : ACase => CardOrd => NumF => Str ; size : Size } ; - Digits = {s : CardOrd => Str ; n : Size ; isDig : Bool} ; + Numeral = {s : ACase => CardOrd => NumF => Str ; + sp : ACase => CardOrd => NumF => Str ; size : Size } ; + Digits = {s : CardOrd => Str ; n : Size ; isDig : Bool} ; + Num = {s : Gender => Str ; sp : Gender => Str ; + isNum : Bool ; n : Number; size : Str } ; + Card = {s : Gender => Str ; sp : Gender => Str ; + n : Number; size : Size} ; + Ord = {s : Number => Gender => NCase => Str; isPre : Bool} ; +--Question + -- Question + QCl = {s : RTense => Anteriority => Polarity => QForm => Str} ; + IComp = {s : AAgr => Str} ; + IDet = {s : Gender => ACase => Str ; n : Number} ; + + IQuant = {s : Number => Gender => ACase => Str } ; + IP = {s : NCase => Str ; a : AAgr ; hasRef : Bool} ; -- Structural Conj = {s1,s2 : Str ; n : Number} ; - Subj = {s : Str ; m : Mood} ; - Prep = {s : Str ; c : NCase ; isDir : Bool} ; + Subj = {s : Str} ; --they all need Indicative mood + Prep = {s : Str ; c : NCase ; isDir : PrepDir ; needIndef : Bool ; prepDir : Str} ; -- Open lexical classes, e.g. Lexicon - Verb = {s : VForm => Str } ; - V ={s : VForm => Str } ; - VQ, VA = V ; - V2, VV, V2S, V2Q = V ** {c2 : Compl} ; - V3, V2A, V2V = V ** {c2,c3 : Compl} ; + --Verb = {s : VForm => Str } ; + V ={s : VForm => Str ; isRefl : Agr => RAgr; nrClit : VClit} ; + VQ, VA = V ; + V2,V2S, V2Q = V ** {c2 : Compl} ; + V3,V2A, V2V = V ** {c2,c3 : Compl} ; VS = V ** {m : Polarity => Mood} ; - - A = {s : Degree => AForm => Str ; isPre : Bool} ; - A2 = {s : Degree => AForm => Str ; c2 : Compl} ; + VV = V ** {c2 : Agr => Str} ; + A = {s : AForm => Str ; isPre : Bool} ; + A2 = {s : AForm => Str ; c2 : Compl} ; N = Noun ; N2 = Noun ** {c2 : Compl} ; N3 = Noun ** {c2,c3 : Compl} ; - PN = {s : ACase => Str ; g : Gender ; n : Number} ; + PN = {s : NCase => Str ; g : Gender ; n : Number; a : Animacy} ; + + Comp = {s : Agr => Str} ; + + Temp = {s : Str ; t : RTense ; a : Anteriority} ; + Tense = {s : Str ; t : RTense} ; + lin + TTAnt t a = {s = a.s ++ t.s ; a = a.a ; t = t.t} ; + TPres = {s = []} ** {t = RPres} ; + TPast = {s = []} ** {t = RPast} ; --# notpresent + TFut = {s = []} ** {t = RFut} ; --# notpresent + TCond = {s = []} ** {t = RCond} ; --# notpresent + + + + +oper + aagr : Gender -> Number -> AAgr = \g,n -> + {g = g ; n = n} ; + agrP3 : Gender -> Number -> Agr = \g,n -> + aagr g n ** {p = P3} ; + + conjGender : Gender -> Gender -> Gender = \m,n -> + case m of { + Fem => n ; + _ => Masc + } ; + + conjAgr : Agr -> Agr -> Agr = \a,b -> { + g = conjGender a.g b.g ; + n = conjNumber a.n b.n ; + p = conjPerson a.p b.p + } ; + +--Conjuctions +conjThan : Str = "decât" ; +conjThat : Str = "că" ; + + } diff --git a/lib/src/romanian/ConjunctionRon.gf b/lib/src/romanian/ConjunctionRon.gf new file mode 100644 index 000000000..bb41e9560 --- /dev/null +++ b/lib/src/romanian/ConjunctionRon.gf @@ -0,0 +1,59 @@ +incomplete concrete ConjunctionRon of Conjunction = + CatRon ** open ResRon, Coordination, Prelude in { + + flags optimize=all_subs ; + + lin + + ConjS conj ss = conjunctDistrTable Mood conj ss ; + + ConjAdv conj ss = conjunctDistrSS conj ss ; + + ConjNP conj ss = heavyNP (conjunctDistrTable NCase conj ss ** { + a = {g = ss.a.g ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} ; + hasClit = ss.hasClit; + ss = "" ---- fix this !!!! + }) ; + + + ConjAP conj ss = conjunctDistrTable AForm conj ss ** { + isPre = ss.isPre + } ; + + ConjRS conj ss = conjunctDistrTable2 Mood Agr conj ss ** { + c = ss.c + } ; + + +-- These fun's are generated from the list cat's. + + BaseS = twoTable Mood ; + ConsS = consrTable Mood comma ; + BaseAdv = twoSS ; + ConsAdv = consrSS comma ; + BaseNP x y = { + s1 = \\c => (x.s ! c).comp ; + s2 = \\c => (y.s ! c).comp ; + a = conjAgr x.a y.a; + hasClit = andB x.hasClit y.hasClit + } ; + ConsNP x xs = { + s1 = \\c => (x.s ! c).comp ++ comma ++ xs.s1 ! c ; ----e (conjunctCase c) ; + s2 = \\c => xs.s2 ! c ; ----e (conjunctCase c) ; + a = conjAgr x.a xs.a ; + hasClit = andB xs.hasClit x.hasClit + } ; + + BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre} ; + ConsAP xs x = consrTable AForm comma xs x ** {isPre = andB xs.isPre x.isPre} ; + BaseRS x y = twoTable2 Mood Agr x y ** {c = y.c} ; + ConsRS xs x = consrTable2 Mood Agr comma xs x ** {c = xs.c} ; + + lincat + [S] = {s1,s2 : Mood => Str} ; + [Adv] = {s1,s2 : Str} ; + [NP] = {s1,s2 : NCase => Str ; a : Agr; hasClit : Bool} ; + [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; + [RS] = {s1,s2 : Mood => Agr => Str ; c : NCase} ; + +}; diff --git a/lib/src/romanian/GrammarRon.gf b/lib/src/romanian/GrammarRon.gf index 43460e8f7..2a99e7980 100644 --- a/lib/src/romanian/GrammarRon.gf +++ b/lib/src/romanian/GrammarRon.gf @@ -1,7 +1,20 @@ --# -path=.:../romance:../abstract:../common:prelude concrete GrammarRon of Grammar = - NumeralRon + NounRon, + VerbRon, + AdjectiveRon, + AdverbRon, + NumeralRon, + SentenceRon, + IdiomRon, + QuestionRon, + RelativeRon, + ConjunctionRon, + PhraseRon, + TextX - [Temp,TTAnt,Tense,TPres,TPast,TFut,TCond], Coordination, + Prelude, MorphoRon, BeschRon, + StructuralRon ** { flags startcat = Phr ; unlexer = text ; lexer = text ; diff --git a/lib/src/romanian/IdiomRon.gf b/lib/src/romanian/IdiomRon.gf new file mode 100644 index 000000000..444831390 --- /dev/null +++ b/lib/src/romanian/IdiomRon.gf @@ -0,0 +1,44 @@ +incomplete concrete IdiomRon of Idiom = +-- CatRon ** open (P = ParamX), MorphoRon, ParadigmsRon,Prelude +CatRon ** open Prelude, ResRon +in { + + flags optimize=all_subs ; + + + + lin + ImpersCl vp = mkClause "" True (agrP3 Masc Sg) vp ; + GenericCl vp = mkClause "" True (agrP3 Masc Sg) vp ; -- an exact correspondent does not exist ! + + ExistNP np = + mkClause "" True np.a (insertSimpObj (\\ag => (np.s ! No ).comp) (UseV copula)) ; +-- v_besch20 "exista" + + ExistIP ip = { + s = \\t,a,p,_ => + ip.s ! No ++ + (mkClause "" True (agrP3 (ip.a.g) (ip.a.n)) + (UseV copula)).s + ! DDir ! t ! a ! p ! Indic } ; + + CleftNP np rs = mkClause "" True np.a + (insertSimpObj (\\_ => rs.s ! Indic ! np.a) + (insertSimpObj (\\_ => (np.s ! rs.c).comp) (predV copula))) ; +--need adverb for + CleftAdv ad s = mkClause "" True (agrP3 Masc Sg) + (insertSimpObj (\\_ => conjThat ++ s.s ! Indic) + (insertSimpObj (\\_ => ad.s) (predV copula))) ; + + + ProgrVP vp = vp; -- for the moment, since there is no particular way to express continuous action, except for the imperfect, which wouldn't work for all tenses +{- + ImpPl1 vpr = let vp = useVP vpr in {s = + (mkImperative False P1 vp).s ! Pos ! {n = Pl ; g = Masc} --- fem + } ; +-- insert clitics here also +-} + +} + + diff --git a/lib/src/romanian/LangRon.gf b/lib/src/romanian/LangRon.gf index 9663cb5d1..304b0c87d 100644 --- a/lib/src/romanian/LangRon.gf +++ b/lib/src/romanian/LangRon.gf @@ -1,4 +1,4 @@ ---# -path=.:../romance:../abstract:../common +--# -path=.:../abstract:../common:../prelude concrete LangRon of Lang = GrammarRon, diff --git a/lib/src/romanian/LexiconRon.gf b/lib/src/romanian/LexiconRon.gf index f5c643364..6fd3b198e 100644 --- a/lib/src/romanian/LexiconRon.gf +++ b/lib/src/romanian/LexiconRon.gf @@ -1,365 +1,366 @@ ---# -path=.:../romance:../common:../abstract:../../prelude - -concrete LexiconRon of Lexicon = CatRon ** - open ParadigmsRon,BeschRon,MorphoRon in { - -flags - optimize=values; coding=cp1250; - -lin - airplane_N = mkN "avion" ; - answer_V2S = mkV2S (mkV "răspunde") (noPrep Da) ; - apartment_N = mkN "apartament"; - apple_N = mkN "măr"; - art_N = mkN "artă" ; - ask_V2Q = mkV2Q (v_besch29 "întreba") (noPrep Ac) ; - baby_N = mkAnim (mkN "bebeluș" masculine) ; - bad_A = mkA "rău" "rea" "răi" "rele" ; - bank_N = mkN "bancă" "bănci" ; - beautiful_A = mkRMut "frumos" ; - become_VA = mkVA (v_besch136 "deveni") ; - beer_N = mkN "bere" ; - beg_V2V = mkV2V (v_besch48 "ruga") (noPrep Ac) (noPrep Da) ; - big_A = mkA "mare" ; - bike_N = mkN "bicicletă" ; - bird_N = mkN "pasăre" "păsări" ; - black_A = mkRMut "negru" ; - blue_A = mkA "albastru" ; - boat_N = mkN "vapor" neuter ; - book_N = mkN "carte" "cărți" ; - boot_N = mkN "cizmă" ; - boss_N = mkAnim (mkN "șef" masculine) ; - boy_N = mkAnim (mkN "băiat" "băieți") ; - bread_N = mkN "pâine"; - break_V2 = dirV2 (v_besch97 "sparge") ; - broad_A = mkA "larg" ; - brother_N2 = mkN2 (mkAnim(mkN "frate" masculine)) (noPrep Ge) ; - brown_A = invarA "maro" ; - butter_N = mkNR "unt"; - buy_V2 = dirV2 (v_besch35 "cumpăra"); - camera_N = compN (mkN "aparat" neuter) ["foto"] ; - cap_N = mkN "șapcă" "șepci" ; - car_N = mkN "mașină" ; - carpet_N = mkN "covor" neuter ; - cat_N = mkN "pisică" ; - ceiling_N = mkN "plafon" ; - chair_N = mkN "scaun" ; - cheese_N = mkN "brânză" "brânzeturi" "brânze" ; - child_N = mkAnim (mkN "copil" "copii" ) ; - church_N = mkN "biserică" ; - city_N = mkN "oraș" ; - clean_A = mkA "curat" ; - clever_A = mkRMut "deștept" ; - close_V2 = dirV2 (mkV "închide") ; - coat_N = mkN "haină" ; - cold_A = mkA "rece" ; - come_V = v_besch136 "veni" ; - computer_N = mkN "calculator" neuter ; - country_N = mkN "țară" "țări" ; - cousin_N = mkAnim (mkN "văr" masculine) ; - cow_N = mkN "vacă" "vaci" ; - die_V = v_besch129 "muri" ; - dirty_A = mkA "murdar" ; - distance_N3 = mkN3 (mkN "distanță") (mkPrep "de la" Ac) (mkPrep "la" Ac) ; - doctor_N = mkAnim (mkN "doctor") ; - dog_N = mkN "câine" masculine ; - door_N = mkN "ușă" "uși" ; - drink_V2 = dirV2 (v_besch73 "bea") ; - easy_A2V = mkA2V (mkRMut "ușor") (noPrep Ac) (noPrep Ac) ; - eat_V2 = dirV2 (v_besch52 "mânca") ; - empty_A = mkSMut "gol" ; - enemy_N = mkAnim (mkN "dușman" masculine) ; - factory_N = mkN "fabrică" ; - father_N2 = mkN2 (mkN "tată" "tați" masculine) (noPrep Ge); - fear_VS = mkVS (v_besch100 "teme") ; - fear_V2 = mmkV2 (mkRV (mkV100 "teme")) (mkPrep "de" Ac) ; - find_V2 = dirV2 (mkV "găsi") ; - fish_N = mkN "pește" masculine ; - floor_N = mkN "podea" ; - forget_V2 = dirV2 (v_besch18 "uita") ; - fridge_N = mkN "frigider" ; - friend_N = mkAnim (mkN "prieten") ; - fruit_N = mkN "fruct" ; - fun_AV = mkAV (mkA "distractiv") (noPrep Ac) ; - garden_N = mkN "gradină" ; - girl_N = mkAnim (mkN "fată" "fete") ; - glove_N = mkN "mănușă" "mănuși" ; - gold_N = mkNR "aur" ; -good_A = mkA "bun" "bună" "buni" "bune" "bine" ; -go_V = v_besch90 "merge" ; -green_A = mkA "verde" ; -harbour_N = mkNR "port" ; -hate_V2 = dirV2 (mkV "urî") ; -hat_N = mkN "pălărie" ; -hear_V2 = dirV2 (v_besch127 "auzi") ; -hill_N = mkNR "deal" ; -hope_VS = mkVS (v_besch17 "spera") ; -horse_N = mkN "cal" "cai" ; -hot_A = mkA "cald" ; -house_N = mkN "casă" ; -important_A = mkA "important" ; -industry_N = mkN "industrie" ; -iron_N = mkN "fier" masculine ; -king_N = mkAnim (mkN "rege" masculine) ; -know_V2 = dirV2 (v_besch122 "ști") ; -know_VS = mkVS (v_besch109 "cunoaște") ; -lake_N = mkNR "lac" ; -lamp_N = mkN "lampă" "lămpi" ; -learn_V2 = dirV2(v_besch45 "învăța") ; -leather_N = mkN "piele" "piei" ; -leave_V2 = dirV2 (mkV "părăsi") ; -like_V2 = dirV2 (v_besch71 "plăcea") ; -listen_V2 = dirV2 (v_besch18 "asculta") ; -live_V = mkV "trăi" ; -long_A = mkA "lung" ; -lose_V2 = dirV2 (v_besch113 "pierde") ; -love_N = mkN "iubire" ; -love_V2 = dirV2 (mkV "iubi") ; -man_N = mkAnim (mkN "om" "oameni") ; -married_A2 = mkA2 (mkA "căsătorit") (mkPrep "cu" Ac) ; -meat_N = mkN "carne" "cărnuri" "cărni" ; -milk_N = mkN "lapte" masculine ; -moon_N = mkN "lună" "luni" ; -mother_N2 = mkN2 (chV "mamă" (mkAnim (mkN "mamă"))) (noPrep Ge) ; -mountain_N = mkN "munte" masculine ; -music_N = mkN "muzică" ; -narrow_A = mkA "îngust" ; -new_A = mkA "nou" "nouă" "noi" "noi" ; -newspaper_N = mkN "ziar" ; -oil_N = mkNR "ulei" ; -old_A = mkA "vechi" "veche" "vechi" "vechi" ; -open_V2 = dirV2 (mkV "deshide") ; -paint_V2A = mkV2A (mkV "picta") (noPrep Ac) (mkPrep "cu" Ac) ; -paper_N = mkN "hârtie" ; -paris_PN = mkPN "Paris" ; -peace_N = mkN "pace" "păci" ; -pen_N = mkNR "stilou" ; -planet_N = mkN "planetă" ; -plastic_N = mkN "plastic" ; -play_V2 = dirV2 (v_besch48 "juca") ; -policeman_N = mkAnim (mkN "polițist" masculine) ; -priest_N = mkAnim (mkN "preot" masculine) ; -probable_AS = mkAS (mkA "probabil") ; -queen_N = mkAnim (mkN "regină" "regine") ; -radio_N = mkNR "radio"; ---rain_V0 = mkV0 (v_besch54 "ploua") ; -read_V2 = dirV2 (mkV "citi") ; -red_A = mkA "roșu" "roșie" "roșii" "roșii" ; -religion_N = mkN "religie" ; -restaurant_N = mkN "restaurant" ; -river_N = mkN "fluviu" masculine ; -rock_N = mkN "piatră" "pietre" ; -roof_N = mkNR "acoperiș"; -rubber_N = mkNR "cauciuc"; - run_V = v_besch126 "fugi" ; - say_VS = mkVS (v_besch76 "spune") ; - school_N = mkN "școala" "școli" ; - science_N = mkN "știință" ; - sea_N = mkN "mare" "mări" ; - seek_V2 = dirV2 (v_besch24 "căuta") ; - see_V2 = dirV2 (v_besch67 "vedea") ; - sell_V3 = dirV3 (v_besch112 "vinde") ; - send_V3 = dirV3 (v_besch82 "trimite") ; - sheep_N = mkN "oaie" ; - ship_N = mkN "vapor" neuter ; - shirt_N = mkN "cămașă" "cămăși" ; - shoe_N = mkN "pantof" masculine ; - shop_N = mkN "magazin" ; - short_A = mkA "scurt" ; - silver_N = mkN "argint" masculine ; - sister_N = mkAnim (mkN "soră" "surori") ; - sleep_V = v_besch128 "dormi" ; - small_A = mkA "mic" "mică" "mici" "mici" ; - snake_N = mkN "șarpe" "șerpi" masculine ; - sock_N = mkN "șosetă" ; - speak_V2 = dirV2 (mkV "vorbi") ; - star_N = mkN "stea" ; - steel_N = mkNR "oțel" ; - stone_N = mkN "piatră" "pietre" ; - stove_N = mkN "sobă" ; - student_N = mkAnim (mkN "student" masculine) ; - stupid_A = mkA "stupid" ; - sun_N = mkN "soare" "sori" masculine ; - switch8off_V2 = dirV2 (v_besch77 "stinge") ; - switch8on_V2 = dirV2 (mkV "aprinde") ; - table_N = mkN "masă" "mese" ; - talk_V3 = mmkV3 (mkV "vorbi") (noPrep Ac) (mkPrep "cu" Ac) ; - teacher_N = mkAnim (mkN "profesor") ; - teach_V2 = dirV2 (v_besch57 "preda") ; - television_N = mkN "televiziune" ; - thick_A = mkRMut "gros" ; - thin_A = mkA "subțire" ; - train_N = mkNR "tren"; - travel_V = mkV "călători" ; - tree_N = mkN "copac" masculine ; - --trousers_N = mkN "pantalon" masculine ; - ugly_A = mkA "urât" ; - understand_V2 = dirV2 (v_besch83 "înțelege") ; - university_N = mkN "universitate" ; - village_N = mkN "sat" neuter ; - wait_V2 = dirV2 (v_besch30 "aștepta") ; - walk_V = v_besch90 "merge" ; - warm_A = mkA "calduț" ; - war_N = mkN "război" neuter ; - watch_V2 = dirV2 (mkV "privi") ; - water_N = mkN "apă" ; - white_A = mkA "alb" ; - window_N = mkN "fereastră" "ferestre" ; - wine_N = mkNR "vin" ; - win_V2 = dirV2 (v_besch17 "câștiga") ; - woman_N = chV "femeie" (mkAnim (mkN "femeie")) ; - wonder_VQ = mkVQ (mkRV (regV "minuna")) ; - wood_N = mkN "lemn" ; - write_V2 = dirV2 (v_besch117 "scrie") ; - yellow_A = mkA "galben" ; - young_A = mkA "tânăr" "tânără" "tineri" "tinere" "tinerește" ; - - do_V2 = dirV2 (v_besch115 "face") ; - now_Adv = mkAdv "acum" ; - already_Adv = mkAdv "deja" ; - song_N = mkN "cântec" ; - add_V3 = dirV3 (v_besch23 "adăuga") ; - number_N = mkN "număr" ; - put_V2 = dirV2 (v_besch76 "pune") ; - stop_V = mkRV (regV "opri") ; - jump_V = v_besch118 "sări" ; - - left_Ord = mkOrd (regA "stâng") ; - right_Ord = mkOrd (mkRMut "drept") ; -far_Adv = mkAdv "departe" ; -correct_A = mkA "corect" ; -dry_A = mkA "uscat" ; -dull_A = mkA "monoton"; -full_A = mkA "plin" ; -heavy_A = mkA "greu" "grea" "grei" "grele"; -near_A = mkA "apropiat" ; -rotten_A = mkA "stricat" ; -round_A = mkA "rotund" ; -sharp_A = mkA "ascuțit" ; -smooth_A = mkA "neted" ; -straight_A = mkRMut "drept" ; -wet_A = mkA "ud" ; -wide_A = mkA "adânc" ; - animal_N = mkN "animal" ; - ashes_N = mkN "cenușă" "cenuși" ; - back_N = mkN "spate" "spate" neuter ; - bark_N = mkNR "lătrat" ; - belly_N = mkN "pântec" ; - blood_N = mkNR "sânge" ; - bone_N = mkN "os" ; - breast_N = mkNR "piept" ; - cloud_N = mkN "nor" ; - day_N = mkN "zi" feminine ; - dust_N = mkNR "praf" ; - ear_N = mkN "ureche" ; - earth_N = mkNR "pământ" ; - egg_N = mkN "ou" "ouă" neuter ; - eye_N = mkN "ochi" masculine ; - fat_N = mkN "grăsime" ; - feather_N = mkN "pană" "pene" ; - fingernail_N = mkN "unghie" ; - fire_N = mkNR "foc" ; - flower_N = mkN "floare" "flori" ; - fog_N = mkN "ceață" "cețuri" "ceți" ; - foot_N = mkN "picior" neuter ; - forest_N = mkN "pădure" ; - grass_N = mkN "iarbă" "ierburi" "ierbi" ; - guts_N = mkN "intestin" ; - hair_N = mkN "păr" masculine ; - hand_N = mkN "mână" "mâini" ; - head_N = mkN "cap" "capete" neuter ; - heart_N = mkN "inimă" ; - horn_N = mkNR "corn" ; - husband_N = mkAnim (mkN "soț" masculine) ; - ice_N = mkN "gheață" "ghețuri" "gheți" ; - knee_N = mkN "genunchi" masculine ; - leaf_N = mkN "frunză" ; - leg_N = mkN "picior" neuter ; - liver_N = mkN "ficat" ; - louse_N = mkN "păduche" masculine ; - mouth_N = mkN "gură" ; - name_N = mkN "nume" "nume" neuter ; - neck_N = mkNR "gât" ; - night_N = mkN "noapte" "nopți" ; - nose_N = mkNR "nas" ; - person_N = mkAnim (mkN "persoană") ; - rain_N = mkN "ploaie" ; - road_N = mkNR "drum" ; - root_N = mkN "rădăcină" ; - rope_N = mkN "sfoară" "sfori" ; - salt_N = mkN "sare" "săruri" "sări"; - sand_N = mkNR "nisip" ; - seed_N = mkN "sămânță" "semințe" ; - skin_N = mkN "piele" "pieli" "piei" ; - sky_N = mkNR "cer" ; - smoke_N = mkNR "fum" ; - snow_N = mkN "zăpadă" "zăpezi" ; - stick_N = mkN "băț" ; - tail_N = mkN "coadă" "cozi" ; -- mkN "coadă" feminine - certain kind of tails - tongue_N = mkN "limbă" "limbi"; - tooth_N = mkN "dinte" masculine ; - wife_N = mkAnim (mkN "soție"); - wind_N = mkNR "vânt" ; - wing_N = mkN "aripă" ; - worm_N = mkN "vierme" masculine; - year_N = mkN "an" masculine; - bite_V2 = dirV2 (v_besch22 "mușca") ; - blow_V = v_besch55 "sufla" ; - breathe_V = v_besch17 "respira" ; - burn_V = mkV "arde" ; - count_V2 = dirV2 (v_besch35 "număra" ) ; - cut_V2 = dirV2(v_besch14 "tăia") ; - dig_V = v_besch23 "săpa" ; - fall_V = v_besch65 "cădea" ; - fight_V2 = dirV2 (v_besch18 "lupta") ; - float_V = mkV "pluti" ; - flow_V = v_besch89 "curge" ; - fly_V = v_besch48 "zbura" ; - freeze_V = v_besch29 "îngheța" ; - give_V3 = dirV3 (v_besch60 "da") ; - hit_V2 = dirV2 (mkV "lovi") ; - hunt_V2 = dirV2 (mkV "vâna") ; - kill_V2 = dirV2 (v_besch81 "ucide") ; - laugh_V = v_besch91 "râde" ; - lie_V = mkRV (regV "întinde") ; - play_V = mkNV (mkV48 "juca") ; - pull_V2 = dirV2 (v_besch78 "trage") ; - push_V2 = dirV2 (v_besch77 "împinge") ; - rub_V2 = dirV2 (v_besch29 "freca") ; - scratch_V2 = dirV2 (v_besch23 "scărpina") ; - sew_V = v_besch110 "coase" ; - sing_V = v_besch18 "cânta" ; - sit_V = mkRV (mkV41 "așeza") ; - smell_V = v_besch133 "mirosi" ; - spit_V = v_besch17 "scuipa" ; - squeeze_V2 = dirV2 (v_besch88 "stoarce") ; - stab_V2 = dirV2 (v_besch12 "înjunghia") ; - stand_V = v_besch17 "ridica" ; - suck_V2 = dirV2 (v_besch95 "suge") ; - swell_V = v_besch55 "umfla" ; - swim_V = v_besch32 "înota" ; - think_V = mkV "gândi" ; - throw_V2 = dirV2 (v_besch17 "arunca") ; - tie_V2 = dirV2 (v_besch29 "lega") ; - turn_V = v_besch88 "întoarce" ; - vomit_V = v_besch18 "vomita" ; - wash_V2 = dirV2 (v_besch45 "spăla") ; - wipe_V2 = dirV2 (v_besch83 "șterge") ; - - hold_V2 = dirV2 (v_besch108 "ține") ; - split_V2 = dirV2 (v_besch134 "despărți"); - -- sit_V = v_besch41 "așeza" ; - -grammar_N = mkN "gramatică" ; -language_N = mkN "limbă" "limbi" ; -rule_N = mkN "regulă" "reguli" ; - -john_PN = mkPN "Ion" ; -question_N = mkN "întrebare" ; -ready_A = mkA "pregătit" ; -reason_N = mkN "motiv" ; -today_Adv = mkAdv "astăzi" ; -uncertain_A = mkA "nesigur" ; - - -} ; +--# -path=.:../romance:../common:../abstract:../../prelude + +concrete LexiconRon of Lexicon = CatRon ** + open ParadigmsRon,MorphoRon,BeschRon in { + +flags + optimize=values ; + +lin + airplane_N = mkN "avion" ; + answer_V2S = mkV2S (mkV "răspunde") (noPrep Da) ; + apartment_N = mkN "apartament"; + apple_N = mkN "măr"; + art_N = mkN "artă" ; + ask_V2Q = mkV2Q (v_besch29 "întreba") (noPrep Ac) ; + baby_N = mkAnim (mkN "bebeluș" masculine) ; + bad_A = mkA "rău" "rea" "răi" "rele" ; + bank_N = mkN "bancă" "bănci" ; + beautiful_A = mkRMut "frumos" ; + become_VA = mkVA (v_besch136 "deveni") ; + beer_N = mkN "bere" ; + beg_V2V = mkV2V (v_besch48 "ruga") (noPrep Ac) (noPrep Da) ; + big_A = mkA "mare" ; + bike_N = mkN "bicicletă" ; + bird_N = mkN "pasăre" "păsări" ; + black_A = mkRMut "negru" ; + blue_A = mkA "albastru" ; + boat_N = mkN "vapor" neuter ; + book_N = mkN "carte" "cărți" ; + boot_N = mkN "cizmă" ; + boss_N = mkAnim (mkN "șef" masculine) ; + boy_N = mkAnim (mkN "băiat" "băieți") ; + bread_N = mkN "pâine"; + break_V2 = dirV2 (v_besch97 "sparge") ; + broad_A = mkA "larg" ; + brother_N2 = mkN2 (mkAnim(mkN "frate" masculine)) (noPrep Ge) ; + brown_A = invarA "maro" ; + butter_N = mkNR "unt"; + buy_V2 = dirV2 (v_besch35 "cumpăra"); + camera_N = compN (mkN "aparat" neuter) ["foto"] ; + cap_N = mkN "șapcă" "șepci" ; + car_N = mkN "mașină" ; + carpet_N = mkN "covor" neuter ; + cat_N = mkN "pisică" ; + ceiling_N = mkN "plafon" ; + chair_N = mkN "scaun" ; + cheese_N = mkN "brânză" "brânzeturi" "brânze" ; + child_N = mkAnim (mkN "copil" "copii" ) ; + church_N = mkN "biserică" ; + city_N = mkN "oraș" ; + clean_A = mkA "curat" ; + clever_A = mkRMut "deștept" ; + close_V2 = dirV2 (mkV "închide") ; + coat_N = mkN "haină" ; + cold_A = mkA "rece" ; + come_V = v_besch136 "veni" ; + computer_N = mkN "calculator" neuter ; + country_N = mkN "țară" "țări" ; + cousin_N = mkAnim (mkN "văr" masculine) ; + cow_N = mkN "vacă" "vaci" ; + die_V = v_besch129 "muri" ; + dirty_A = mkA "murdar" ; + distance_N3 = mkN3 (mkN "distanță") (mkPrep "de la" Ac) (mkPrep "la" Ac) ; + doctor_N = mkAnim (mkN "doctor") ; + dog_N = mkN "câine" masculine ; + door_N = mkN "ușă" "uși" ; + drink_V2 = dirV2 (v_besch73 "bea") ; + easy_A2V = mkA2V (mkRMut "ușor") (noPrep Ac) (noPrep Ac) ; + eat_V2 = dirV2 (v_besch52 "mânca") ; + empty_A = mkSMut "gol" ; + enemy_N = mkAnim (mkN "dușman" masculine) ; + factory_N = mkN "fabrică" ; + father_N2 = mkN2 (mkN "tată" "tați" masculine) (noPrep Ge); + fear_VS = mkVS (v_besch100 "teme") ; + fear_V2 = mmkV2 (mkRVAcc (mkV100 "teme")) (mkPrep "de" Ac) ; + find_V2 = dirV2 (mkV "găsi") ; + fish_N = mkN "pește" masculine ; + floor_N = mkN "podea" ; + forget_V2 = dirV2 (v_besch18 "uita") ; + fridge_N = mkN "frigider" ; + friend_N = mkAnim (mkN "prieten") ; + fruit_N = mkN "fruct" ; + fun_AV = mkAV (mkA "distractiv") (noPrep Ac) ; + garden_N = mkN "gradină" ; + girl_N = mkAnim (mkN "fată" "fete") ; + glove_N = mkN "mănușă" "mănuși" ; + gold_N = mkNR "aur" ; +good_A = mkA "bun" "bună" "buni" "bune" "bine" ; +go_V = v_besch90 "merge" ; +green_A = mkA "verde" ; +harbour_N = mkNR "port" ; +hate_V2 = dirV2 (mkV "urî") ; +hat_N = mkN "pălărie" ; +have_V2 = dirV2 (v_have) ; +hear_V2 = dirV2 (v_besch127 "auzi") ; +hill_N = mkNR "deal" ; +hope_VS = mkVS (v_besch17 "spera") ; +horse_N = mkN "cal" "cai" ; +hot_A = mkA "cald" ; +house_N = mkN "casă" ; +important_A = mkA "important" ; +industry_N = mkN "industrie" ; +iron_N = mkN "fier" masculine ; +king_N = mkAnim (mkN "rege" masculine) ; +know_V2 = dirV2 (v_besch122 "ști") ; +know_VS = mkVS (v_besch109 "cunoaște") ; +lake_N = mkNR "lac" ; +lamp_N = mkN "lampă" "lămpi" ; +learn_V2 = dirV2(v_besch45 "învăța") ; +leather_N = mkN "piele" "piei" ; +leave_V2 = dirV2 (mkV "părăsi") ; +like_V2 = dirV2 (v_besch71 "plăcea") ; +listen_V2 = dirV2 (v_besch18 "asculta") ; +live_V = mkV "trăi" ; +long_A = mkA "lung" ; +lose_V2 = dirV2 (v_besch113 "pierde") ; +love_N = mkN "iubire" ; +love_V2 = dirV2 (mkV "iubi") ; +man_N = mkAnim (mkN "om" "oameni") ; +married_A2 = mkA2 (mkA "căsătorit") (mkPrep "cu" Ac) ; +meat_N = mkN "carne" "cărnuri" "cărni" ; +milk_N = mkN "lapte" masculine ; +moon_N = mkN "lună" "luni" ; +mother_N2 = mkN2 (chV "mamă" (mkAnim (mkN "mamă"))) (noPrep Ge) ; +mountain_N = mkN "munte" masculine ; +music_N = mkN "muzică" ; +narrow_A = mkA "îngust" ; +new_A = mkA "nou" "nouă" "noi" "noi" ; +newspaper_N = mkN "ziar" ; +oil_N = mkNR "ulei" ; +old_A = mkA "vechi" "veche" "vechi" "vechi" ; +open_V2 = dirV2 (mkV "deshide") ; +paint_V2A = mkV2A (mkV "picta") (noPrep Ac) (noPrep Ac) ; +paper_N = mkN "hârtie" ; +paris_PN = mkInAn(mkPN "Paris") ; +peace_N = mkN "pace" "păci" ; +pen_N = mkNR "stilou" ; +planet_N = mkN "planetă" ; +plastic_N = mkN "plastic" ; +play_V2 = dirV2 (v_besch48 "juca") ; +policeman_N = mkAnim (mkN "polițist" masculine) ; +priest_N = mkAnim (mkN "preot" masculine) ; +probable_AS = mkAS (mkA "probabil") ; +queen_N = mkAnim (mkN "regină" "regine") ; +radio_N = mkNR "radio"; +rain_V0 = mkV0 (v_besch54 "ploua") ; +read_V2 = dirV2 (mkV "citi") ; +red_A = mkA "roșu" "roșie" "roșii" "roșii" ; +religion_N = mkN "religie" ; +restaurant_N = mkN "restaurant" ; +river_N = mkN "fluviu" masculine ; +rock_N = mkN "piatră" "pietre" ; +roof_N = mkNR "acoperiș"; +rubber_N = mkNR "cauciuc"; + run_V = v_besch126 "fugi" ; + say_VS = mkVS (v_besch76 "spune") ; + school_N = mkN "școala" "școli" ; + science_N = mkN "știință" ; + sea_N = mkN "mare" "mări" ; + seek_V2 = dirV2 (v_besch24 "căuta") ; + see_V2 = dirV2 (v_besch67 "vedea") ; + sell_V3 = dirV3 (v_besch112 "vinde") ; + send_V3 = dirV3 (v_besch82 "trimite") ; + sheep_N = mkN "oaie" ; + ship_N = mkN "vapor" neuter ; + shirt_N = mkN "cămașă" "cămăși" ; + shoe_N = mkN "pantof" masculine ; + shop_N = mkN "magazin" ; + short_A = mkA "scurt" ; + silver_N = mkN "argint" masculine ; + sister_N = mkAnim (mkN "soră" "surori") ; + sleep_V = v_besch128 "dormi" ; + small_A = mkA "mic" "mică" "mici" "mici" ; + snake_N = mkN "șarpe" "șerpi" masculine ; + sock_N = mkN "șosetă" ; + speak_V2 = dirV2 (mkV "vorbi") ; + star_N = mkN "stea" ; + steel_N = mkNR "oțel" ; + stone_N = mkN "piatră" "pietre" ; + stove_N = mkN "sobă" ; + student_N = mkAnim (mkN "student" masculine) ; + stupid_A = mkA "stupid" ; + sun_N = mkN "soare" "sori" masculine ; + switch8off_V2 = dirV2 (v_besch77 "stinge") ; + switch8on_V2 = dirV2 (mkV "aprinde") ; + table_N = mkN "masă" "mese" ; + talk_V3 = mmkV3 (mkV "vorbi") (mkPrep "cu" Ac) (mkPrep "despre" Ac); + teacher_N = mkAnim (mkN "profesor") ; + teach_V2 = dirV2 (v_besch57 "preda") ; + television_N = mkN "televiziune" ; + thick_A = mkRMut "gros" ; + thin_A = mkA "subțire" ; + train_N = mkNR "tren"; + travel_V = mkV "călători" ; + tree_N = mkN "copac" masculine ; + --trousers_N = mkN "pantalon" masculine ; + ugly_A = mkA "urât" ; + understand_V2 = dirV2 (v_besch83 "înțelege") ; + university_N = mkN "universitate" ; + village_N = mkN "sat" neuter ; + wait_V2 = dirV2 (v_besch30 "aștepta") ; + walk_V = v_besch90 "merge" ; + warm_A = mkA "călduț" "călduță" "călduți" "călduțe" "călduros"; + war_N = mkN "război" neuter ; + watch_V2 = dirV2 (mkV "privi") ; + water_N = mkN "apă" ; + white_A = mkA "alb" ; + window_N = mkN "fereastră" "ferestre" ; + wine_N = mkNR "vin" ; + win_V2 = dirV2 (v_besch17 "câștiga") ; + woman_N = chV "femeie" (mkAnim (mkN "femeie")) ; + wonder_VQ = mkVQ (mkRVAcc (regV "minuna")) ; + wood_N = mkN "lemn" ; + write_V2 = dirV2 (v_besch117 "scrie") ; + yellow_A = mkA "galben" ; + young_A = mkA "tânăr" "tânără" "tineri" "tinere" "tinerește" ; + + do_V2 = dirV2 (v_besch115 "face") ; + now_Adv = mkAdv "acum" ; + already_Adv = mkAdv "deja" ; + song_N = mkN "cântec" ; + add_V3 = dirV3 (v_besch23 "adăuga") ; + number_N = mkN "număr" ; + put_V2 = dirV2 (v_besch76 "pune") ; + stop_V = mkRVAcc (regV "opri") ; + jump_V = v_besch118 "sări" ; + + --left_Ord = mkOrd (regA "stâng") ; + --right_Ord = mkOrd (mkRMut "drept") ; +far_Adv = mkAdv "departe" ; +correct_A = mkA "corect" ; +dry_A = mkA "uscat" ; +dull_A = mkA "monoton"; +full_A = mkA "plin" ; +heavy_A = mkA "greu" "grea" "grei" "grele"; +near_A = mkA "apropiat" ; +rotten_A = mkA "stricat" ; +round_A = mkA "rotund" ; +sharp_A = mkA "ascuțit" ; +smooth_A = mkA "neted" ; +straight_A = mkRMut "drept" ; +wet_A = mkA "ud" ; +wide_A = mkA "adânc" ; + animal_N = mkN "animal" ; + ashes_N = mkN "cenușă" "cenuși" ; + back_N = mkN "spate" "spate" neuter ; + bark_N = mkNR "lătrat" ; + belly_N = mkN "pântec" ; + blood_N = mkNR "sânge" ; + bone_N = mkN "os" ; + breast_N = mkNR "piept" ; + cloud_N = mkN "nor" ; + day_N = mkN "zi" feminine ; + dust_N = mkNR "praf" ; + ear_N = mkN "ureche" ; + earth_N = mkNR "pământ" ; + egg_N = mkN "ou" "ouă" neuter ; + eye_N = mkN "ochi" masculine ; + fat_N = mkN "grăsime" ; + feather_N = mkN "pană" "pene" ; + fingernail_N = mkN "unghie" ; + fire_N = mkNR "foc" ; + flower_N = mkN "floare" "flori" ; + fog_N = mkN "ceață" "cețuri" "ceți" ; + foot_N = mkN "picior" neuter ; + forest_N = mkN "pădure" ; + grass_N = mkN "iarbă" "ierburi" "ierbi" ; + guts_N = mkN "intestin" ; + hair_N = mkN "păr" masculine ; + hand_N = mkN "mână" "mâini" ; + head_N = mkN "cap" "capete" neuter ; + heart_N = mkN "inimă" ; + horn_N = mkNR "corn" ; + husband_N = mkAnim (mkN "soț" masculine) ; + ice_N = mkN "gheață" "ghețuri" "gheți" ; + knee_N = mkN "genunchi" masculine ; + leaf_N = mkN "frunză" ; + leg_N = mkN "picior" neuter ; + liver_N = mkN "ficat" ; + louse_N = mkN "păduche" masculine ; + mouth_N = mkN "gură" ; + name_N = mkN "nume" "nume" neuter ; + neck_N = mkNR "gât" ; + night_N = mkN "noapte" "nopți" ; + nose_N = mkNR "nas" ; + person_N = mkAnim (mkN "persoană") ; + rain_N = mkN "ploaie" ; + road_N = mkNR "drum" ; + root_N = mkN "rădăcină" ; + rope_N = mkN "sfoară" "sfori" ; + salt_N = mkN "sare" "săruri" "sări"; + sand_N = mkNR "nisip" ; + seed_N = mkN "sămânță" "semințe" ; + skin_N = mkN "piele" "pieli" "piei" ; + sky_N = mkNR "cer" ; + smoke_N = mkNR "fum" ; + snow_N = mkN "zăpadă" "zăpezi" ; + stick_N = mkN "băț" ; + tail_N = mkN "coadă" "cozi" ; -- mkN "coadă" feminine - certain kind of tails + tongue_N = mkN "limbă" "limbi"; + tooth_N = mkN "dinte" masculine ; + wife_N = mkAnim (mkN "soție"); + wind_N = mkNR "vânt" ; + wing_N = mkN "aripă" ; + worm_N = mkN "vierme" masculine; + year_N = mkN "an" masculine; + bite_V2 = dirV2 (v_besch22 "mușca") ; + blow_V = v_besch55 "sufla" ; + breathe_V = v_besch17 "respira" ; + burn_V = mkV "arde" ; + count_V2 = dirV2 (v_besch35 "număra" ) ; + cut_V2 = dirV2(v_besch14 "tăia") ; + dig_V = v_besch23 "săpa" ; + fall_V = v_besch65 "cădea" ; + fight_V2 = dirV2 (v_besch18 "lupta") ; + float_V = mkV "pluti" ; + flow_V = v_besch89 "curge" ; + fly_V = v_besch48 "zbura" ; + freeze_V = v_besch29 "îngheța" ; + give_V3 = dirV3 (v_besch60 "da") ; + hit_V2 = dirV2 (mkV "lovi") ; + hunt_V2 = dirV2 (mkV "vâna") ; + kill_V2 = dirV2 (v_besch81 "ucide") ; + laugh_V = v_besch91 "râde" ; + lie_V = mkRVAcc (regV "întinde") ; + play_V = mkNV (mkV48 "juca") ; + pull_V2 = dirV2 (v_besch78 "trage") ; + push_V2 = dirV2 (v_besch77 "împinge") ; + rub_V2 = dirV2 (v_besch29 "freca") ; + scratch_V2 = dirV2 (v_besch23 "scărpina") ; + sew_V = v_besch110 "coase" ; + sing_V = v_besch18 "cânta" ; + sit_V = mkRVAcc (mkV41 "așeza") ; + smell_V = v_besch133 "mirosi" ; + spit_V = v_besch17 "scuipa" ; + squeeze_V2 = dirV2 (v_besch88 "stoarce") ; + stab_V2 = dirV2 (v_besch12 "înjunghia") ; + stand_V = v_besch17 "ridica" ; + suck_V2 = dirV2 (v_besch95 "suge") ; + swell_V = v_besch55 "umfla" ; + swim_V = v_besch32 "înota" ; + think_V = mkV "gândi" ; + throw_V2 = dirV2 (v_besch17 "arunca") ; + tie_V2 = dirV2 (v_besch29 "lega") ; + turn_V = v_besch88 "întoarce" ; + vomit_V = v_besch18 "vomita" ; + wash_V2 = dirV2 (v_besch45 "spăla") ; + wipe_V2 = dirV2 (v_besch83 "șterge") ; + + hold_V2 = dirV2 (v_besch108 "ține") ; + split_V2 = dirV2 (v_besch134 "despărți"); + -- sit_V = v_besch41 "așeza" ; + +grammar_N = mkN "gramatică" ; +language_N = mkN "limbă" "limbi" ; +rule_N = mkN "regulă" "reguli" ; + +john_PN = mkPN "Ion" ; +question_N = mkN "întrebare" ; +ready_A = mkA "pregătit" ; +reason_N = mkN "motiv" ; +today_Adv = mkAdv "astăzi" ; +uncertain_A = mkA "nesigur" ; + + +} ; diff --git a/lib/src/romanian/MorphoRon.gf b/lib/src/romanian/MorphoRon.gf index 2260dfb02..a82a7b177 100644 --- a/lib/src/romanian/MorphoRon.gf +++ b/lib/src/romanian/MorphoRon.gf @@ -1,10 +1,9 @@ --# -path=.:../Romance:../common:../../prelude resource MorphoRon = ResRon ** - open Prelude, Predef in { + open Prelude, Predef in { -flags - optimize=noexpand; coding=cp1250; +flags optimize=noexpand ; --------------------------------------------------------------------------------- ------------------------------ARTICLES------------------------------------------- @@ -20,12 +19,12 @@ case of { => case last bun of { "u" => bun + "l"; "e" => bun + "le"; - "ă" => bun + "a"; + "ă" => init bun + "a"; _ => bun + "ul" }; => case last bun of - {("u"|"e" ) => bun + "lui" ; - _ => bun + "ului" + {("u"|"e"|"ă" ) => bun + "lui" ; + _ => bun + "ului" }; => case bun of { x+"u" => bun + "le"; @@ -68,15 +67,16 @@ case of => "o"; => "o"; => "unei"; => "unei" }; +--Articles --possesive article -- used for Cardinals and for Genitive case -oper artPos : Gender -> Number -> Str = \g,n -> - case of -{ => "al"; - => "ai"; - => "a"; - => "ale" +oper artPos : Gender -> Number -> ACase -> Str = \g,n,c -> + case of +{ => "alui"; => "al"; + => "alor"; => "ai"; + => "alei"; => "a"; + => "ale"; => "ale" }; @@ -93,6 +93,7 @@ oper artDem : Gender -> Number -> ACase -> Str = \g,n,c -> }; + --flexion forms of a noun without article oper artUnf : Str -> Str -> Gender -> Number -> ACase -> Str = \buna,bune,g,n,a -> @@ -222,7 +223,7 @@ mkVocc : Noun -> Str -> Noun = \n -> \vo -> mkInanimate : Noun -> Noun = \n -> {s = table { Sg => \\p,c => case c of - {AVoc => n.s ! Sg ! Indef ! ANomAcc ; + {AVoc => n.s ! Sg ! p ! ANomAcc ; _ => n.s ! Sg ! p ! c }; Pl => \\p, c => n.s ! Pl ! p ! c @@ -540,12 +541,12 @@ mkSpecMut : Str -> Adj = \s -> -- Gerund - 1 form -- 2nd person Singular form for Imperative - 1 form - Verbe : Type = VForm => Str ; + Verbe : Type = { s : VForm => Str}; verbAffixes : Str-> (a,b,c,d: Number => Person => Str) -> Str -> Adj -> Str -> Str -> Verbe = \fi,pres, imperf, pSimple, pPerf, subj, adj, ger, imp -> - table { + let t = table { Inf => fi ; Indi Presn n p => pres ! n ! p ; Indi Imparf n p => imperf ! n ! p; @@ -558,7 +559,8 @@ mkSpecMut : Str -> Adj = \s -> Imper PlP1 => pres ! Pl ! P1 ; Ger => ger ; PPasse g n a d => adj. s ! (AF g n a d) - } ; + } in + {s = t}; -- syntactical verb : @@ -568,22 +570,40 @@ SVerbe : Type = VerbForm => Str ; mkVerb : Verbe -> SVerbe = \vb -> table { - TInf => "a" ++ vb ! Inf ; - TIndi TPresn n p => vb ! (Indi Presn n p) ; - TIndi TImparf n p => vb ! (Indi Imparf n p); - TIndi TPComp n p => pComp ! n ! p ++ vb ! (PPasse Masc Sg Indef ANomAcc) ; - TIndi TPSimple n p => vb ! (Indi PSimple n p) ; - TIndi TPPerfect n p => vb ! (Indi PPerfect n p) ; - TIndi TFutur n p => pFut ! n ! p ++ vb ! Inf ; - TSubjo TSPres n p => "să" ++ vb ! (Subjo SPres n p) ; - TSubjo TSPast n p => "să" ++ "fi" ++ vb ! (PPasse Masc Sg Indef ANomAcc) ; - TCondi n p => pCond ! n ! p ++ vb ! Inf ; - TImper PlP1 => "să" ++ vb ! (Imper PlP1) ; - TImper p => vb ! (Imper p) ; - TGer => vb ! Ger ; - TPPasse g n a d => vb ! (PPasse g n a d) + TInf => "a" ++ vb.s ! Inf ; + TIndi TPresn n p => vb.s ! (Indi Presn n p) ; + TIndi TImparf n p => vb.s ! (Indi Imparf n p); + TIndi TPComp n p => pComp ! n ! p ++ vb.s ! (PPasse Masc Sg Indef ANomAcc) ; + TIndi TPSimple n p => vb.s ! (Indi PSimple n p) ; + TIndi TPPerfect n p => vb.s ! (Indi PPerfect n p) ; + TIndi TFutur n p => pFut ! n ! p ++ vb.s ! Inf ; + TSubjo TSPres n p => "să" ++ vb.s ! (Subjo SPres n p) ; + TSubjo TSPast n p => "să" ++ "fi" ++ vb.s ! (PPasse Masc Sg Indef ANomAcc) ; + TCondi n p => pCond ! n ! p ++ vb.s ! Inf ; + TImper PlP1 => "să" ++ vb.s ! (Imper PlP1) ; + TImper p => vb.s ! (Imper p) ; + TGer => vb.s ! Ger ; + TPPasse g n a d => vb.s ! (PPasse g n a d) }; +mkVerbRefl : Verbe -> SVerbe = \vb -> +table { + TInf => "a" ++ "se" ++ vb.s ! Inf ; + TIndi TPresn n p => pronRefl ! n ! p ++ vb.s ! (Indi Presn n p) ; + TIndi TImparf n p => pronRefl !n ! p ++ vb.s ! (Indi Imparf n p); + TIndi TPComp n p => pronReflClit ! n ! p + "-" + pComp ! n ! p ++ vb.s ! (PPasse Masc Sg Indef ANomAcc) ; + TIndi TPSimple n p => pronRefl ! n ! p ++ vb.s ! (Indi PSimple n p) ; + TIndi TPPerfect n p => pronRefl ! n ! p ++ vb.s ! (Indi PPerfect n p) ; + TIndi TFutur n p => pronRefl ! n ! p ++ pFut ! n ! p ++ vb.s ! Inf ; + TSubjo TSPres n p => "să" ++ pronRefl ! n ! p ++ vb.s ! (Subjo SPres n p) ; + TSubjo TSPast n p => "să" ++ pronRefl ! n ! p ++ "fi" ++ vb.s ! (PPasse Masc Sg Indef ANomAcc) ; + TCondi n p => pronReflClit ! n ! p + "-" + pCond ! n ! p ++ vb.s ! Inf ; + TImper PlP1 => "să" ++ pronRefl ! Pl ! P1 ++ vb.s ! (Imper PlP1) ; + TImper PlP2 => vb.s ! (Imper PlP2) + "-"+ pronRefl ! Pl ! P2 ; + TImper SgP2 => vb.s ! (Imper SgP2) + "-"+ pronRefl ! Sg ! P2 ; + TGer => vb.s ! Ger + "u" + "-" + pronRefl ! Sg ! P3 ; + TPPasse g n a d => vb.s ! (PPasse g n a d) + }; -- auxiliary for Past Composite (to have - as auxiliary) : pComp : Number => Person => Str = table {Sg => table {P1 => "am" ; P2 => "ai" ; P3 => "a"} ; @@ -605,24 +625,6 @@ pCond : Number => Person => Str = table {Sg => table {P1 => "a -- make Reflexive verbe : ? with variants ? -- syntactical category of reflexive verbs based on the primitive forms in Verbe -mkVerbRefl : Verbe -> SVerbe = \vb -> -table { - TInf => "a" ++ "se" ++ vb ! Inf ; - TIndi TPresn n p => pronRefl ! n ! p ++ vb ! (Indi Presn n p) ; - TIndi TImparf n p => pronRefl !n ! p ++ vb ! (Indi Imparf n p); - TIndi TPComp n p => pronReflClit ! n ! p + "-" + pComp ! n ! p ++ vb ! (PPasse Masc Sg Indef ANomAcc) ; - TIndi TPSimple n p => pronRefl ! n ! p ++ vb ! (Indi PSimple n p) ; - TIndi TPPerfect n p => pronRefl ! n ! p ++ vb ! (Indi PPerfect n p) ; - TIndi TFutur n p => pronRefl ! n ! p ++ pFut ! n ! p ++ vb ! Inf ; - TSubjo TSPres n p => "să" ++ pronRefl ! n ! p ++ vb ! (Subjo SPres n p) ; - TSubjo TSPast n p => "să" ++ pronRefl ! n ! p ++ "fi" ++ vb ! (PPasse Masc Sg Indef ANomAcc) ; - TCondi n p => pronReflClit ! n ! p + "-" + pCond ! n ! p ++ vb ! Inf ; - TImper PlP1 => "să" ++ pronRefl ! Pl ! P1 ++ vb ! (Imper PlP1) ; - TImper PlP2 => vb ! (Imper PlP2) + "-"+ pronRefl ! Pl ! P2 ; - TImper SgP2 => vb ! (Imper SgP2) + "-"+ pronRefl ! Sg ! P2 ; - TGer => vb ! Ger + "u" + "-" + pronRefl ! Sg ! P3 ; - TPPasse g n a d => vb ! (PPasse g n a d) - }; -- reflexive pronouns - full form @@ -664,7 +666,7 @@ table {Sg => table {P1 => "m" ; P2 => "te" ; P3 => "s"}; -} -- This is a conversion to the type in $CommonRomance$. - +{- oper vvf : (VerbForm => Str) -> (VF => Str) = \aller -> table { VInfin _ => aller ! TInf ; @@ -679,7 +681,7 @@ oper VPart g n a d => aller ! TPPasse g n a d ; VGer => aller ! TGer } ; - +-} -- vowells in Romanian - used for clitics @@ -1568,8 +1570,8 @@ mkV68 : Str -> Verbe = \putea -> r = root + "o" in verbAffixes vrea (mkTab root (root+"eau") (root+"ei")(root +"ea") (init root + "or") affixPlGr24) - (mkFromAffix r affixSgII affixPlII) (mkFromAffix root affixSgPS3 affixPlPS3) - (mkFromAffix root affixSgPP4 affixPlPP4) (root +"ea") (mkAdjReg (r + "ut")) + (mkFromAffix r affixSgI2 affixPlI2) (mkFromAffix root affixSgPS3 affixPlPS3) + (mkFromAffix root affixSgPP4 affixPlPP4) (root +"ea") (mkAdjReg (root + "ut")) (root + "ând") (root + "ei") ; ---------------------------------------------------------------------- @@ -2424,5 +2426,31 @@ let root = init fi ; in verbAffixes fi pres (mkFromAffix "er" affixSgI affixPlI) ps pp --} -} ; \ No newline at end of file +-} + + + +--------------Reflexive pronouns + +oper reflPron : Number -> Person -> ACase -> Str = +\n,p,c -> case of +{ => "mie" ; => "mine"; + => "ție" ; => "tine"; + <_,P3,AGenDat> => "sieși" ; <_,P3,_> => "sine" ; + => "nouă" ; => "noi" ; + => "vouă" ; => "voi" +}; + +oper reflPronHard : Gender -> Number -> Person -> Str = +\g,n,p -> case of +{ => "însumi" ; => "însămi"; + => "însuți" ; => "însăți"; + => "însuși" ; => "însăși"; + => "înșine" ; => "însene"; + => "înșivă"; => "înseva"; + => "înșiși"; => "înseși" + +}; + + +}; \ No newline at end of file diff --git a/lib/src/romanian/NounRon.gf b/lib/src/romanian/NounRon.gf new file mode 100644 index 000000000..221b999da --- /dev/null +++ b/lib/src/romanian/NounRon.gf @@ -0,0 +1,322 @@ +incomplete concrete NounRon of Noun = + CatRon ** open ResRon,Prelude in { + + flags optimize=all_subs ; + + lin + DetCN det cn = + let + n = det.n; + gg = agrGender cn.g n ; + ag = agrP3 gg n ; + hr = andB (getClit cn.a) det.hasRef ; + st= if_then_else Species det.isDef Def Indef; + rs = if_then_else Species det.hasRef Def Indef + in + {s = \\c => case c of + {Vo => + {comp = det.s ! gg ! No ++ det.size ++ cn.s ! n ! st ! ANomAcc ++ det.post ! gg ! No ; + clit = \\cs => if_then_Str hr ((genCliticsCase ag c).s ! cs) [] }; + _ => {comp = det.s ! gg ! c ++ det.size ++ cn.s ! n ! st ! (convCase c) ++ det.post ! gg ! c ; + clit = \\cs => if_then_Str hr ((genCliticsCase ag c).s ! cs) [] } + }; + a = ag ; + hasClit = hr ; + hasRef = hr ; + isPronoun = False ; + indForm = det.s ! gg ! No ++ det.size ++cn.s ! n ! rs ! ANomAcc + + } ; + + UsePN pn = let + g = pn.g ; + n = pn.n ; + ag = agrP3 g n ; + hc = getClit pn.a + in { + s = \\c => {comp = pn.s ! c ; + clit = \\cs => if_then_Str hc ((genCliticsCase ag c).s ! cs) [] } ; + + a = ag; + hasClit = hc ; + hasRef = hc ; + isPronoun = False ; + indForm = pn.s ! No + } ; + + UsePron p = {s = \\c =>{comp = p.s ! c ; + clit = (genCliticsCase p.a c).s } ; + hasClit = True; + hasRef = True ; + isPronoun = True ; + a = p.a; + indForm = p.s ! Ac + }; + + + + PredetNP pred np = + {s = \\c => {comp = pred.s ! aagr (np.a.g) (np.a.n) ! (convCase c) ++ (np.s ! pred.c).comp ; + clit = (np.s ! c).clit }; + a = np.a ; + hasClit = np.hasClit ; + hasRef = False ; + isPronoun = False ; + indForm = pred.s ! aagr (np.a.g) (np.a.n) ! ANomAcc ++ (np.s ! pred.c).comp + } ; + + + PPartNP np v2 = + heavyNP { + s = \\c => (np.s ! c).comp ++ v2.s ! PPasse np.a.g np.a.n Indef (convCase c); + a = np.a ; + hasClit = np.hasClit; + ss = (np.s ! No).comp ++ v2.s ! PPasse np.a.g np.a.n Indef ANomAcc + } ; + + RelNP np rs = heavyNP { + s = \\c => (np.s ! c).comp ++ rs.s ! Indic ! np.a ; + a = np.a ; + hasClit = False ; + ss = (np.s ! No).comp ++ rs.s ! Indic ! np.a + } ; + + AdvNP np adv = heavyNP { + s = \\c => (np.s ! c).comp ++ adv.s ; + a = np.a ; + hasClit = False; + ss = (np.s ! No).comp ++adv.s ; + } ; + + DetQuantOrd quant num ord = let n = num.n +in { + s = \\g,c => let s1 = if_then_Str quant.isDef (ord.s ! n ! g ! c) (ord.s ! n ! g ! No); + s2 = if_then_Str quant.isPost "" (quant.s ! num.isNum ! n ! g ! (convCase c) ) + + in + s2 ++ s1 ++ num.s ! g ; + sp = \\g,c => let + s1 = if_then_Str quant.isDef (ord.s ! n ! g ! c) (ord.s ! n ! g ! No) ; + s3 = if_then_Str quant.isPost (s1 ++ num.sp ! g ++ quant.sp ! n ! g ! ANomAcc) (quant.sp ! n ! g ! (convCase c) ++ s1 ++ num.sp ! g) + + in + s3 ; + post = \\g,c => let s2 = if_then_Str quant.isPost (quant.s ! num.isNum ! n ! g ! (convCase c)) "" + in + s2 ; + n = num.n ; + isDef = False; + size = num.size; + hasRef = quant.hasRef + + } ; + + DetQuant quant num = let n = num.n ; + needDem = andB quant.isDef num.isNum + in { + s = \\g,c => let s1 = if_then_Str quant.isPost "" (quant.s ! num.isNum ! n ! g ! (convCase c)) ; + s2 = if_then_Str needDem (artDem g n (convCase c)) "" + in s2 ++ s1 ++ num.s ! g ; + sp = \\g,c => let s1 = if_then_Str needDem (artDem g n (convCase c)) "" ; + s2 = if_then_Str quant.isPost (s1 ++ num.sp ! g ++ quant.sp ! n ! g ! ANomAcc) (s1 ++ quant.sp ! n ! g ! (convCase c) ++ num.sp ! g) + in s2 ; + + post = \\g,c => if_then_Str quant.isPost (quant.s ! num.isNum ! n ! g ! (convCase c)) "" ; + n = num.n ; + isDef = case num.isNum of + {True => False ; + _ => quant.isDef }; + size = num.size ; + hasRef = quant.hasRef + } ; + +-- consider fixing for possesive pronouns ! + DetNP det = + let + g = Masc ; + n = det.n + in heavyNP { + s = \\c => det.sp ! g ! c ; + a = agrP3 g n ; + hasClit = True ; + ss = det.sp ! g ! No + } ; + +-- assume that it refers to people + + PossPron p = { + s = \\_,n,g,c => p.poss ! n ! g ; + sp = \\ n,g,c => artPos g n c ++ p.poss ! n ! g ; + isDef = True ; + isPost = True ; + hasRef = True + } ; + + + + + NumSg = {s = \\_ => [] ; sp = \\_ => [] ; isNum = False ; n = Sg ; size = ""} ; + NumPl = {s = \\_ => [] ; sp = \\_ => [] ; isNum = False ; n = Pl ; size = ""} ; + + NumCard n = {s = n.s ; sp = n.sp ; size = getSize n.size ; + isNum = True; n = getNumber n.size + } ; + + NumDigits nu = {s,sp = \\g => nu.s ! NCard g ; + size = nu.n; n = getNumber nu.n }; + OrdDigits nu = {s = table{Sg => \\g,c => nu.s ! NOrd g ; + Pl => \\g,c => [] } ; + isPre = True + }; + + NumNumeral nu = {s = \\g => nu.s ! ANomAcc ! (NCard g) ! Formal ; + sp = \\g => nu.sp ! ANomAcc ! (NCard g) ! Formal ; + n = getNumber nu.size ; size = nu.size }; + + OrdNumeral nu = {s = table {Sg => \\g,c => nu.s ! (convCase c) ! NOrd g ! Formal; + Pl => \\g,c => [] + }; + isPre = True} ; + + AdNum adn num = {s = \\a => adn.s ++ num.s ! a ; + sp = \\a => adn.s ++ num.sp ! a ; + isNum = num.isNum ; n = num.n; size = num.size} ; + + OrdSuperl adj = {s = \\n,g,c => artDem g n (convCase c) ++ more_CAdv.s ++ adj.s ! AF g n Indef (convCase c); + isPre = True; + }; + + DefArt = { + s = \\b,n,g,c => [] ; + sp = \\n,g,c => [] ; + isDef = True ; + isPost = False ; + hasRef = False + } ; + + IndefArt = { + s = \\b,n,g,c => if_then_Str b [] (artUndef g n (convACase c)) ; + sp = table {Sg => table {Masc => table {AGenDat => "unuia"; AVoc => [] ; _ => "unul" }; + Fem => table {AGenDat => "uneia"; AVoc => [] ; _ => "una" } + }; + Pl => table {Masc => table {AGenDat => "unora"; AVoc => "" ; _ => "unii"}; + Fem => table {AGenDat => "unora"; AVoc => "" ; _ => "unele"} + } + }; + isDef = False ; + isPost = False ; + hasRef = False + + } ; + +-- since mass noun phrases are not referential, it's no point keeping track of clitics + + MassNP cn = let + g = case cn.g of + {NFem => Fem ; + _ => Masc} ; + hc = getClit cn.a ; + n = Sg + in { + s = \\c => {comp = cn.s ! n ! Indef ! (convCase c); + clit = \\cs => [] } ; + a = agrP3 g n ; + hasClit = hc ; + hasRef = False ; + isPronoun = False ; + poss = \\g,n => [] ; + indForm = cn.s ! n ! Indef ! ANomAcc + } ; + +-- This is based on record subtyping. + + UseN, UseN2 = \noun -> noun ; + + Use2N3 f = f ; + + Use3N3 f = f ** {c2 = f.c3} ; + + ComplN2 f x = { + s = \\n,sp,c => f.s ! n ! sp ! c ++ appCompl f.c2 x ; + g = f.g ; + a = f.a + } ; + + ComplN3 f x = { + s = \\n,sp,c => f.s ! n ! sp ! c ++ appCompl f.c2 x ; + g = f.g ; + c2 = f.c3; + a = f.a + } ; + + AdjCN ap cn = + let + g = cn.g + in { + s = case ap.isPre of + {True => \\n => table {Def => \\c => case c of + {Voc => ap.s ! (AF (agrGender g n) n Def ANomAcc) ++ cn.s ! n ! Indef ! ANomAcc; + _ => ap.s ! (AF (agrGender g n) n Def c) ++ cn.s ! n ! Indef ! c + }; + Indef => \\c => case c of + {Voc => ap.s ! (AF (agrGender g n) n Indef ANomAcc) ++ cn.s ! n ! Indef ! ANomAcc; + _ => ap.s ! (AF (agrGender g n) n Indef c) ++ cn.s ! n ! Indef ! c}}; + False => \\n => table {Def => \\c => case c of + {Voc => cn.s ! n ! Indef ! ANomAcc ++ ap.s ! (AF (agrGender g n) n Indef ANomAcc); + _ => cn.s ! n ! Def ! c ++ ap.s ! (AF (agrGender g n) n Indef c)}; + Indef => \\c => case c of + {Voc => cn.s ! n ! Indef ! ANomAcc ++ ap.s ! (AF (agrGender g n) n Indef ANomAcc); + _ => cn.s ! n ! Indef ! c ++ ap.s ! (AF (agrGender g n) n Indef c) }} + }; + g = g ; + a = cn.a + } ; + + + RelCN cn rs = { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ rs.s ! Indic ! agrP3 (agrGender cn.g n) n ; + g = cn.g ; + a = cn.a + } ; + + SentCN cn sc = let g = cn.g in { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ sc.s ; + g = g ; + a = cn.a + } ; + + AdvCN cn sc = let g = cn.g in { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ sc.s ; + g = g; + a = cn.a + } ; + + ApposCN cn np = let g = cn.g in { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ (np.s ! No).comp ; + g = g; + a = cn.a + } ; + + +oper +agrGender : NGender -> Number -> Gender = +\ng,n -> +case of +{ => Masc ; + => Fem ; + => Masc ; + _ => Fem +}; + +oper getNumber : Size -> Number = +\n -> case n of +{sg => Sg; + _ => Pl }; + +oper getClit : Animacy -> Bool = +\a -> case a of + {Animate => True; + _ => False}; +}; + + diff --git a/lib/src/romanian/NumeralRon.gf b/lib/src/romanian/NumeralRon.gf index 3cd7907a5..2f30b45da 100644 --- a/lib/src/romanian/NumeralRon.gf +++ b/lib/src/romanian/NumeralRon.gf @@ -1,16 +1,14 @@ concrete NumeralRon of Numeral = CatRon ** open MorphoRon, CatRon, Prelude in { -flags - coding=cp1250; - -param DForm = unit | teen | ten | teen_inf | attr; +param DForm = unit | teen | ten | teen_inf ; +param Place = indep | attr ; lincat Digit = {s : CardOrd => DForm => Str ; size : Size} ; -lincat Sub10 = {s : CardOrd => DForm => Str ; size : Size} ; -lincat Sub100 = {s : CardOrd => NumF => Str ; size : Size} ; -lincat Sub1000 = {s : CardOrd => NumF => Str ; size : Size} ; -lincat Sub1000000 = { s : CardOrd => NumF => Str; size : Size } ; +lincat Sub10 = {s : CardOrd => DForm => Place => Str ; size : Size} ; +lincat Sub100 = {s : CardOrd => NumF => Place => Str ; size : Size} ; +lincat Sub1000 = {s : CardOrd => NumF => Place => Str ; size : Size} ; +lincat Sub1000000 = { s : CardOrd => NumF => Place => Str; size : Size } ; @@ -22,10 +20,9 @@ oper mkOrdinalForm : Str -> Gender -> Str = _ => two+"lea" }; Fem => case two of - { x + "a" => two ; - x + ("ă"|"u") => x +"a"; + { x + ("ă"|"u") => x +"a"; x + "ei" => two + "a"; - x + "ii" => x + "ia" ; + x + "ii" => x + "ia" ; x + "i" => x + "ea"; x + "ie" => x +"a" ; _ => two +"a" @@ -37,41 +34,37 @@ oper mkOrdinal : Str -> Gender -> ACase -> Str = \two, g, fl -> mkOrd (mkOrdinalForm two g) g fl; oper mkOrd : Str -> Gender -> ACase -> Str = -\two, g, fl -> let cc = variants{(artPos g Sg)++ two ; - (artDem g Sg ANomAcc) ++ "de-"+(artPos g Sg) ++ two - } in +\two, g, fl -> let cc = (artPos g Sg ANomAcc) ++ two + in case fl of { ANomAcc => cc ; - AGenDat => (artDem g Sg AGenDat)++"de-"+(artPos g Sg)++ two ; + AGenDat => (artDem g Sg AGenDat)++"de-"+(artPos g Sg ANomAcc)++ two ; AVoc => cc }; oper mkNum : Str -> Str -> Str -> Str -> Digit = - \two -> \twelve -> \twenty -> \doispe -> mkNumVSpc two twelve twelve twenty two doispe doispe (mkOrdinalForm two Masc) (mkOrdinalForm two Fem) two two; + \two -> \twelve -> \twenty -> \doispe -> mkNumVSpc two twelve twelve twenty two doispe doispe (mkOrdinalForm two Masc) (mkOrdinalForm two Fem); -oper mkNumVSpc : Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Digit = - \two -> \twelve -> \douasprezece -> \twenty -> \dou -> \doispe -> \douaspe -> \doilea -> \doua -> - \unu -> \una -> +oper mkNumVSpc : Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Digit = + \two -> \twelve -> \douasprezece -> \twenty -> \dou -> \doispe -> \douaspe -> \doilea -> \doua -> {s = table { NCard Masc => table {unit => two ; teen => twelve ; - ten => twenty ; teen_inf => doispe ; attr => unu + ten => twenty ; teen_inf => doispe } ; NCard Fem => table {unit => dou ; teen => douasprezece ; - ten => twenty ; teen_inf => douaspe ; attr => una + ten => twenty ; teen_inf => douaspe } ; NOrd Masc => table {unit => doilea ; teen => mkOrdinalForm twelve Masc ; ten => mkOrdinalForm twenty Masc ; - teen_inf => mkOrdinalForm doispe Masc ; - attr => mkOrdinalForm unu Masc + teen_inf => mkOrdinalForm doispe Masc } ; NOrd Fem => table {unit => doua ; teen => mkOrdinalForm douasprezece Fem ; ten => mkOrdinalForm twenty Fem ; - teen_inf => mkOrdinalForm douaspe Fem ; - attr => mkOrdinalForm una Fem + teen_inf => mkOrdinalForm douaspe Fem } } ; size = less20 ; @@ -84,11 +77,11 @@ oper regNum : Str -> Digit = oper mkMidF : Str -> Str -> Sub100 = \unsprezece, unspe -> -{ s = table {NCard g => table { Formal => unsprezece ; - Informal => unspe +{ s = table {NCard g => table { Formal => \\_ => unsprezece ; + Informal => \\_ => unspe }; - NOrd g => table {Formal => mkOrdinalForm unsprezece g; - Informal => mkOrdinalForm unspe g + NOrd g => table {Formal => \\_ => mkOrdinalForm unsprezece g; + Informal => \\_ => mkOrdinalForm unspe g } }; @@ -98,34 +91,46 @@ oper mkMidF : Str -> Str -> Sub100 = lin num = \d -> - { s = \\cse => table { NCard g => \\f => d.s ! (NCard g) ! f ; - NOrd g => \\f => let ss = d.s ! (NOrd g) ! f + { s = \\cse => table { NCard g => \\f => d.s ! (NCard g) ! f ! indep ; + NOrd g => \\f => let ss = d.s ! (NOrd g) ! f ! indep in case d.size of { sg => (artDem g Sg cse) ++ ss ; _ => mkOrd ss g cse } - }; + }; + sp = \\cse => table { NCard g => \\f => d.s ! (NCard g) ! f ! attr ; + NOrd g => \\f => let ss = d.s ! (NOrd g) ! f ! indep + in + case d.size of + { sg => (artDem g Sg cse) ++ ss ; + _ => mkOrd ss g cse + } + }; size = d.size } ; -- Latin A Supplement chars -lin n2 = mkNumVSpc "doi" "doispreze" "douăsprezece" "douăzeci" "două" "doișpe" "douășpe" "doilea" "doua" "doi" "două"; +lin n2 = mkNumVSpc "doi" "doispreze" "douăsprezece" "douăzeci" "două" "doișpe" "douășpe" "doilea" "doua"; lin n3 = regNum "trei"; lin n4 = mkNum "patru" "paisprezece" "patruzeci" "paișpe"; lin n5 = mkNum "cinci" "cinsprezece" "cincizeci" "cinșpe"; lin n6 = mkNum "șase" "șaisprezece" "șaizeci" "șaișpe"; -lin n7 = mkNum "șapte" "șaptesprezece" "șaptezeci" "șaptișpe"; +lin n7 = mkNum "șapte" "șaptesprezece" "șaptezeci" "șaptispe"; lin n8 = mkNum "opt" "optsprezece" "optzeci" "optișpe"; lin n9 = regNum "nouă"; -lin pot01 = let num = mkNumVSpc "un" "unsprezece" "unsprezece" "zece" "o" "unșpe" "unșpe" "dintâi" "dintâi" "unu" "una" +lin pot01 = let num = mkNumVSpc "un" "unsprezece" "unsprezece" "zece" "o" "unșpe" "unșpe" "dintâi" "dintâi" ; + dep = mkNumVSpc "unu" "unsprezece" "unsprezece" "zece" "una" "unșpe" "unșpe" "unulea" "una" + in - { s = \\o,c => num.s ! o ! c ; + { s = \\o,c => table {indep => num.s ! o ! c ; + attr => dep.s ! o ! c + } ; size = sg }; -lin pot0 d = { s = \\o, c => d.s ! o ! c ; +lin pot0 d = { s = \\o, c => \\_ => d.s ! o ! c ; size = less20 }; @@ -134,19 +139,19 @@ lin pot110 = mkMidF "zece" "zece" ; lin pot111 = mkMidF "unsprezece" "unșpe" ; lin pot1to19 = \d -> - {s = \\c => table { Formal => d.s ! c ! teen ; - Informal => d.s ! c ! teen_inf + {s = \\c => table { Formal => \\_ => d.s ! c ! teen ; + Informal => \\_ => d.s ! c ! teen_inf }; size = less20 }; lin pot0as1 = \d -> - {s = \\c,_ => d.s ! c ! unit ; + {s = \\c,_,p => d.s ! c ! unit ! p ; size = d.size }; lin pot1 = \d -> - {s = \\c,_ => d.s ! c ! ten ; + {s = \\c => \\_,_ => d.s ! c ! ten ; size = pl }; @@ -154,8 +159,8 @@ lin pot1 = \d -> lin pot1plus d e = {s = table { - NCard g => \\_ => d.s ! (NCard g) ! ten ++ "și" ++ e.s ! (NCard g) ! attr ; - NOrd g => \\_ => d.s ! (NCard g) ! ten ++ "și" ++ e.s ! (NOrd g) ! attr + NCard g => \\_,_ => d.s ! (NCard g) ! ten ++ "și" ++ e.s ! (NCard g) ! unit ! attr ; + NOrd g => \\_,_ => d.s ! (NCard g) ! ten ++ "și" ++ e.s ! (NOrd g) ! unit ! attr }; size = pl }; @@ -164,29 +169,29 @@ lin pot1as2 n = n ; lin pot2 d = {s = table { - NCard g => \\_ => d.s ! (NCard Fem) ! unit ++ (mksute d.size) ; - NOrd g => \\_ => d.s ! (NCard Fem) ! unit ++ (mkSute d.size g) + NCard g => \\_,_ => d.s ! (NCard Fem) ! unit ! indep ++ (mksute d.size) ; + NOrd g => \\_,_ => d.s ! (NCard Fem) ! unit ! indep ++ (mkSute d.size g) }; size = pl} ; lin pot2plus d e = - {s = \\c,f => d.s ! (NCard Fem) ! unit ++ (mksute d.size) ++ e.s ! c ! f ; + {s = \\c,f,_ => d.s ! (NCard Fem) ! unit ! indep ++ (mksute d.size) ++ e.s ! c ! f ! attr ; size = pl} ; lin pot2as3 n = n ; lin pot3 n = {s = table { - NCard g => \\f => mkmie n.size (n.s ! (NCard Fem) ! f ) ; - NOrd g => \\f => mkMie n.size g (n.s ! (NCard Fem) ! f ) + NCard g => \\f,p => mkmie n.size (n.s ! (NCard Fem) ! f ! indep) ; + NOrd g => \\f,p => mkMie n.size g (n.s ! (NCard Fem) ! f ! indep) }; size = pl } ; lin pot3plus n m = - {s = \\c, f => mkmie n.size (n.s ! (NCard Fem) ! f ) ++ m.s ! c ! f ; + {s = \\c, f, p => mkmie n.size (n.s ! (NCard Fem) ! f ! indep) ++ m.s ! c ! f ! attr; size = pl }; @@ -226,7 +231,7 @@ lin } ; lin D_0 = mkDig "0" ; - D_1 = mk3Dig "1" "1ul" "1a" sg ; + D_1 = mk3Dig "1" "1ul" "1a" sg ; ---- gender D_2 = mkDig "2"; D_3 = mkDig "3" ; D_4 = mkDig "4" ; diff --git a/lib/src/romanian/ParadigmsRon.gf b/lib/src/romanian/ParadigmsRon.gf index b92b06879..bd8d19a3d 100644 --- a/lib/src/romanian/ParadigmsRon.gf +++ b/lib/src/romanian/ParadigmsRon.gf @@ -54,9 +54,11 @@ oper Acc : NCase ; Dat : NCase ; Gen : NCase ; - - mkPrep : Str -> NCase -> Prep ; - noPrep : NCase -> Prep ; + mkPrep : overload { + mkPrep : Str -> NCase-> Bool -> Prep ; + mkPrep : Str -> NCase -> Prep; + }; +noPrep : NCase -> Prep ; --2 Nouns @@ -73,7 +75,7 @@ oper mkN3 : N -> Prep -> Prep -> N3 ; mkN3 n p q = n ** {lock_N3 = <> ; c2 = p ; c3 = q }; - + --3 Proper names and noun phrases @@ -83,11 +85,30 @@ mkN3 n p q = n ** {lock_N3 = <> ; c2 = p ; c3 = q }; mkPN = overload { mkPN : Str -> PN = mkPropN ; + mkPN : Str -> Str -> Gender -> Number -> PN = mkPropNI ; mkPN : Str -> Gender -> PN = mkPropNoun ; - mkPN : Str -> Gender -> Number -> PN = mkProperNoun; - } ; + mkPN : Str -> Gender -> Number -> PN = mkProperNoun; + } ; +mkInAn : PN -> PN = \romania -> + {s = table {No | Ac | Vo => romania.s ! No ; + _ => case romania.g of + { Fem => romania.s ! Ge ; + Masc => romania.s ! No + "ului" } + }; + g = romania.g; n = romania.n; + a = Inanimate; + lock_PN = <> + }; +mkPropNI : Str -> Str -> Gender -> Number -> PN = +\romania, romaniei,g,n -> +{s = table {Ge | Da => romaniei; + _ => romania }; +g = g; n = n; +a = Inanimate; +lock_PN = <> +}; mkPropN : Str -> PN = \Ion -> case last Ion of { "a" => mkPropNoun Ion Feminine ; @@ -98,15 +119,20 @@ mkPropNoun : Str -> Gender -> PN = \Ion, gen -> mkProperNoun Ion gen singular ; mkProperNoun : Str -> Gender -> Number -> PN = \Ion, gen, num -> -{s = table {ANomAcc => Ion; - AGenDat => case of +{s = table {No => Ion; + Ac => Ion; + Ge => case of { <"a",Fem> => init Ion + "ei" ; _ => "lui" ++ Ion }; - AVoc => Ion + Da => case of + { <"a",Fem> => init Ion + "ei" ; + _ => "lui" ++ Ion + }; + Vo => Ion }; g = gen ; -n = num ; +n = num ; a = Animate; lock_PN = <> }; @@ -152,9 +178,22 @@ lock_PN = <> Preposition = Compl ; - mkPrep ss cc = {s = ss ; c = cc; isDir = True; lock_Prep = <>} ; - noPrep cc = mkPrep [] cc ; +mkPrep = overload { +mkPrep : Str -> NCase-> Bool -> Prep = mkPreposition; +mkPrep : Str -> NCase -> Prep = mkPrepos; +}; + mkPreposition : Str -> NCase-> Bool -> Prep ; + mkPreposition ss cc b = {s = ss ; c = cc; isDir = NoDir; needIndef = b; prepDir = ""; lock_Prep = <>} ; + + mkPrepos : Str -> NCase -> Prep ; + mkPrepos ss cc = mkPreposition ss cc False; + + noPrep cc = case cc of + {Ac => {s = []; c = Ac ; isDir = Dir PAcc; needIndef = True; prepDir = "pe"; lock_Prep = <>}; + Da => {s = []; c = Da ; isDir = Dir PDat; needIndef = False; prepDir = "" ; lock_Prep = <>}; + _ => mkPreposition [] cc False + } ; compN : N -> Str -> N ; compN x y = composeN x y ** {lock_N = <>} ; @@ -231,62 +270,33 @@ mkA = overload { mk4A : Str -> Str -> Str -> Str -> A; mk4A a b c d = let adj = mkAdjSpec a b c d in -{s = table { Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c) ; - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - - } - }; isPre = False ; lock_A = <>} ; +{s = adj.s ; + isPre = False ; lock_A = <>} ; mk5A : Str -> Str -> Str -> Str -> Str -> A ; mk5A a b c d e = let adj = mkAdjSSpec a b c d e in -{s = table { Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c); - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - - } - }; isPre = False ; lock_A = <>} ; +{s = adj.s ; + isPre = False ; lock_A = <>} ; regA : Str -> A = \auriu -> let adj = mkAdjReg auriu in - {s = table {Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c); - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - } - }; isPre = False ; lock_A = <> } ; + {s = adj.s ; + isPre = False ; lock_A = <> } ; invarA : Str -> A = \auriu -> let adj =mkAdjInvar auriu in -{s = table { Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c); - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - - } - }; isPre = False ; lock_A = <>} ; +{s = adj.s ; + isPre = False ; lock_A = <>} ; mkRMut : Str -> A = \auriu -> let adj = mkRegMut auriu in -{s = table { Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c); - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - - } - }; isPre = False ; lock_A = <>} ; +{s = adj.s ; + isPre = False ; lock_A = <>} ; mkSMut : Str -> A = \auriu -> let adj = mkSpecMut auriu in -{s = table { Posit => adj.s ; - Compar => \\f => "mai" ++ (adj.s ! f) ++ "decât"; - Superl => table {AF g n a c => artDem g n c ++ "mai" ++ adj.s ! (AF g n Indef c); - AA => artDem Masc Sg ANomAcc ++ "mai" ++ adj.s ! AA - - } - }; isPre = False ; lock_A = <>} ; +{s = adj.s ; + isPre = False ; lock_A = <>} ; mkADeg : A -> A -> A ; noComp : A -> A ; @@ -295,10 +305,10 @@ let adj = mkSpecMut auriu in prefA : A -> A ; mkADeg a b = - {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; isPre = a.isPre ; lock_A = <>} ; + {s = a.s ; isPre = a.isPre ; lock_A = <>} ; noComp a = - {s = \\_ => a.s ! Posit ; + {s = a.s ; isPre = a.isPre ; lock_A = <>} ; @@ -306,49 +316,49 @@ prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; --Adverbs : - mkAdv : Str -> Adv ; - mkAdV : Str -> AdV ; + mkAdv : Str -> Adv ; + mkAdV : Str -> AdV ; mkAdA : Str -> AdA ; mkAdv x = ss x ** {lock_Adv = <>} ; mkAdV x = ss x ** {lock_AdV = <>} ; mkAdA x = ss x ** {lock_AdA = <>} ; - ---Verbs : - -oper regV : Str -> Verbe = \s -> -case s of -{ x + ("chea"|"ghea") => mkV61 s ; - x + "ea" => mkV69 s ; - x + "ca" => mkV8 s ; - x + "ga" => mkV9 s ; - x + "eia" => mkV11 s; - x + "ia" => mkV10 s; - x + "a" => mkV6 s ; - x + "e" => mkV79 s ; - x + "ui" => mkV121 s ; - x + "ii" => mkV120 s ; - x + "i" => mkV119 s ; - x + "î" => mkV141 s -}; - -oper mkV : Str -> V = \s -> mkNV (regV s) ; - - - - mkV2S : V -> Prep -> V2S ; --- mkVV : V -> VV ; - mkV2V : V -> Prep -> Prep -> V2V ; - mkVA : V -> VA ; - mkV2A : V -> Prep -> Prep -> V2A ; - mkVQ : V -> VQ ; - mkV2Q : V -> Prep -> V2Q ; - - mkAS : A -> AS ; - mkA2S : A -> Prep -> A2S ; - mkAV : A -> Prep -> AV ; - mkA2V : A -> Prep -> Prep -> A2V ; + +--Verbs : + +oper regV : Str -> Verbe = \s -> +case s of +{ x + ("chea"|"ghea") => mkV61 s ; + x + "ea" => mkV69 s ; + x + "ca" => mkV8 s ; + x + "ga" => mkV9 s ; + x + "eia" => mkV11 s; + x + "ia" => mkV10 s; + x + "a" => mkV6 s ; + x + "e" => mkV79 s ; + x + "ui" => mkV121 s ; + x + "ii" => mkV120 s ; + x + "i" => mkV119 s ; + x + "î" => mkV141 s +}; + +oper mkV : Str -> V = \s -> mkNV (regV s) ; + + + + mkV2S : V -> Prep -> V2S ; +-- mkVV : V -> VV ; + mkV2V : V -> Prep -> Prep -> V2V ; + mkVA : V -> VA ; + mkV2A : V -> Prep -> Prep -> V2A ; + mkVQ : V -> VQ ; + mkV2Q : V -> Prep -> V2Q ; + + mkAS : A -> AS ; + mkA2S : A -> Prep -> A2S ; + mkAV : A -> Prep -> AV ; + mkA2V : A -> Prep -> Prep -> A2V ; mmkV3 : V -> Prep -> Prep -> V3; @@ -359,7 +369,7 @@ oper mkV : Str -> V = \s -> mkNV (regV s) ; mkV3 = overload { mkV3 : V -> V3 = dirV3 ; - mkV3 : V -> Prep -> Prep -> V3 = mmkV3 + mkV3 : V -> Prep -> Prep -> V3 = mmkV3 } ; V0 : Type = V ; @@ -371,25 +381,25 @@ oper mkV : Str -> V = \s -> mkNV (regV s) ; mmkV2 : V -> Prep -> V2 ; mmkV2 v p = v ** {c2 = p ; lock_V2 = <>} ; + dirV2 : V -> V2 ; dirV2 v = mmkV2 v (noPrep Ac) ; - mmkV3 : V -> Prep -> Prep -> V3 ; - mmkV3 v p q = v ** {c2 = p ; c3 = q ; lock_V3 = <>} ; + --mmkV3 : V -> Prep -> Prep -> Bool -> V3 ; + --mmkV3 v p q = v ** {c2 = p ; c3 = q ; lock_V3 = <>} ; mkVS : V -> VS ; mkVS v = v ** {m = \\_ => Indic ; lock_VS = <>} ; - mkV2S v p = mmkV2 v p ** {mn,mp = Indic ; lock_V2S = <>} ; --- mkVV v = v ** {c2 = complAcc ; lock_VV = <>} ; --- deVV v = v ** {c2 = complGen ; lock_VV = <>} ; ---aVV v = v ** {c2 = complDat ; lock_VV = <>} ; - mkV2V v p q = mmkV3 v p q ** {lock_V2V = <>} ; + mkV2S v p = v ** {c2 = p ; mn,mp = Indic ; lock_V2S = <>} ; + mkVV : V -> VV ; + mkVV v = v ** {c2 = \\_ => "" ; lock_VV = <>} ; + mkV2V v p q = v ** {c2 = p; c3 = q; lock_V2V = <>} ; mkVA v = v ** {lock_VA = <>} ; - mkV2A v p q = mmkV3 v p q ** {lock_V2A = <>} ; + mkV2A v p q = v ** {c2 = p; c3 = q; lock_V2A = <>} ; mkVQ : V -> VQ ; mkVQ v = v ** {lock_VQ = <>} ; mkV2Q : V -> Prep -> V2Q ; - mkV2Q v p = mmkV2 v p ** {lock_V2Q = <>} ; + mkV2Q v p = v ** {c2 = p ; lock_V2Q = <>} ; mkAS v = v ** {lock_AS = <>} ; ---- more moods mkA2S v p = mkA2 v p ** {lock_A2S = <>} ; @@ -400,7 +410,7 @@ oper mkV : Str -> V = \s -> mkNV (regV s) ; mkOrd : A -> Ord ; -mkOrd a = {s = a.s ! Posit ; isPre = a.isPre ; lock_Ord = <>} ; +mkOrd a = {s = \\n,g,c => a.s ! AF g n Indef (convCase c) ; isPre = a.isPre ; lock_Ord = <>} ; @@ -418,7 +428,128 @@ mkOrd a = {s = a.s ! Posit ; isPre = a.isPre ; lock_Ord = <>} ; +---- + +mkDet = overload { + mkDet : (_,_,_,_ : Str) -> Number -> Det = mkDetS ; + mkDet : (_,_,_,_,_,_,_,_ : Str) -> Number -> Det = mkD + } ; + +mkDetS : (_,_,_,_ : Str) -> Number -> Det = + \orice, oricare,oricarui, oricarei,n -> + {s,sp = table { Masc => table {Da | Ge => oricarui ; + _ => orice } ; + Fem => table {Da | Ge => oricarei ; + _ => oricare } + }; + post = \\g,c => ""; size = ""; + n = n; isDef = False ; hasRef = False; +lock_Det = <> +}; + +mkD : (_,_,_,_,_,_,_,_ : Str) -> Number -> Det = +\multi, multe, multor, multorf,multiS,multeS, multora, multoraF, n -> + { s = table { Masc => table {Da | Ge => multor ; + _ => multi } ; + Fem => table {Da | Ge => multorf ; + _ => multe } + }; + sp = table { Masc => table {Da | Ge => multora ; + _ => multiS } ; + Fem => table {Da | Ge => multoraF ; + _ => multeS } + }; +post = \\g,c => ""; size = ""; + n = n; isDef = False ; hasRef = False; +lock_Det = <> +}; + +mkNP = overload { + mkNP : (_,_ : Str) -> Number -> Gender -> Bool -> NP = mkNPs ; + mkNP : (_,_,_ : Str) -> Number -> Gender -> Bool -> NP = mkNPa ; + mkNP : (_,_,_ : Str) -> Number -> Gender -> NP = mkNPspec + } ; + +mkNPspec : Str -> Str -> Str -> Number -> Gender -> NP = +\cineva,cuiva,cinev, n, g -> let ag = agrP3 g n in +{ s = \\c => case c of + {Da => {clit = \\cs => ((genCliticsCase ag Da).s ! cs) ; + comp = cuiva + }; + Ge => {clit = \\cs => [] ; + comp = cuiva}; + Vo => {clit = \\cs => [] ; + comp = cinev + }; + _ => {clit = \\cs => ((genCliticsCase ag c).s ! cs) ; + comp = cineva + } + }; +a = ag ; +indForm = cineva ; +hasClit = True; +isPronoun = False ; +hasRef = True ; +lock_NP = <> +} ; + +mkNPs : Str -> Str -> Number -> Gender -> Bool -> NP = +\cineva, cuiva, n, g, b -> let ag = agrP3 g n in +{s = \\c => case c of + {Da | Ge => {clit = \\cs => [] ; + comp = cuiva + }; + _ => {clit = \\cs => []; + comp = cineva} + }; + a = ag ; + indForm = cineva ; + hasClit = False; + isPronoun = False ; + hasRef = b ; +lock_NP = <> +}; + +mkNPa : Str -> Str -> Str -> Number -> Gender -> Bool -> NP = +\om,omului,omule, n, g, b -> let ag = agrP3 g n + in +{s = \\c => case c of + {Da | Ge => {clit = \\cs => [] ; + comp = omului + }; + Vo => {clit = \\_ => []; + comp = omule}; + _ => {clit = \\cs => [] ; + comp = om} + }; + a = ag; + hasClit = False; + hasRef = b; + isPronoun = False ; + indForm = om ; +lock_NP = <> +}; +mkPronoun :(_,_,_,_,_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pron =\eu, mine, mie, meu, euV, meuP, mea, mei, mele,g, n, p -> + {s = table + {No => eu ; + Ac => mine ; + Da => mie ; + Ge => meu; + Vo => euV + } ; + c1 = \\c => (cliticsAc g n p).s ! c ; c2 = \\c => (cliticsDa g n p).s ! c ; + a = {g = g ; n = n ; p = p} ; + poss = table {Sg => table {Masc => meuP ; Fem => mea}; + Pl => table {Masc => mei ; Fem => mele} + }; + lock_Pron = <>}; + +-- fix for Genitive, person 1 - 2 +-- only problem is for genitive case demanded by prepositions (ex : beyond me), otherwise the possesive adjective is used. +-- in this case we add a case to the complement, so that the right gender is chosen. + + } ; diff --git a/lib/src/romanian/PhonoRon.gf b/lib/src/romanian/PhonoRon.gf new file mode 100644 index 000000000..c2ddadb4c --- /dev/null +++ b/lib/src/romanian/PhonoRon.gf @@ -0,0 +1,28 @@ +resource PhonoRon = open Prelude in { + +flags coding=utf8 ; + +oper + voyelle : Strs = strs { + "a" ; "?" ; "?" ; "e" ; "?" ; "?" ; "??" ; + "h" ; + "i" ; "?" ; "o" ; "?" ; "u" ; "?" ; "y" + } ; + + elision : Str -> Str = \d -> d + pre {"e" ; "'" / voyelle} ; + +-- The following morphemes are the most common uses of elision. + + elisDe = elision "d" ; + elisLa = pre {"la" ; "l'" / voyelle} ; + elisLe = elision "l" ; + elisNe = elision "n" ; + elisQue = elision "qu" ; + +-- The subjunction "si" has a special kind of elision. The rule is +-- only approximatively correct, for "si" is not really elided before +-- the string "il" in general, but before the pronouns "il" and "ils". + + elisSi = pre {"si" ; "s'" / strs {"il"}} ; + +} diff --git a/lib/src/romanian/PhraseRon.gf b/lib/src/romanian/PhraseRon.gf new file mode 100644 index 000000000..20195d282 --- /dev/null +++ b/lib/src/romanian/PhraseRon.gf @@ -0,0 +1,27 @@ +incomplete concrete PhraseRon of Phrase = + CatRon ** open ResRon, Prelude in { + + flags optimize = all_subs ; + + lin + PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; + + UttS s = {s = s.s ! Indic} ; + UttQS qs = {s = qs.s ! QDir} ; + UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg False ! Fem} ; + UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Pl False ! Fem} ; + UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg True ! Fem} ; + + UttIP ip = {s = ip.s ! No} ; --- Acc also + UttIAdv iadv = iadv ; + UttNP np = {s = (np.s ! No).comp} ; + -- UttVP vp = {s = infVP vp (agrP3 Fem Sg)} ; --- Agr + UttAdv adv = adv ; + + NoPConj = {s = []} ; + PConjConj conj = {s = conj.s2} ; + + NoVoc = {s = []} ; + VocNP np = {s = "," ++ (np.s ! Vo).comp} ; + +} diff --git a/lib/src/romanian/QuestionRon.gf b/lib/src/romanian/QuestionRon.gf new file mode 100644 index 000000000..8bcced042 --- /dev/null +++ b/lib/src/romanian/QuestionRon.gf @@ -0,0 +1,110 @@ +incomplete concrete QuestionRon of Question = + CatRon ** open ResRon, Prelude in { + + flags optimize=all_subs ; + + lin + + QuestCl cl = { + s = \\t,a,p => + let cls = cl.s ! DDir ! t ! a ! p + in table { + QDir => cls ! Indic ; + QIndir => "dacă" ++ cls ! Indic + } + } ; + -- doesn't have clitics since it's subject of the phrase + + QuestVP qp vp = { + s = \\t,a,b,_ => + let + cl = mkClause (qp.s ! No) False (agrP3 qp.a.g qp.a.n) vp + in + cl.s ! DDir ! t ! a ! b ! Indic + } ; + + QuestSlash ip slash = { + s = \\t,a,p => + let + cls : Direct -> Str = + \d -> slash.s ! ip.a ! d ! t ! a ! p ! Indic ; + prep = if_then_Str ip.hasRef slash.c2.prepDir "" ; + who = prep ++ slash.c2.s ++ ip.s ! slash.c2.c + in table { + QDir => who ++ cls DInv ; + QIndir => who ++ cls DDir + } + } ; + + QuestIAdv iadv cl = { + s = \\t,a,p,q => + let + ord = case q of { + QDir => DInv ; + QIndir => DDir + } ; + cls = cl.s ! ord ! t ! a ! p ! Indic ; + why = iadv.s + in why ++ cls + } ; + + QuestIComp icomp np = { + s = \\t,a,p,_ => + let + vp = predV copula ; + cls = (mkClause (np.s ! No).comp np.hasClit np.a vp).s ! + DInv ! t ! a ! p ! Indic ; + why = icomp.s ! {g = np.a.g ; n = np.a.n} + in why ++ cls + } ; + + PrepIP p ip = { + s = p.s ++ ip.s ! p.c + } ; + + AdvIP ip adv = { + s = \\c => ip.s ! c ++ adv.s ; + a = ip.a; + hasRef = ip.hasRef + } ; + + IdetCN idet cn = + let + + n = idet.n ; + g = agrGender cn.g n; + a = aagr g n + in { + s = \\c => idet.s ! g ! (convCase c) ++ cn.s ! n ! Indef ! (convCase c); + a = a; + hasRef = getClit cn.a + + } ; + + IdetIP idet = + let + g = Masc ; + n = idet.n ; + a = aagr g n + in { + s = \\c => idet.s ! g ! (convCase c) ; + a = a ; + hasRef = True + } ; + + IdetQuant idet num = + let + n = num.n ; + in { + s = \\g,c => idet.s ! n ! g ! c ++ num.s ! g ; + n = n + } ; + + + + CompIAdv a = {s = \\_ => a.s} ; + + CompIP p = {s = \\_ => p.s ! No} ; + + +} \ No newline at end of file diff --git a/lib/src/romanian/RelativeRon.gf b/lib/src/romanian/RelativeRon.gf new file mode 100644 index 000000000..5db80deca --- /dev/null +++ b/lib/src/romanian/RelativeRon.gf @@ -0,0 +1,63 @@ +incomplete concrete RelativeRon of Relative = + CatRon ** open Prelude, ResRon in { + + flags optimize=all_subs ; + + lin + + RelCl cl = { + s = \\ag,t,a,p,m => therefore_PConj.s ++ conjThat ++ + cl.s ! DDir ! t ! a ! p ! m ; + c = No + } ; + + + RelVP rp vp = case rp.hasAgr of { + True => {s = \\ag => + (mkClause + (rp.s ! {g = ag.g ; n = ag.n} ! No) False + {g = rp.a.g ; n = rp.a.n ; p = P3} + vp).s ! DDir ; c = No} ; + False => {s = \\ag => + (mkClause + (rp.s ! {g = ag.g ; n = ag.n} ! No) False + ag + vp).s ! DDir ; c = No + } + } ; + + RelSlash rp slash = { + s = \\ag,t,a,p,m => + let aag = {g = ag.g ; n = ag.n} --add Clitics in this case also ! + in + slash.c2.s ++ slash.c2.prepDir ++ rp.s ! aag ! slash.c2.c ++ + slash.s ! aag ! DInv ! t ! a ! p ! m ; + c = No + } ; + + FunRP p np rp = let ss = (np.s ! No).comp + in { + s = \\a,c => ss ++ p.s ++ rp.s ! a ! p.c ; + a = {g = np.a.g ; n = np.a.n} ; + hasAgr = True; + hasRef = np.hasRef + } ; + +-- Ac => if_then_Str p.isDir (ss ++ p.s ++ rp.s ! a ! p.c) (ss ++ p.s ++ rp.s ! a ! No) + IdRP = { + s = \\ag,c => case c of { Da | Ge => case of + { => "careia" ; => "caruia" ; + <_Pl> => "carora" + }; + _ => "care" + } + ; + a = {g = Masc ; n = Sg} ; + hasAgr = False; + hasRef = True + } ; + + + + +} diff --git a/lib/src/romanian/ResRon.gf b/lib/src/romanian/ResRon.gf index 08887f2c8..997b46819 100644 --- a/lib/src/romanian/ResRon.gf +++ b/lib/src/romanian/ResRon.gf @@ -1,11 +1,11 @@ --1 Romance auxiliary operations. -- -resource ResRon = ParamX ** open Prelude in { +resource ResRon = ParamX - [Temp,TTAnt,Tense,TPres,TPast,TFut,TCond], PhonoRon ** open Prelude in { -flags optimize=all ; +flags optimize= all ; - flags optimize=all ; + --2 Enumerated parameter types for morphology -- @@ -26,10 +26,18 @@ param Animacy = Animate | Inanimate ; - param Size = sg | less20 | pl ; + -- Refl = NoRefl | ARefl | DRefl ; - -- Case = Acc | Dat | Gen ; + Clitics = Normal | Composite | Short | Vocative ; + Size = sg | less20 | pl ; + + ParClit = PAcc | PDat ; + + VClit = VNone | VOne ParClit | VRefl | VMany ; + + PrepDir = Dir ParClit | NoDir ; + -- Adjectives are inflected in number, gender, have specific form for enclitic determined --article, and specific forms for Nominative-Accusative/Dative-Genitive/Voccative @@ -42,10 +50,9 @@ param -- Cardinal numerals have gender, ordinal numerals have full number as well. ACase = ANomAcc | AGenDat | AVoc ; - Species = Def | Indef ; + Species = Indef | Def ; NCase = No | Da | Ac | Ge | Vo ; - CardOrd = NCard Gender | NOrd Gender; @@ -88,7 +95,7 @@ param -- form for compatibility with the other Romance languages, to be used in case that -- Romanian will be integrated in the Romance category - +{- param VF = VInfin Bool @@ -97,17 +104,18 @@ param | VPart Gender Number Species ACase | VGer ; - +-} TMood = VPres Mood - | VImperf Mood --# notpresent - | VPasse --# notpresent + | VImperff --# notpresent + | VPasse Mood --# notpresent | VFut --# notpresent | VCondit --# notpresent ; NumPersI = SgP2 | PlP1 | PlP2 ; + VPForm = VPFinite TMood Anteriority | VPImperat @@ -117,7 +125,6 @@ param RTense = RPres | RPast --# notpresent - | RPasse --# notpresent | RFut --# notpresent | RCond --# notpresent ; @@ -127,18 +134,22 @@ param oper AAgr : Type = {g : Gender ; n : Number} ; Agr : Type = AAgr ** {p : Person} ; + RAgr : Type = {s : Clitics => Str} ; -param - RAgr = RAg {g : Gender ; n : Number} | RNoAg ; --- AAgr + oper + + -- clitics : Gender -> Number genForms : Str -> Str -> Gender => Str = \bon,bonne -> table { Masc => bon ; Fem => bonne } ; + RNoAg : RAgr = genClit "" "" "" ""; + aagrForms : (x1,_,_,x4 : Str) -> (AAgr => Str) = \tout,toute,tous,toutes -> table { {g = g ; n = Sg} => genForms tout toute ! g ; @@ -147,19 +158,159 @@ param Noun = {s : Number => Species => ACase => Str; g : NGender; a : Animacy} ; Adj = {s : AForm => Str} ; - -- A = {s : Degree => AForm => Str ; isPre : Bool} ; + - Compl : Type = {s : Str ; c : NCase ; isDir : Bool} ; + Compl : Type = {s : Str ; c : NCase ; isDir : PrepDir ; needIndef : Bool ; prepDir : Str} ; --- complAcc : Compl = {s = [] ; c = Acc ; isDir = True} ; --- complGen : Compl = {s = [] ; c = Gen ; isDir = True} ; --- complDat : Compl = {s = [] ; c = Dat ; isDir = True} ; +oper +NounPhrase : Type = { + s : NCase => {comp : Str ; + clit : Clitics => Str} ; + a : Agr ; + indForm : Str ; + hasClit : Bool ; + hasRef : Bool ; + isPronoun : Bool + } ; + +Pronoun : Type = {s : NCase => {comp, c1, c2 : Str}; + a : Agr ; + poss : Number => Gender => Str + }; +heavyNP : {s : NCase => Str ; a : Agr; hasClit : Bool; ss : Str} -> NounPhrase = \np -> { + s = \\c => {comp = np.s ! c ; + clit = \\cs => if_then_Str np.hasClit ((genCliticsCase np.a c).s ! cs) [] }; + - - - + a = np.a ; + indForm = np.ss ; + hasClit = np.hasClit ; + isPronoun = False; + hasRef = False + } ; + + + appCompl : Compl -> NounPhrase -> Str = \comp,np -> + comp.s ++ (np.s ! comp.c).comp ; + +oper convCase : NCase -> ACase = +\nc -> case nc of + {Da | Ge => AGenDat; + No | Ac => ANomAcc; + _ => AVoc} ; +oper convACase : ACase -> NCase = +\ac -> case ac of +{ANomAcc => No ; + AGenDat => Ge ; + _ => Vo}; + +--oper genRAgr : (x1,_,x3 : Str) -> RAgr = \ma,m,me -> genClit ma m me ** {hasClit = True}; + +oper genClit : (x1,_,_,x4 : Str) -> {s : Clitics => Str} = \ma, m, me, mma -> +{s = table {Normal => ma; + Short => m; + Composite => me ; + Vocative => mma + }}; + +oper genCliticsCase : Agr -> NCase -> {s : Clitics => Str} = \agr, c -> +case c of +{Da => cliticsDa agr.g agr.n agr.p ; + Ac => cliticsAc agr.g agr.n agr.p ; + _ => {s = \\_ => []} +}; + +oper aRefl : Agr -> RAgr = + \a -> case of + {<_,_,P3> => {s = (genClit "se" "s-" "se" "").s } ; + _ => {s = (cliticsAc a.g a.n a.p).s } + }; + +oper dRefl : Agr -> RAgr = +\a -> case of + {<_,_,P3> => {s = (genClit "își" "-și" "și" "").s } ; + _ => {s = (cliticsDa a.g a.n a.p).s } + }; + +oper cliticsAc : Gender -> Number -> Person -> {s: Clitics => Str} = +\g,n,p -> case of +{<_,Sg,P1> => genClit "mă" "m-" "mă" "-mă"; <_,Pl,P1> => genClit "ne" "ne-" "ne" "-ne"; +<_,Sg,P2> => genClit "te" "te-" "te" "-te"; <_,Pl,P2> => genClit "vă" "v-" "vă" "-vă"; + => genClit "îl" "l-" "-l" "-l"; => genClit "îi" "i-" "-i" "-i"; + => genClit "o" "-o" "-o" "-o"; => genClit "le" "le-" "le" "-le" +}; + +oper cliticsDa : Gender -> Number -> Person -> {s : Clitics => Str} = +\g,n,p -> case of +{<_,Sg,P1> => genClit "îmi" "mi-" "mi" "-mi"; <_,Pl,P1> => genClit "ne" "ne-" "ni" "-ne"; +<_,Sg,P2> => genClit "îți" "ți-" "ți" "-ți"; <_,Pl,P2> => genClit "vă" "v-" "vi" "-vă"; +<_,Sg,P3> => genClit "îi" "i-" "i" "-i"; <_,Pl,P3> => genClit "le" "le-" "li" "-le" +}; + +oper + VPC : Type = { + -- for conjunctive mood where the negation comes + s : VPForm => { + sa : Str ; -- sa + sv : Agr => Str -- merge + } ; + neg : Polarity => Str ; + clitAc : RAgr ; + clitDa : RAgr ; + clitRe : RAgr ; + nrClit : VClit ; + comp : Agr => Str ; -- content(e) ; à ma mère ; hier + ext : Polarity => Str ; -- que je dors / que je dorme + } ; + +-- fix for Refl + Dat + +flattenClitics : VClit -> RAgr -> RAgr -> RAgr -> Bool -> Bool -> {s1 : Str ; s2 : Str } = +\vc, clA, clD, clR, isFemSg, b -> + let par = if_then_else Clitics b Short Normal; + pcomb = if_then_else Clitics b Short Composite + +in +case isFemSg of +{True => {s1 = clD.s ! par ++ clR.s ! par ; s2 = clA.s ! Short}; + _ => case vc of + {VOne PAcc => {s1 = clA.s ! par ; s2 = ""}; + VOne PDat => {s1 = clD.s ! par ; s2 = ""}; + VRefl => {s1 = clR.s ! par ; s2 = ""}; + _ => {s1 = clD.s ! Composite ++ clR.s ! pcomb ++ clA.s ! pcomb ; s2 = ""} + } +}; + +{- +{ => {s1 = clD.s ! par ; s2 = ""}; + => {s1 = clR.s ! par ; s2 = ""}; + <_,_,_,True> => {s1 = clD.s ! par ++ clR.s ! par ; s2 = clA.s ! Short}; + <_,False,False,_> => {s1 = clA.s ! par ; s2 = ""}; + _ => {s1 = clD.s ! Composite ++ clR.s ! Composite ++ clA.s ! pcomb ; s2 = ""} +}; +-} + +flattenSimpleClitics : VClit -> RAgr -> RAgr -> RAgr -> Str = +\vc, clA, clD, clR ->case vc of + {VOne _ => clD.s ! Normal ++ clA.s ! Normal; + _ => clD.s ! Composite ++ clR.s ! Composite ++ clA.s ! Composite + }; + + +-- we rely on the fact that there are not more than 2 clitics for a verb + +oper getSize : Size -> Str = +\s -> case s of +{ pl => "de" ; + _ => "" +}; + + + + + } diff --git a/lib/src/romanian/SentenceRon.gf b/lib/src/romanian/SentenceRon.gf new file mode 100644 index 000000000..d25ee133c --- /dev/null +++ b/lib/src/romanian/SentenceRon.gf @@ -0,0 +1,94 @@ +incomplete concrete SentenceRon of Sentence = + CatRon ** open Prelude, ResRon in { + + flags optimize=all_subs ; + + lin + PredVP np vp = mkClause (np.s ! No).comp np.hasClit np.a vp ; + + PredSCVP sc vp = mkClause sc.s False (agrP3 Masc Sg) vp ; + + ImpVP vpr = let agSg = {n = Sg ; g = Masc ; p = P2 } ; + agPl = {n = Pl ; g = Masc ; p = P2 } ; + clDirSg = vpr.clDat.s ! Vocative ++ (vpr.isRefl ! agSg).s ! Vocative ++ vpr.clAcc.s ! Vocative ; + clDirPl = vpr.clDat.s ! Vocative ++ (vpr.isRefl ! agPl).s ! Vocative ++ vpr.clAcc.s ! Vocative ; + clNegSg = flattenSimpleClitics vpr.nrClit vpr.clAcc vpr.clDat (vpr.isRefl ! agSg) ; + clNegPl = flattenSimpleClitics vpr.nrClit vpr.clAcc vpr.clDat (vpr.isRefl ! agPl) + in + { + s = \\p,f,g => + case of { + => case n of + { Sg => vpr.s ! Imper SgP2 ++ vpr.comp ! agSg ++ vpr.ext ! Pos; + _ => vpr.s ! Imper PlP2 ++ vpr.comp ! agPl ++ vpr.ext ! Pos + }; + => case n of + {Sg => "să" ++ clNegSg ++ conjVP vpr agSg ++ vpr.comp ! agSg ++ vpr.ext ! Pos; + Pl => "să" ++ clNegPl ++ conjVP vpr agPl ++ vpr.comp ! agPl ++ vpr.ext ! Pos + }; + => case n of + {Sg => "nu" ++ clNegSg ++ vpr.s ! Inf ++ vpr.comp ! agSg ++ vpr.ext ! Pos; + Pl => "nu" ++ clNegPl ++ vpr.s ! Inf ++ vpr.comp ! agPl ++ vpr.ext ! Pos + } + } + } ; + + SlashVP np v2 = + {s = \\ag => + let + vp = v2 + in (mkClause (np.s ! No).comp np.hasClit np.a vp).s ; + c2 = v2.c2 + } ; + + AdvSlash slash adv = { + s = \\ag,d,t,a,b,m => slash.s ! ag ! d ! t ! a ! b ! m ++ adv.s ; + c2 = slash.c2 + } ; +-- potentially overgenerating !! since the complements have a preposition already + + SlashPrep cl prep = { + s = \\_ => cl.s ; + c2 = {s = prep.s ; c = prep.c ; isDir = NoDir; needIndef = prep.needIndef; prepDir = ""} + } ; + + SlashVS np vs slash = + {s = \\ag => + (mkClause + (np.s ! No).comp np.hasClit np.a + (insertExtrapos (\\b => conjThat ++ slash.s ! ag ! (vs.m ! b)) + (predV vs)) + ).s ; + c2 = slash.c2 + } ; + + EmbedS s = {s = conjThat ++ s.s ! Indic} ; + + EmbedQS qs = {s = qs.s ! QIndir} ; +-- EmbedVP vp = {s = infVP vp (agrP3 Masc Sg)} ; --- agr ---- compl + + UseCl t p cl = { + s = \\o => t.s ++ p.s ++ cl.s ! DDir ! t.t ! t.a ! p.p ! o + } ; + + UseQCl t p cl = { + s = \\q => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! q + } ; + + UseRCl t p cl = { + s = \\r,ag => t.s ++ p.s ++ cl.s ! ag ! t.t ! t.a ! p.p ! r ; + c = cl.c + } ; + UseSlash t p cl = { + s = \\ag,mo => + t.s ++ p.s ++ cl.s ! ag ! DDir ! t.t ! t.a ! p.p ! mo ; + c2 = cl.c2 + } ; + + AdvS a s = {s = \\o => a.s ++ s.s ! o} ; + + RelS s r = { + s = \\o => s.s ! o ++ "," ++ r.s ! Indic ! agrP3 Masc Sg + } ; + +} diff --git a/lib/src/romanian/StructuralRon.gf b/lib/src/romanian/StructuralRon.gf new file mode 100644 index 000000000..1ce18aeff --- /dev/null +++ b/lib/src/romanian/StructuralRon.gf @@ -0,0 +1,300 @@ +--# -path=.:../abstract:../romance:../common:prelude + +concrete StructuralRon of Structural = CatRon ** + open MorphoRon, ParadigmsRon, BeschRon, Prelude,(X = ConstructX) in { + + flags optimize=all ; + --coding=utf8 ; + +lin + + above_Prep = mkPrep "deasupra" Ge ; + after_Prep = mkPrep "după" Ac True; + all_Predet = { + s = \\a => table { AGenDat => aagrForms nonExist nonExist "tuturor" "tuturor" ! a ; + _ => aagrForms "tot" "toată" "toți" "toate" ! a + }; + c = No + } ; + almost_AdA, almost_AdN = ss "aproape" ; + always_AdV = ss "mereu" ; + although_Subj = ss "deși" ; + and_Conj = {s1 = [] ; s2 = "și" ; n = Pl} ; + because_Subj = ss "deoarece" ; + before_Prep = mkPrep "înaintea" Ge ; + behind_Prep = mkPrep "înapoia" Ge ; + between_Prep = mkPrep "între" Ac True ; + both7and_DConj = {s1,s2 = "și" ; n = Pl} ; + but_PConj = ss "dar" ; + by8agent_Prep = mkPrep "de către" Ac True; + by8means_Prep = mkPrep "de" Ac True; + can8know_VV = mkVV (v_besch68 "putea") ; + can_VV = mkVV (v_besch68 "putea") ; + during_Prep = mkPrep "în timpul" Ge ; + either7or_DConj = {s1,s2 = "sau" ; n = Pl} ; + everybody_NP = mkNP "toți" "tuturor" Pl Masc True; -- form for Fem needed also ! + every_Det = mkDet "orice" "orice" "oricărui" "oricărei" "orice" "orice" "oricăruia" "oricăreia" Sg ; + everything_NP = mkNP "totul" nonExist Sg Masc False; + everywhere_Adv = ss "pretutindeni" ; + few_Det = mkDet "câțiva" "câteva" "câtorva" "câtorva" Pl ; + for_Prep = mkPrep "pentru" Ac True; + from_Prep = mkPrep "de la" Ac True; + + he_Pron = + mkPronoun + "el" "el" "lui" "lui" [] "său" "sa" "săi" "sale" Masc Sg P3 ; + + here7from_Adv = ss "de aici" ; + here7to_Adv = ss "până aici" ; + here_Adv = ss "aici" ; + how_IAdv = ss "cum" ; + how8many_IDet = {s = \\g,c => case of + { => "câtor"; => "câte" ; + => "câtor" ; _ => "câți" + }; + n = Pl + } ; + if_Subj = ss "dacă" ; + in8front_Prep = mkPrep "în fața" Ge ; + i_Pron = mkPronoun "eu" "mine" "mie" [] [] "meu" "mea" "mei" "mele" Masc Sg P1 ; + in_Prep = mkPrep "în" Ac True; + it_Pron = + mkPronoun + "" "el" "lui" "lui" [] "său" "sa" "săi" "sale" Masc Sg P3 ; + + less_CAdv = X.mkCAdv "mai puțin" conjThan ; + many_Det = mkDet "mulți" "multe" "multor" "multor" "mulți" "multe" "multora" "multora" Pl; + more_CAdv = X.mkCAdv "mai" conjThan ; + most_Predet = { + s = \\a => table { AGenDat => "marii parți a" ; + ANomAcc => "marea parte a"; + AVoc => "mare parte a" + }; + c = Ge + }; + much_Det = mkDet "mult" "multă" nonExist nonExist Sg ; + must_VV = mkVV (v_besch140 "trebui") ; + no_Utt = ss "nu" ; + on_Prep = mkPrep "pe" Ac True; + only_Predet = {s = \\_,c => "doar" ; c = No} ; + or_Conj = {s1 = [] ; s2 = "sau" ; n = Sg} ; + otherwise_PConj = ss "altfel" ; + part_Prep = mkPrep "din" Ac True; + please_Voc = ss ["vă rog"] ; + possess_Prep = mkPrep "" Ge ; -- required forms for Fem Sg, Masc Pl and Fem Pl - maybe variants + quite_Adv = ss "chiar" ; + she_Pron = + mkPronoun + "ea" "ea" "ei" "ei" [] "său" "sa" "săi" "sale" + Fem Sg P3 ; + + so_AdA = ss "așa" ; + somebody_NP = mkNP "cineva" "cuiva" Sg Masc True; +somePl_Det = mkDet "unii" "unele" "unor" "unor" "unii" "unele" "unora" "unora" Pl ; +someSg_Det = mkDet "niște" "niște" "la niște" "la niște" Sg ; + something_NP = mkNP "ceva" "a ceva" Sg Masc False; + somewhere_Adv = ss ["undeva"] ; --- ne - pas + +that_Quant = { + s = \\_ => table { + Sg => table {Masc => table { AGenDat => "acelui"; + _ => "acel" + }; + Fem => table {AGenDat => "acelei"; + _ => "acea" + } + }; + Pl => table { Masc => table {AGenDat => "acelor"; + _ => "acei" + }; + Fem => table {AGenDat => "acelor"; + _ => "acele" + } + } + } ; + sp = table { + Sg => table {Masc => table { AGenDat => "aceluia"; + _ => "acela" + }; + Fem => table {AGenDat => "aceleia"; + _ => "aceea" + } + }; + Pl => table {Masc => table {AGenDat => "acelora"; + _ => "aceia" + }; + Fem => table {AGenDat => "acelora"; + _ => "acelea" + } + } + }; + isDef = False ; isPost = False ; hasRef = False +}; + + there7from_Adv = ss ["de acolo"] ; + there7to_Adv = ss "până acolo" ; + there_Adv = ss "acolo" ; + therefore_PConj = ss "astfel" ; + --these_NP = mkNP "aceștia" "acestora" Masc Pl True; --form for Fem needed also ! + they_Pron = mkPronoun + "ei" "ei" "lor" "lor" [] "lor" "lor" "lor" "lor" + Masc Pl P3 ; + this_Quant = { + s = \\_ => table { + Sg => table {Masc => table { AGenDat => "acestui"; + _ => "acest" + }; + Fem => table {AGenDat => "acestei"; + _ => "această" + } + }; + Pl => table { Masc => table {AGenDat => "acestor"; + _ => "acești" + }; + Fem => table {AGenDat => "acestor"; + _ => "aceste" + } + } + } ; + sp = table { + Sg => table {Masc => table { AGenDat => "acestuia"; + _ => "acesta" + }; + Fem => table {AGenDat => "acesteia"; + _ => "aceasta" + } + }; + Pl => table {Masc => table {AGenDat => "acestora"; + _ => "aceștia" + }; + Fem => table {AGenDat => "acestora"; + _ => "acestea" + } + } + } ; + isDef = False ; isPost = False ; hasRef = False + }; + through_Prep = mkPrep "prin" Ac True; + too_AdA = ss "prea" ; + to_Prep = mkPrep "la" Ac True; + under_Prep = mkPrep "sub" Ac True; + very_AdA = ss "foarte" ; + want_VV = mkVV (v_besch74 "vrea") ; + we_Pron = mkPronoun + "noi" "noi" "nouă" [] [] "nostru" "noastră" "noștri" "noastre" + Masc Pl P1 ; +whatSg_IP = + {s = \\c => case c of + { Da => "căruia" ; + Ge => "a căruia" ; + _ => "ce" }; + a = aagr Masc Sg; + hasRef = False + }; + +whatPl_IP = + {s = \\c => case c of + { Da => "cărora" ; + Ge => "a cărora" ; + _ => "ce" }; + a = aagr Masc Pl; + hasRef = False + }; + when_IAdv = ss "când" ; + when_Subj = ss "când" ; + where_IAdv = ss "unde" ; + which_IQuant = {s = table { + Sg => table {Masc => table { AGenDat => "cărui"; + _ => "care" + }; + Fem => table {AGenDat => "cărei"; + _ => "care" + } + }; + Pl => \\g => table {AGenDat => "căror"; + _ => "care" + } + + }; + isDef = False + }; + + whoPl_IP = {s = \\c => case c of + { Da => "cui" ; + Ge => "a cui" ; + _ => "cine" }; + a = aagr Masc Pl; + hasRef = True + }; + + whoSg_IP = {s = \\c => case c of + { Da => "cui" ; + Ge => "a cui" ; + _ => "cine" }; + a = aagr Masc Sg; + hasRef = True + }; + why_IAdv = ss "de ce" ; + without_Prep = mkPrep "fără" Ac True; + with_Prep = mkPrep "cu" Ac ; + yes_Utt = ss "da" ; + + youSg_Pron = mkPronoun + "tu" "tine" "ție" [] "tu" "tău" "ta" "tăi" "tale" + Masc Sg P2 ; + youPl_Pron, youPol_Pron = + mkPronoun + "voi" "voi" "vouă" [] "voi" "vostru" "voastră" "voștri" "voastre" + Masc Pl P2 ; + + not_Predet = {s = \\a,c => "nu" ; c = No} ; + + no_Quant = +{ + s = \\_ => table { + Sg => table {Masc => table { AGenDat => "niciunui"; + _ => "niciun" + }; + Fem => table {AGenDat => "niciunei"; + _ => "nicio" + } + }; + Pl => table { Masc => table {AGenDat => "niciunor"; + _ => "niciunii" + }; + Fem => table {AGenDat => "niciunor"; + _ => "niciunele" + } + } + } ; + sp = table { + Sg => table {Masc => table { AGenDat => "nimănui"; + _ => "nimeni" + }; + Fem => table {AGenDat => "nimănui"; + _ => "nimeni" + } + }; + Pl => table {Masc => table {AGenDat => "niciunora"; + _ => "niciunii" + }; + Fem => table {AGenDat => "niciunora"; + _ => "niciunele" + } + } + } ; + isDef = False ; isPost = False ; hasRef = False +}; + if_then_Conj = {s1 = "dacă" ; s2 = "atunci" ; n = Sg ; lock_Conj = <>} ; + nobody_NP = mkNP "nimeni" "nimănui" Sg Masc True; + + nothing_NP = mkNP "nimic" "nimicului" Sg Masc False; + at_least_AdN = ss "cel puțin" ; + at_most_AdN = ss "cel mult" ; + + except_Prep = mkPrep "cu excepția" Ge ; + + as_CAdv = X.mkCAdv "la fel de" "ca" ; + +} + diff --git a/lib/src/romanian/VerbRon.gf b/lib/src/romanian/VerbRon.gf new file mode 100644 index 000000000..2b2e52676 --- /dev/null +++ b/lib/src/romanian/VerbRon.gf @@ -0,0 +1,367 @@ +incomplete concrete VerbRon of Verb = + CatRon ** open Prelude, ResRon in { + + flags optimize=all_subs ; + + lin + UseV = \verb -> + { + s = verb.s ; + isRefl = verb.isRefl; + nrClit = verb.nrClit; + isFemSg = False ; + neg = table {Pos => ""; Neg => "nu"} ; + clAcc = RNoAg ; nrClit = verb.nrClit; + clDat = RNoAg ; + comp = \\a => [] ; + ext = \\p => [] ; + } ; + + ComplVV v vp =insertSimpObj (\\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos) (UseV v) ; + + + ComplVS v s = insertExtrapos (\\b => conjThat ++ s.s ! (v.m ! b)) (predV v) ; + ComplVQ v q = insertExtrapos (\\_ => q.s ! QIndir) (predV v) ; + + + ComplVA v ap = + insertSimpObj (\\a => ap.s ! AF a.g a.n Indef ANomAcc) (UseV v) ; + + + SlashV2a verb = {s = verb.s ; isRefl = verb.isRefl; nrClit = verb.nrClit; + isFemSg = False ; + neg = table {Pos => ""; Neg => "nu"} ; + clAcc = RNoAg ; + clDat = RNoAg ; + comp = \\a => [] ; + ext = \\p => [] ; + c2 = verb.c2 ; needAgr = False ; lock_VP = <>}; + + + + + Slash2V3 v np = let s1 = v.c2.s ++(np.s ! (v.c2.c)).comp ; + ss = if_then_Str np.hasRef (v.c2.prepDir ++ s1) s1; + sir = if_then_Str np.isPronoun "" ss ; + vcDa = if_then_else VClit np.hasRef (nextClit v.nrClit PDat) v.nrClit; + vcAc = if_then_else VClit np.hasRef (nextClit v.nrClit PAcc) v.nrClit + in + case v.c2.isDir of + {Dir PAcc => (insertObje (\\_ => sir) (clitFromNoun np Ac) RNoAg (isAgrFSg np.a) vcAc (UseV v)) ** {needAgr = False ; c2 = v.c3} ; + Dir PDat => (insertObje (\\_ => sir) RNoAg (clitFromNoun np Da) False vcDa (UseV v)) ** {needAgr = False ; c2 = v.c3}; + _ => (insertSimpObj (\\_ => ss) (UseV v)) ** {needAgr = False ; c2 = v.c3} + }; + + Slash3V3 v np = let s1 = v.c3.s ++ (np.s ! (v.c3.c)).comp ; + ss = if_then_Str np.hasRef (v.c3.prepDir ++ s1) s1 ; + sir = if_then_Str np.isPronoun "" ss ; + vcDa = if_then_else VClit np.hasRef (nextClit v.nrClit PDat) v.nrClit; + vcAc = if_then_else VClit np.hasRef (nextClit v.nrClit PAcc) v.nrClit + in + case v.c3.isDir of + {Dir PAcc => (insertObje (\\_ => sir) (clitFromNoun np Ac) RNoAg (isAgrFSg np.a) vcAc (UseV v)) ** {needAgr = False ; c2 = v.c2} ; + Dir PDat => (insertObje (\\_ => sir) RNoAg (clitFromNoun np Da) False vcDa (UseV v)) ** {needAgr = False ; c2 = v.c2} ; + _ => (insertSimpObj (\\_ => ss) (UseV v)) ** {needAgr = False ; c2 = v.c2} + }; + +-- needs fixing - agreement for the added verb must be made accordingly to what we add in ComplSlash !!! +-- fixed with extra parameter ! + + SlashV2V v vp = (insertSimpObj (\\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++ vp.comp ! a ++ vp.ext ! Pos) (UseV v)) ** {needAgr = True ;c2 = v.c2} ; + + + SlashV2S v s = (insertExtrapos (\\b => conjThat ++ s.s ! Indic) (UseV v)) ** {needAgr = False; c2 = v.c2}; + + SlashV2Q v q = (insertExtrapos (\\_ => q.s ! QIndir) (UseV v)) ** {needAgr = False ; c2 = v.c2 } ; + + + + -- more usually the adverbial form is used, hence no agreement + + SlashV2A v ap = + (insertSimpObj (\\a => v.c3.s ++ ap.s ! (AF Masc Sg Indef (convCase v.c3.c))) +(UseV v)) ** {needAgr = False ;c2 = v.c2} ; + + ComplSlash vp np = let s1 = vp.c2.s ++(np.s ! (vp.c2.c)).comp ; + ss = if_then_Str np.hasRef (vp.c2.prepDir ++ s1) s1 ; + sir = if_then_Str np.isPronoun "" ss ; + vcDa = if_then_else VClit np.hasRef (nextClit vp.nrClit PDat) vp.nrClit; + vcAc = if_then_else VClit np.hasRef (nextClit vp.nrClit PAcc) vp.nrClit; + vpp = case vp.c2.isDir of + {Dir PAcc => insertObje (\\_ => sir) (clitFromNoun np Ac) RNoAg (isAgrFSg np.a) vcAc vp ; + Dir PDat => insertObje (\\_ => sir) RNoAg (clitFromNoun np Da) False vcDa vp; + _ => insertSimpObj (\\_ => ss) vp + } + in + {isRefl = vpp.isRefl; + s = vpp.s ; isFemSg = vpp.isFemSg ; + nrClit = vpp.nrClit; clAcc = vpp.clAcc ; + clDat = vpp.clDat ; neg = vpp.neg ; + comp = case vp.needAgr of + {True => \\a => vpp.comp ! (np.a); + _ => \\a => vpp.comp ! a + }; + ext = vpp.ext ; + lock_VP = <> }; + + + + +--add reflexive clitics + ReflVP v = {isRefl = case v.c2.c of + {Da => \\a => dRefl a; + _ => \\a => aRefl a + }; + s = v.s ; isFemSg = v.isFemSg ; + nrClit = case v.nrClit of + {VNone => VRefl; + _ => VMany }; + clAcc = v.clAcc ; + clDat = v.clDat ; + neg = v.neg ; + comp = v.comp ; + ext = v.ext ; + lock_VP = <> + }; + + + SlashVV v vp = + insertObjc (\\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++ vp.comp ! a ++ vp.ext ! Pos) ((UseV v) **{c2=vp.c2; needAgr= vp.needAgr ; lock_VPSlash = <>}) ; +{- + SlashV2VNP v np vp = let s1 = v.c2.s ++(np.s ! (v.c2.c)).comp ; + ss = if_then_Str np.hasRef (v.c2.prepDir ++ s1) s1; + sir = if_then_Str np.isPronoun "" ss ; + vcDa = if_then_else VClit np.hasRef (nextClit v.nrClit PDat) v.nrClit; + vcAc = if_then_else VClit np.hasRef (nextClit v.nrClit PAcc) v.nrClit ; + vcomp = (getConjComp vp np.a).s + in + case v.c2.isDir of + {Dir PAcc => (insertObje (\\a => sir ++ vcomp ! a) (clitFromNoun np Ac) RNoAg (isAgrFSg np.a) vcAc (UseV v)) ** {needAgr = vp.needAgr ; c2 = vp.c2} ; + + Dir PDat => (insertObje (\\a => sir ++ vcomp ! a) RNoAg (clitFromNoun np Da) False vcDa (UseV v)) ** {needAgr = vp.needAgr ; c2 = vp.c2}; + + _ => (insertSimpObj (\\a => ss ++ vcomp ! a) (UseV v)) ** {needAgr = vp.needAgr ; c2 = vp.c2} + }; + +-} + UseComp comp = insertSimpObj comp.s (UseV copula) ; + + CompAP ap = {s = \\ag => ap.s ! AF ag.g ag.n Indef ANomAcc} ; + CompNP np = {s = \\_ => (np.s ! No).comp} ; + CompAdv a = {s = \\_ => a.s} ; + + + AdvVP vp adv = insertAdv adv.s vp ; + AdVVP adv vp = insertAdv adv.s vp ; + + PassV2 v = insertSimpObj (\\a => v.s ! PPasse a.g a.n Indef ANomAcc) (UseV auxPassive) ; + + + + +oper conjVP : VP -> Agr -> Str = \vp,agr -> + let + inf = vp.s ! Subjo SPres agr.n agr.p ; + neg = vp.neg ! Pos ; + in + neg ++ inf ; + +insertAdv : Str -> VP -> VP = \co,vp -> { + s = vp.s ; + isRefl = vp.isRefl; + isFemSg = vp.isFemSg ; + clAcc = vp.clAcc ; nrClit = vp.nrClit ; + clDat = vp.clDat ; + neg = vp.neg ; + comp = \\a => vp.comp ! a ++ co ; + ext = vp.ext ; + lock_VP = <> + } ; + + oper copula : V = + let t = table {Inf => "fi" ; + Indi Presn Sg P1 => "sunt" ; Indi Presn Sg P2 => "ești" ; Indi Presn Sg P3 => "este" ; + Indi Presn Pl P1 => "suntem" ; Indi Presn Pl P2 => "sunteți" ; Indi Presn Pl P3 => "sunt" ; + Indi PSimple Sg P1 => "fusei" ; Indi PSimple Sg P2 => "fuseși" ; Indi PSimple Sg P3 => "fuse" ; + Indi PSimple Pl P1 => "fuserăm" ; Indi PSimple Pl P2 => "fuserăți" ; Indi PSimple Pl P3 => "fuseră" ; + Indi Imparf Sg P1 => "eram" ; Indi Imparf Sg P2 => "erai" ; Indi Imparf Sg P3 => "era" ; + Indi Imparf Pl P1 => "eram" ; Indi Imparf Pl P2 => "erați" ; Indi Imparf Pl P3 => "erau" ; + Indi PPerfect Sg P1 => "fusesem" ; Indi PPerfect Sg P2 => "fuseseși" ; Indi PPerfect Sg P3 => "fusese" ; + Indi PPerfect Pl P1 => "fusesem" ; Indi PPerfect Pl P2 => "fuseseți" ; Indi PPerfect Pl P3 => "fuseseră" ; + Subjo SPres Sg P1 => "fiu" ; Subjo SPres Sg P2 => "fii" ; Subjo SPres Sg P3 => "fie" ; + Subjo SPres Pl P1 => "fim" ; Subjo SPres Pl P2 => "fiți" ; Subjo SPres Pl P3 => "fie" ; + Imper SgP2 => "fii" ; Imper PlP2 => "fiți" ; Imper PlP1 => "fim" ; + Ger => "fiind"; + PPasse g n a d => (mkAdjReg "fost"). s ! (AF g n a d) + } in + {s = t; isRefl = \\_ => RNoAg; nrClit = VNone ; lock_V = <>} ; + +predV : V -> VP = \verb -> + { + s = verb.s ; + isRefl = verb.isRefl; + isFemSg = False ; + nrClit = verb.nrClit ; + neg = table {Pos => ""; Neg => "nu"} ; + clAcc = RNoAg ; + clDat = RNoAg ; + comp = \\a => [] ; + ext = \\p => [] ; lock_VP = <> + } ; + +useVP : VP -> VPC = \vp -> + let + verb = vp.s ; + vinf : Bool -> Str = \b -> verb ! Inf ; + vger = verb ! Ger ; + + vimp : Agr -> Str = \a -> case of + { => verb ! Imper SgP2 ; + => verb ! Imper PlP2 ; + _ => verb ! Subjo SPres a.n a.p + } ; + vf : Str -> (Agr -> Str) -> { + sa : Str ; + sv : Agr => Str + } = + \fin,inf -> { + sa = fin ; + sv = \\a => inf a + } ; + + + in { + s = table { + VPFinite tm Simul => case tm of + {VPres Indic => vf "" (\a -> verb ! Indi Presn a.n a.p) ; + VPres Conjunct => vf "să" (\a -> verb ! Subjo SPres a.n a.p) ; + VImperff => vf "" (\a -> verb ! Indi Imparf a.n a.p) ; + VPasse Indic => vf "" (\a -> pComp ! a.n ! a.p ++ verb ! PPasse Masc Sg Indef ANomAcc) ; + VPasse Conjunct => vf "să" (\a -> copula.s! Inf ++ verb ! PPasse Masc Sg Indef ANomAcc) ; + VFut => vf "" (\a -> pFut ! a.n ! a.p ++ verb ! Inf) ; + VCondit => vf "" (\a -> pCond ! a.n ! a.p ++ verb ! Inf) + } ; + VPFinite tm Anter => case tm of + {VPres Indic => vf "" (\a -> pComp ! a.n ! a.p ++ verb ! PPasse Masc Sg Indef ANomAcc) ; + (VPres Conjunct | VPasse Conjunct) => vf "să" (\a -> copula.s! Inf ++ verb ! PPasse Masc Sg Indef ANomAcc) ; + VFut => vf "" (\a -> pFut !a.n ! a.p ++ copula.s! Inf ++ verb ! PPasse Masc Sg Indef ANomAcc) ; + VCondit => vf "" (\a -> pCond ! a.n ! a.p ++ copula.s ! Inf ++ verb ! PPasse Masc Sg Indef ANomAcc); + _ => vf "" (\a -> verb ! Indi PPerfect a.n a.p) + }; + VPInfinit Anter b=> vf "a" (\a -> copula.s ! Inf ++ verb ! PPasse Masc Sg Indef ANomAcc); + VPImperat => vf "să" (\a -> verb ! Subjo SPres a.n a.p) ; -- fix it later ! + VPGerund => vf "" (\a -> vger) ; + VPInfinit Simul b => vf "a" (\a -> verb ! Inf) + } ; + agr = vp.agr ; + neg = vp.neg ; + clitAc = vp.clAcc ; + clitDa = vp.clDat ; + clitRe = RNoAg ; + nrClit = vp.nrClit ; + comp = vp.comp ; + ext = vp.ext + } ; + +mkClause : Str -> Bool -> Agr -> VP -> + {s : Direct => RTense => Anteriority => Polarity => Mood => Str} = + \subj,hasClit,agr,vpr -> { + s = \\d,t,a,b,m => + let + tm = case t of { + RPast => VPasse m ; + RFut => VFut ; + RCond => VCondit ; + RPres => VPres m + } ; + cmp = case of + { | => True ; + => True; + _ => False + } ; + vp = useVP vpr ; + vps = (vp.s ! VPFinite tm a).sv ; + sa = (vp.s ! VPFinite tm a ).sa ; + verb = vps ! agr ; + neg = vp.neg ! b ; + clpr = flattenClitics vpr.nrClit vpr.clAcc vpr.clDat (vpr.isRefl ! agr) (andB vpr.isFemSg cmp) cmp; + compl = vp.comp ! agr ++ vp.ext ! b + in + case d of { + DDir => + subj ++ sa ++ neg ++ clpr.s1 ++ verb ++ clpr.s2; + DInv => + sa ++ neg ++ clpr.s1 ++verb ++ clpr.s2 ++subj + } + ++ compl + } ; + + + + + + +oper auxPassive = copula ; + +mkVPSlash : Compl -> VP -> VP ** {c2 : Compl} = \c,vp -> vp ** {c2 = c; needAgr = False} ; + + +insertObje : (Agr => Str) -> RAgr -> RAgr -> Bool -> VClit -> VP -> VP = \obj,clA, clD, agg, vc, vp -> { + s = vp.s ; isRefl = vp.isRefl; + isFemSg= orB agg vp.isFemSg ; + nrClit = vc; + neg = table {Pos => ""; Neg => "nu"} ; + clAcc = {s = \\cs => vp.clAcc.s ! cs ++ clA.s ! cs }; + clDat = {s = \\cs => vp.clDat.s ! cs ++ clD.s ! cs }; + comp = \\a => vp.comp ! a ++ obj ! a ; + ext = vp.ext ; lock_VP = <> + }; + +insertSimpObj : (Agr => Str) -> VP -> VP = \obj,vp -> { + s = vp.s ; isRefl = vp.isRefl; isFemSg = vp.isFemSg ; neg = vp.neg ; + clAcc = vp.clAcc ; clDat = vp.clDat ; + nrClit = vp.nrClit ; + comp = \\a => vp.comp ! a ++ obj ! a ; + ext = vp.ext ; lock_VP = <> +}; + + +insertObjc : (Agr => Str) -> VPSlash -> VPSlash = \obj,vp -> + insertSimpObj obj vp ** {c2 = vp.c2; needAgr = False ; lock_VPSlash = <>} ; + +insertExtrapos : (Polarity => Str) -> VP -> VP = \co,vp -> { + s = vp.s ; + isFemSg = vp.isFemSg ; + clAcc = vp.clAcc ; isRefl = vp.isRefl; + clDat = vp.clDat ; + neg = vp.neg ; + comp = vp.comp ; nrClit = vp.nrClit ; + ext = \\p => vp.ext ! p ++ co ! p ; + lock_VP =<> + } ; + +clitFromNoun : NP -> NCase -> RAgr = \np,nc -> +{s = (np.s ! nc).clit; hasClit = True}; + +isAgrFSg : Agr -> Bool = \ag -> +case of +{ => True ; + _ => False +}; + + +getConjComp : VP -> Agr -> {s: Agr => Str} = \vp,ag -> + {s = \\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp ag ++ vp.comp ! a ++ vp.ext ! Pos}; + +oper nextClit : VClit -> ParClit -> VClit = \vc,pc -> +case vc of + { VNone => VOne pc; + _ => VMany + }; + +-- discuss example +-- l -table (ComplSlash (Slash3V3 sell_V3 (UsePN john_PN)) (UsePN paris_PN)) +-- in English the direct object always comes first, which could lead to incorrect longer examples +-- while in French it always comes last +-- ?!? +};