From 96c22468f4e8bc75a15a2c5b48ded1684ac9fba5 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Thu, 15 Oct 2026 10:05:51 +0200 Subject: [PATCH] extensions by Codex --- src/romanian/AdjectiveRon.gf | 5 + src/romanian/AdverbRon.gf | 2 + src/romanian/CatRon.gf | 10 +- src/romanian/ConjunctionRon.gf | 17 ++++ src/romanian/ConstructionRon.gf | 86 ++++++++++++++++ src/romanian/ExtendRon.gf | 170 +++++++++++++++++++++++++++++++- src/romanian/IdiomRon.gf | 7 +- src/romanian/LangRon.gf | 1 + src/romanian/NamesRon.gf | 8 +- src/romanian/NounRon.gf | 78 +++++++++++---- src/romanian/NumeralRon.gf | 74 ++++++++++++++ src/romanian/PhraseRon.gf | 2 +- src/romanian/ResRon.gf | 22 +++-- src/romanian/SentenceRon.gf | 9 +- src/romanian/VerbRon.gf | 16 ++- 15 files changed, 465 insertions(+), 42 deletions(-) create mode 100644 src/romanian/ConstructionRon.gf diff --git a/src/romanian/AdjectiveRon.gf b/src/romanian/AdjectiveRon.gf index 15123b406..7fcc0df3f 100644 --- a/src/romanian/AdjectiveRon.gf +++ b/src/romanian/AdjectiveRon.gf @@ -59,6 +59,11 @@ concrete AdjectiveRon of Adjective = isPre = ap.isPre } ; + AdvAP ap adv = { + s = \\a => ap.s ! a ++ adv.s ; + isPre = False + } ; + UseA2 a = { s = a.s ; isPre = False diff --git a/src/romanian/AdverbRon.gf b/src/romanian/AdverbRon.gf index a40746ed7..456814c3c 100644 --- a/src/romanian/AdverbRon.gf +++ b/src/romanian/AdverbRon.gf @@ -2,6 +2,8 @@ concrete AdverbRon of Adverb = CatRon ** open ResRon, Prelude in { lin + PositAdAAdj a = {s = a.s ! AA} ; + PositAdvAdj a = { s = a.s ! AA } ; diff --git a/src/romanian/CatRon.gf b/src/romanian/CatRon.gf index f55a135e4..2024d0faf 100644 --- a/src/romanian/CatRon.gf +++ b/src/romanian/CatRon.gf @@ -1,5 +1,5 @@ --# -path=.:../Romance:../common:../abstract:../common:prelude ---# -coding=latin1 +--# -coding=utf8 concrete CatRon of Cat = CommonX - [CAdv,Temp,Tense] @@ -65,6 +65,10 @@ concrete CatRon of Cat = sp : Gender => NCase => Str ; size : Str ; --because of the numerals hasRef : Bool }; + + DAP = {s : Gender => NCase => Str ; n : Number ; + isDef : Bool ; post : Gender => NCase => Str ; + sp : Gender => NCase => Str ; size : Str ; hasRef : Bool} ; Predet = {s : AAgr => ACase => Str ; c : NCase} ; @@ -162,8 +166,8 @@ oper --Conjuctions -conjThan : Str = "decât" ; -conjThat : Str = "cã" ; +conjThan : Str = "decât" ; +conjThat : Str = "că" ; } diff --git a/src/romanian/ConjunctionRon.gf b/src/romanian/ConjunctionRon.gf index c7abc4bc2..4c15b783c 100644 --- a/src/romanian/ConjunctionRon.gf +++ b/src/romanian/ConjunctionRon.gf @@ -19,6 +19,11 @@ concrete ConjunctionRon of Conjunction = ConjAP conj ss = conjunctDistrTable AForm conj ss ** { isPre = ss.isPre } ; + + ConjCN conj ss = { + s = \\n,sp,c => conj.s1 ++ ss.s1 ! n ! sp ! c ++ conj.s2 ++ ss.s2 ! n ! sp ! c ; + g = ss.g ; a = ss.a ; needsRefForm = ss.needsRefForm ; isComp = True + } ; ConjRS conj ss = conjunctDistrTable2 Mood Agr conj ss ** { c = ss.c @@ -53,11 +58,23 @@ concrete ConjunctionRon of Conjunction = BaseRS x y = twoTable2 Mood Agr x y ** {c = y.c} ; ConsRS xs x = consrTable2 Mood Agr comma xs x ** {c = xs.c} ; + BaseCN x y = { + s1 = x.s ; s2 = y.s ; g = x.g ; a = x.a ; + needsRefForm = orB x.needsRefForm y.needsRefForm + } ; + ConsCN x xs = { + s1 = \\n,sp,c => x.s ! n ! sp ! c ++ comma ++ xs.s1 ! n ! sp ! c ; + s2 = xs.s2 ; g = x.g ; a = x.a ; + needsRefForm = orB x.needsRefForm xs.needsRefForm + } ; + lincat [S] = {s1,s2 : Mood => Str} ; [Adv] = {s1,s2 : Str} ; [NP] = {s1,s2 : NCase => Str ; a : Agr; nForm : NForm} ; [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; [RS] = {s1,s2 : Mood => Agr => Str ; c : NCase} ; + [CN] = {s1,s2 : Number => Species => ACase => Str ; + g : NGender ; a : Animacy ; needsRefForm : Bool} ; }; diff --git a/src/romanian/ConstructionRon.gf b/src/romanian/ConstructionRon.gf new file mode 100644 index 000000000..2792ded5f --- /dev/null +++ b/src/romanian/ConstructionRon.gf @@ -0,0 +1,86 @@ +--# -path=alltenses:.:../abstract:../api + +concrete ConstructionRon of Construction = CatRon ** + open SyntaxRon, SymbolicRon, ParadigmsRon, + LexiconRon, ResRon, Prelude in { + +flags coding=utf8 ; + +lincat + Weekday = N ; + Month = N ; + Monthday = NP ; + Year = NP ; + +lin + hungry_VP = mkVP (mkA "flămând") ; + thirsty_VP = mkVP (mkA "însetat") ; + tired_VP = mkVP (mkA "obosit") ; + scared_VP = mkVP (mkA "speriat") ; + ill_VP = mkVP (mkA "bolnav") ; + ready_VP = mkVP (mkA "gata") ; + + has_age_VP card = mkVP (dirV2 (mkV "avea")) + (SyntaxRon.mkNP (mkN "an")) ; + + is_right_VP = mkVP (mkA "corect") ; + is_wrong_VP = mkVP (mkA "greÈ™it") ; + + n_units_AP card cn a = + mkAP (lin AdA (mkUtt (SyntaxRon.mkNP (lin CN cn)))) (lin A a) ; + + n_units_of_NP card cn np = + let unit : NP = SyntaxRon.mkNP (lin CN cn) + in heavyNP { + s = \\c => (unit.s ! c).comp ++ "din" ++ (np.s ! c).comp ; + a = unit.a ; hasClit = HasRef False ; ss = unit.indForm ++ "din" ++ np.indForm + } ; + + bottle_of_CN np = mkCN (mkN2 (mkN "sticlă") (mkPrep "de" Ac)) np ; + cup_of_CN np = mkCN (mkN2 (mkN "ceaÈ™că") (mkPrep "de" Ac)) np ; + glass_of_CN np = mkCN (mkN2 (mkN "pahar") (mkPrep "de" Ac)) np ; + + weekdayPunctualAdv w = {s = w.s ! Sg ! Indef ! ANomAcc} ; + weekdayHabitualAdv w = {s = "în fiecare" ++ w.s ! Sg ! Indef ! ANomAcc} ; + weekdayLastAdv w = {s = w.s ! Sg ! Indef ! ANomAcc ++ "trecută"} ; + weekdayNextAdv w = {s = w.s ! Sg ! Indef ! ANomAcc ++ "viitoare"} ; + + monthAdv m = {s = "în" ++ m.s ! Sg ! Indef ! ANomAcc} ; + yearAdv y = {s = "în" ++ (y.s ! No).comp} ; + dayMonthAdv d m = {s = "la" ++ (d.s ! No).comp ++ m.s ! Sg ! Indef ! ANomAcc} ; + monthYearAdv m y = {s = "în" ++ m.s ! Sg ! Indef ! ANomAcc ++ (y.s ! No).comp} ; + dayMonthYearAdv d m y = { + s = "la" ++ (d.s ! No).comp ++ m.s ! Sg ! Indef ! ANomAcc ++ (y.s ! No).comp + } ; + + intYear = symb ; + intMonthday = symb ; + + weekdayN w = w ; + monthN m = m ; + weekdayPN w = {s = \\_ => w.s ! Sg ! Indef ! ANomAcc ; + g = Fem ; n = Sg ; a = Inanimate} ; + monthPN m = {s = \\_ => m.s ! Sg ! Indef ! ANomAcc ; + g = Masc ; n = Sg ; a = Inanimate} ; + + monday_Weekday = mkN "luni" ; + tuesday_Weekday = mkN "marÈ›i" ; + wednesday_Weekday = mkN "miercuri" ; + thursday_Weekday = mkN "joi" ; + friday_Weekday = mkN "vineri" ; + saturday_Weekday = mkN "sâmbătă" ; + sunday_Weekday = mkN "duminică" ; + + january_Month = mkN "ianuarie" ; + february_Month = mkN "februarie" ; + march_Month = mkN "martie" ; + april_Month = mkN "aprilie" ; + may_Month = mkN "mai" ; + june_Month = mkN "iunie" ; + july_Month = mkN "iulie" ; + august_Month = mkN "august" ; + september_Month = mkN "septembrie" ; + october_Month = mkN "octombrie" ; + november_Month = mkN "noiembrie" ; + december_Month = mkN "decembrie" ; +} diff --git a/src/romanian/ExtendRon.gf b/src/romanian/ExtendRon.gf index a70d332b2..d6e11c1db 100644 --- a/src/romanian/ExtendRon.gf +++ b/src/romanian/ExtendRon.gf @@ -1,10 +1,29 @@ --# -path=.:../common:../abstract concrete ExtendRon of Extend = - CatRon ** ExtendFunctor - [PassVPSlash] + CatRon ** ExtendFunctor - [ + PassVPSlash, PassAgentVPSlash, PastPartAP, PastPartAgentAP, PresPartAP, + CompoundN, CompoundAP, GerundCN, GerundNP, GerundAdv, ByVP, InOrderToVP, + ApposNP, PositAdVAdj, ProgrVPSlash, + RNP, ReflRNP, ReflPron, ReflPoss, PredetRNP, AdvRNP, AdvRVP, AdvRAP, + ReflA2RNP, PossPronRNP, + VPS, BaseVPS, ConsVPS, MkVPS, ConjVPS, PredVPS, + VPI, BaseVPI, ConsVPI, MkVPI, ConjVPI, ComplVPIVV, + BaseComp, ConsComp, ConjComp, + BaseImp, ConsImp, ConjImp, + UseDAP, UseDAPFem, UseDAPMasc] with (Grammar = GrammarRon) ** - open ResRon in { + open ResRon, Prelude, Coordination, GrammarRon in { + +lincat + RNP = {s : Agr => NCase => Str ; isPron : Bool} ; + VPS = {s : Mood => Agr => Str} ; + [VPS] = {s1,s2 : Mood => Agr => Str} ; + VPI = {s : Agr => Str} ; + [VPI] = {s1,s2 : Agr => Str} ; + [Comp] = {s1,s2 : Agr => Str} ; + [Imp] = {s1,s2 : Polarity => ImpForm => Gender => Str} ; lin iFem_Pron = mkPronoun "eu" "mine" "mie" [] [] "meu" "mea" "mei" "mele" Fem Sg P1 ; youFem_Pron = mkPronoun "tu" "tine" "Å£ie" [] "tu" "tău" "ta" "tăi" "tale" Fem Sg P2 ; @@ -17,4 +36,151 @@ lin iFem_Pron = mkPronoun "eu" "mine" "mie" [] [] "meu" "mea" "mei" "mele" Fem S -- KA: derived from PassV2, objects are ignored lin PassVPSlash vps = insertSimpObj (\\a => vps.s ! PPasse a.g a.n Indef ANomAcc) auxPassive ** {lock_VP = <>}; + PassAgentVPSlash vps np = + insertSimpObj (\\a => vps.s ! PPasse a.g a.n Indef ANomAcc ++ + vps.comp ! a ++ "de" ++ (np.s ! No).comp) + auxPassive ** {lock_VP = <>} ; + + PastPartAP vps = { + s = \\af => case af of { + AF g n sp c => vps.s ! PPasse g n sp c ++ vps.comp ! agrP3 g n ; + AA => vps.s ! PPasse Masc Sg Indef ANomAcc ++ vps.comp ! agrP3 Masc Sg + } ; + isPre = False + } ; + + PastPartAgentAP vps np = { + s = \\af => case af of { + AF g n sp c => vps.s ! PPasse g n sp c ++ vps.comp ! agrP3 g n ++ "de" ++ (np.s ! No).comp ; + AA => vps.s ! PPasse Masc Sg Indef ANomAcc ++ vps.comp ! agrP3 Masc Sg ++ "de" ++ (np.s ! No).comp + } ; + isPre = False + } ; + + PresPartAP vp = { + s = \\af => case af of { + AF g n _ _ => vp.s ! Ger ++ vp.comp ! agrP3 g n ++ vp.ext ! Pos ; + AA => vp.s ! Ger ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos + } ; + isPre = False + } ; + + ProgrVPSlash vps = vps ; + + CompoundN n1 n2 = { + s = \\n,sp,c => n2.s ! n ! sp ! c ++ "de" ++ n1.s ! Sg ! Indef ! ANomAcc ; + g = n2.g ; a = n2.a + } ; + + CompoundAP n a = { + s = \\af => a.s ! af ++ "de" ++ n.s ! Sg ! Indef ! ANomAcc ; + isPre = False + } ; + + GerundCN vp = { + s = \\_,_,_ => "faptul de a" ++ vp.s ! Inf ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos ; + g = NNeut ; a = Inanimate ; isComp = True ; needsRefForm = False + } ; + + GerundNP vp = heavyNP { + s = \\_ => "faptul de a" ++ vp.s ! Inf ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos ; + a = agrP3 Masc Sg ; hasClit = HasRef False ; + ss = "faptul de a" ++ vp.s ! Inf ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos + } ; + + GerundAdv vp = {s = vp.s ! Ger ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos} ; + ByVP vp = {s = "prin" ++ vp.s ! Ger ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos} ; + InOrderToVP vp = {s = "pentru a" ++ vp.s ! Inf ++ vp.comp ! agrP3 Masc Sg ++ vp.ext ! Pos} ; + PositAdVAdj a = {s = a.s ! AA} ; + + ApposNP np1 np2 = heavyNP { + s = \\c => (np1.s ! c).comp ++ SOFT_BIND ++ "," ++ (np2.s ! No).comp ; + a = np1.a ; hasClit = np1.nForm ; + ss = np1.indForm ++ SOFT_BIND ++ "," ++ np2.indForm + } ; + + ReflPron = { + s = \\agr,c => reflPron agr.n agr.p (convCase c) ++ reflPronHard agr.g agr.n agr.p ; + isPron = True + } ; + + ReflPoss num cn = { + s = \\agr,c => cn.s ! num.n ! Def ! convCase c ++ possDet agr num.n (agrGender cn.g num.n) (convCase c) ; + isPron = False + } ; + + PredetRNP pred rnp = { + s = \\agr,c => pred.s ! aagr agr.g agr.n ! convCase c ++ rnp.s ! agr ! pred.c ; + isPron = False + } ; + + AdvRNP np prep rnp = { + s = \\agr,c => (np.s ! c).comp ++ prep.s ++ rnp.s ! agr ! prep.c ; + isPron = False + } ; + + AdvRVP vp prep rnp = insertSimpObj (\\a => prep.s ++ rnp.s ! a ! prep.c) vp ; + AdvRAP ap prep rnp = ap ** { + s = \\af => case af of { + AF g n _ _ => ap.s ! af ++ prep.s ++ rnp.s ! agrP3 g n ! prep.c ; + AA => ap.s ! af ++ prep.s ++ rnp.s ! agrP3 Masc Sg ! prep.c + } ; isPre = False + } ; + ReflA2RNP ap rnp = ap ** { + s = \\af => case af of { + AF g n _ _ => ap.s ! af ++ ap.c2.s ++ rnp.s ! agrP3 g n ! ap.c2.c ; + AA => ap.s ! af ++ ap.c2.s ++ rnp.s ! agrP3 Masc Sg ! ap.c2.c + } ; isPre = False + } ; + ReflRNP vps rnp = insertSimpObjPre (\\a => vps.c2.s ++ rnp.s ! a ! vps.c2.c) vps ; + + PossPronRNP pron num cn rnp = heavyNP { + s = \\c => cn.s ! num.n ! Def ! convCase c ++ pron.poss ! num.n ! (agrGender cn.g num.n) ! convCase c ++ + "de" ++ rnp.s ! pron.a ! No ; + a = agrP3 (agrGender cn.g num.n) num.n ; hasClit = HasRef False ; + ss = cn.s ! num.n ! Def ! ANomAcc ++ pron.poss ! num.n ! (agrGender cn.g num.n) ! ANomAcc ++ + "de" ++ rnp.s ! pron.a ! No + } ; + + UseDAP dap = heavyNP { + s = dap.sp ! Masc ; a = agrP3 Masc dap.n ; hasClit = HasRef False ; + ss = dap.sp ! Masc ! No + } ; + UseDAPMasc dap = heavyNP { + s = dap.sp ! Masc ; a = agrP3 Masc dap.n ; hasClit = HasRef False ; + ss = dap.sp ! Masc ! No + } ; + UseDAPFem dap = heavyNP { + s = dap.sp ! Fem ; a = agrP3 Fem dap.n ; hasClit = HasRef False ; + ss = dap.sp ! Fem ! No + } ; + + BaseVPS x y = {s1 = x.s ; s2 = y.s} ; + ConsVPS x xs = {s1 = \\m,a => x.s ! m ! a ++ comma ++ xs.s1 ! m ! a ; s2 = xs.s2} ; + MkVPS t p vp = {s = \\m,a => t.s ++ p.s ++ (mkClause "" False a vp).s ! DDir ! t.t ! t.a ! p.p ! m} ; + ConjVPS conj xs = {s = \\m,a => conj.s1 ++ xs.s1 ! m ! a ++ conj.s2 ++ xs.s2 ! m ! a} ; + PredVPS np vps = {s = \\m => (np.s ! No).comp ++ vps.s ! m ! np.a} ; + + BaseVPI x y = {s1 = x.s ; s2 = y.s} ; + ConsVPI x xs = {s1 = \\a => x.s ! a ++ comma ++ xs.s1 ! a ; s2 = xs.s2} ; + MkVPI vp = {s = \\a => "a" ++ vp.s ! Inf ++ vp.comp ! a ++ vp.ext ! Pos} ; + ConjVPI conj xs = {s = \\a => conj.s1 ++ xs.s1 ! a ++ conj.s2 ++ xs.s2 ! a} ; + ComplVPIVV vv vpi = insertSimpObj vpi.s (useVerb vv) ; + + BaseComp x y = {s1 = x.s ; s2 = y.s} ; + ConsComp x xs = {s1 = \\a => x.s ! a ++ comma ++ xs.s1 ! a ; s2 = xs.s2} ; + ConjComp conj xs = {s = \\a => conj.s1 ++ xs.s1 ! a ++ conj.s2 ++ xs.s2 ! a} ; + + BaseImp x y = {s1 = x.s ; s2 = y.s} ; + ConsImp x xs = {s1 = \\p,f,g => x.s ! p ! f ! g ++ comma ++ xs.s1 ! p ! f ! g ; s2 = xs.s2} ; + ConjImp conj xs = {s = \\p,f,g => conj.s1 ++ xs.s1 ! p ! f ! g ++ conj.s2 ++ xs.s2 ! p ! f ! g} ; + +oper + possDet : Agr -> Number -> Gender -> ACase -> Str = \agr,n,g,c -> + case of { + => i_Pron.poss ! n ! g ! c ; => youSg_Pron.poss ! n ! g ! c ; + => he_Pron.poss ! n ! g ! c ; => we_Pron.poss ! n ! g ! c ; + => youPl_Pron.poss ! n ! g ! c ; => they_Pron.poss ! n ! g ! c + } ; + } diff --git a/src/romanian/IdiomRon.gf b/src/romanian/IdiomRon.gf index 5749e39f6..74a1f1e9d 100644 --- a/src/romanian/IdiomRon.gf +++ b/src/romanian/IdiomRon.gf @@ -14,7 +14,10 @@ in { GenericCl vp = mkClause "cineva" False (agrP3 Masc Sg) vp ; -- an exact correspondent does not exist ! ExistNP np = - mkClause "" False np.a (insertSimpObj (\\ag => (np.s ! No ).comp) (useVerb (v_besch20 "existã"))) ; + mkClause "" False np.a (insertSimpObj (\\ag => (np.s ! No ).comp) (useVerb (v_besch20 "exista"))) ; + ExistNPAdv np adv = + mkClause "" False np.a + (insertAdv adv.s (insertSimpObj (\\_ => (np.s ! No).comp) (useVerb (v_besch20 "exista")))) ; -- v_besch20 "exista" ExistIP ip = { @@ -37,7 +40,7 @@ in { 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 vp = let a = {p = P1 ; n = Pl ; g = Masc} in - { s = "sã" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos }; + { s = "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos }; } diff --git a/src/romanian/LangRon.gf b/src/romanian/LangRon.gf index 08766ca05..20a4710a9 100644 --- a/src/romanian/LangRon.gf +++ b/src/romanian/LangRon.gf @@ -4,6 +4,7 @@ concrete LangRon of Lang = GrammarRon, LexiconRon + , ConstructionRon --# notpresent , DocumentationRon --# notpresent ** { diff --git a/src/romanian/NamesRon.gf b/src/romanian/NamesRon.gf index 951d90016..b62a12930 100644 --- a/src/romanian/NamesRon.gf +++ b/src/romanian/NamesRon.gf @@ -1,6 +1,6 @@ concrete NamesRon of Names = CatRon ** open ResRon, Prelude in { -lin GivenName, MaleSurname, FemaleSurname = \pn -> -- KA: guessed +lin GivenName, MaleSurname, FemaleSurname, PlSurname = \pn -> -- KA: guessed let g = pn.g ; n = pn.n ; @@ -46,4 +46,10 @@ lin UseLN pn = let indForm = pn.s ! No } ; +lin InLN ln = {s = "în" ++ ln.s ! No} ; + PlainLN ln = UseLN ln ; + AdjLN ap ln = ln ** { + s = \\c => ln.s ! c ++ ap.s ! AF ln.g ln.n Indef (convCase c) + } ; + } diff --git a/src/romanian/NounRon.gf b/src/romanian/NounRon.gf index f879288b6..85ad0c41c 100644 --- a/src/romanian/NounRon.gf +++ b/src/romanian/NounRon.gf @@ -87,25 +87,31 @@ concrete NounRon of Noun = ss = (np.s ! No).comp ++adv.s ; } ; - DetQuantOrd quant num ord = let n = num.n + ExtAdvNP np adv = heavyNP { + s = \\c => (np.s ! c).comp ++ SOFT_BIND ++ "," ++ adv.s ; + a = np.a ; + hasClit = np.nForm ; + ss = (np.s ! No).comp ++ SOFT_BIND ++ "," ++ 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) ++ s1) - - in - s2 ++ 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 s1 = ord.s ! n ! g ! No; - s2 = if_then_Str quant.isPost (quant.s ! num.isNum ! n ! g ! (convCase c) ++ s1) "" - in - s2 ; + 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 s1 + (quant.s ! num.isNum ! n ! g ! (convCase c) ++ s1) + in s2 ++ num.s ! g ; + sp = \\g,c => let + s1 = if_then_Str quant.isDef + (ord.s ! n ! g ! c) (ord.s ! n ! g ! No) + in if_then_Str quant.isPost + (s1 ++ num.sp ! g ++ quant.sp ! n ! g ! (convCase c)) + (quant.sp ! n ! g ! (convCase c) ++ s1 ++ num.sp ! g) ; + post = \\g,c => if_then_Str quant.isPost + (quant.sp ! n ! g ! (convCase c)) "" ; n = num.n ; - isDef = quant.hasRef; + isDef = False ; size = num.size; hasRef = quant.hasRef @@ -144,6 +150,12 @@ in { ss = det.sp ! g ! No } ; + DetDAP det = det ; + AdjDAP dap ap = dap ** { + s = \\g,c => dap.s ! g ! c ++ ap.s ! AF g dap.n Indef (convCase c) ; + sp = \\g,c => dap.sp ! g ! c ++ ap.s ! AF g dap.n Indef (convCase c) + } ; + -- assume that it refers to people PossPron p = { @@ -192,6 +204,12 @@ in { isPre = True; }; + OrdNumeralSuperl numeral adj = { + s = \\n,g,c => numeral.s ! (convCase c) ! NOrd g ! Formal ++ + "cel mai" ++ adj.s ! AF g n Indef (convCase c) ; + isPre = True + } ; + DefArt = { s = \\b,n,g,c => [] ; sp = \\n,g,c => [] ; @@ -308,4 +326,30 @@ in { isComp = True } ; + PossNP cn np = { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ + if_then_Str cn.isComp (artPos (agrGender cn.g n) n c) "" ++ + (np.s ! Ge).comp ; + g = cn.g ; a = cn.a ; needsRefForm = cn.needsRefForm ; isComp = True + } ; + + PartNP cn np = { + s = \\n,sp,c => cn.s ! n ! sp ! c ++ "de" ++ (np.s ! No).comp ; + g = cn.g ; a = cn.a ; needsRefForm = cn.needsRefForm ; isComp = True + } ; + + CountNP det np = heavyNP { + s = \\c => det.s ! np.a.g ! c ++ "dintre" ++ (np.s ! c).comp ; + a = agrP3 np.a.g det.n ; hasClit = HasRef False ; + ss = det.s ! np.a.g ! No ++ "dintre" ++ np.indForm + } ; + + QuantityNP decimal mu = + let s = case mu.isPre of { + True => mu.s ++ decimal.s ! NCard Masc ; + False => decimal.s ! NCard Masc ++ mu.s + } + in heavyNP {s = \\_ => s ; a = agrP3 Masc Sg ; + hasClit = HasRef False ; ss = s} ; + }; diff --git a/src/romanian/NumeralRon.gf b/src/romanian/NumeralRon.gf index a76809230..a29e0d594 100644 --- a/src/romanian/NumeralRon.gf +++ b/src/romanian/NumeralRon.gf @@ -171,6 +171,14 @@ lin pot1plus d e = lin pot1as2 n = n ; +lin pot21 = { + s = table { + NCard g => \\_,_ => "o sută" ; + NOrd g => \\_,_ => mkOrdinalForm "sută" g + } ; + size = pl + } ; + lin pot2 d = {s = table { NCard g => \\_,_ => d.s ! (NCard Fem) ! unit ! indep ++ (mksute d.size) ; @@ -183,6 +191,14 @@ lin pot2plus d e = size = e.size} ; lin pot2as3 n = n ; + +lin pot31 = { + s = table { + NCard g => \\_,_ => "o mie" ; + NOrd g => \\_,_ => mkOrdinalForm "mie" g + } ; + size = pl + } ; lin pot3 n = {s = table { @@ -198,9 +214,67 @@ lin pot3plus n m = size = m.size }; +lin pot3decimal d = { + s = \\c,_,_ => d.s ! NCard Masc ++ "mii" ; + size = pl + } ; + lin pot3as4 n = n ; + +lin pot41 = { + s = table { + NCard g => \\_,_ => "un milion" ; + NOrd g => \\_,_ => mkOrdinalForm "milion" g + } ; + size = pl + } ; + +lin pot4 n = { + s = table { + NCard g => \\f,_ => n.s ! NCard Masc ! f ! indep ++ "milioane" ; + NOrd g => \\f,_ => n.s ! NCard Masc ! f ! indep ++ mkOrdinalForm "milion" g + } ; + size = pl + } ; + +lin pot4plus n m = { + s = \\c,f,_ => (pot4 n).s ! c ! f ! indep ++ m.s ! c ! f ! attr ; + size = m.size + } ; + +lin pot4decimal d = { + s = \\_,_,_ => d.s ! NCard Masc ++ "milioane" ; + size = pl + } ; + lin pot4as5 n = n ; +lin pot51 = { + s = table { + NCard g => \\_,_ => "un miliard" ; + NOrd g => \\_,_ => mkOrdinalForm "miliard" g + } ; + size = pl + } ; + +lin pot5 n = { + s = table { + NCard g => \\f,_ => n.s ! NCard Masc ! f ! indep ++ "miliarde" ; + NOrd g => \\f,_ => n.s ! NCard Masc ! f ! indep ++ mkOrdinalForm "miliard" g + } ; + size = pl + } ; + +lin pot5plus n m = { + s = \\c,f,_ => (pot5 n).s ! c ! f ! indep ++ m.s ! c ! f ! attr ; + size = m.size + } ; + +lin pot5decimal d = { + s = \\_,_,_ => d.s ! NCard Masc ++ "miliarde" ; + size = pl + } ; + oper mksute : Size -> Str = \sz -> table {sg => "sută" ; _ => "sute" } ! sz ; oper mkSute : Size -> Gender -> Str = \sz, g -> table {sg => mkOrdinalForm "sută" g ; diff --git a/src/romanian/PhraseRon.gf b/src/romanian/PhraseRon.gf index 6f8ee83c6..87318273d 100644 --- a/src/romanian/PhraseRon.gf +++ b/src/romanian/PhraseRon.gf @@ -17,7 +17,7 @@ UttIAdv iadv = iadv ; UttNP np = {s = (np.s ! No).comp} ; UttVP vp = let a = agrP3 Masc Sg in - {s = "sã" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos} ; + {s = "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos} ; UttAdv adv = adv ; UttCN cn = {s = cn.s ! Sg ! Indef ! ANomAcc} ; UttAP ap = {s = ap.s ! AF Masc Sg Indef ANomAcc} ; diff --git a/src/romanian/ResRon.gf b/src/romanian/ResRon.gf index 9c236bd47..177d08138 100644 --- a/src/romanian/ResRon.gf +++ b/src/romanian/ResRon.gf @@ -375,6 +375,10 @@ oper Imperative => mma }}; + bindAfterHyphen : Str -> Str = \s -> s ++ BIND ; + + bindBeforeHyphen : Str -> Str = \s -> BIND ++ s ; + genCliticsCase : Agr -> NCase -> {s : Clitics => Str} = \agr, c -> case c of {Da => cliticsDa agr.g agr.n agr.p ; @@ -384,29 +388,29 @@ oper aRefl : Agr -> RAgr = \a -> case of - {<_,_,P3> => {s = (genClit "se" "s-" "se" "").s } ; + {<_,_,P3> => {s = (genClit "se" (bindAfterHyphen "s-") "se" "").s } ; _ => {s = (cliticsAc a.g a.n a.p).s } }; dRefl : Agr -> RAgr = \a -> case of - {<_,_,P3> => {s = (genClit "îşi" "-ÅŸi" "ÅŸi" "").s } ; + {<_,_,P3> => {s = (genClit "îşi" (bindBeforeHyphen "-ÅŸi") "ÅŸi" "").s } ; _ => {s = (cliticsDa a.g a.n a.p).s } }; 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" + {<_,Sg,P1> => genClit "mă" (bindAfterHyphen "m-") "mă" (bindBeforeHyphen "-mă"); <_,Pl,P1> => genClit "ne" (bindAfterHyphen "ne-") "ne" (bindBeforeHyphen "-ne"); + <_,Sg,P2> => genClit "te" (bindAfterHyphen "te-") "te" (bindBeforeHyphen "-te"); <_,Pl,P2> => genClit "vă" (bindAfterHyphen "v-") "vă" (bindBeforeHyphen "-vă"); + => genClit "îl" (bindAfterHyphen "l-") (bindBeforeHyphen "-l") (bindBeforeHyphen "-l"); => genClit "îi" (bindAfterHyphen "i-") (bindBeforeHyphen "-i") (bindBeforeHyphen "-i"); + => genClit "o" (bindBeforeHyphen "-o") (bindBeforeHyphen "-o") (bindBeforeHyphen "-o"); => genClit "le" (bindAfterHyphen "le-") "le" (bindBeforeHyphen "-le") }; 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" + {<_,Sg,P1> => genClit "îmi" (bindAfterHyphen "mi-") "mi" (bindBeforeHyphen "-mi"); <_,Pl,P1> => genClit "ne" (bindAfterHyphen "ne-") "ni" (bindBeforeHyphen "-ne"); + <_,Sg,P2> => genClit "îţi" (bindAfterHyphen "Å£i-") "Å£i" (bindBeforeHyphen "-Å£i"); <_,Pl,P2> => genClit "vă" (bindAfterHyphen "v-") "vi" (bindBeforeHyphen "-vă"); + <_,Sg,P3> => genClit "îi" (bindAfterHyphen "i-") "i" (bindBeforeHyphen "-i"); <_,Pl,P3> => genClit "le" (bindAfterHyphen "le-") "li" (bindBeforeHyphen "-le") }; diff --git a/src/romanian/SentenceRon.gf b/src/romanian/SentenceRon.gf index 98261109c..6eac3d8e4 100644 --- a/src/romanian/SentenceRon.gf +++ b/src/romanian/SentenceRon.gf @@ -24,8 +24,8 @@ _ => 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 + {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; @@ -72,7 +72,7 @@ EmbedQS qs = {s = qs.s ! QIndir} ; EmbedVP vp = let a = agrP3 Masc Sg in - { s= "sã" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos }; + { s= "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++vp.comp ! a ++ vp.ext ! Pos }; UseCl t p cl = { s = \\o => t.s ++ p.s ++ cl.s ! DDir ! t.t ! t.a ! p.p ! o @@ -99,6 +99,9 @@ s = \\o => s.s ! o ++ "," ++ r.s ! Indic ! agrP3 Masc Sg } ; + SSubjS s1 subj s2 = {s = \\m => s1.s ! m ++ subj.s ++ s2.s ! m} ; + AdvImp adv imp = {s = \\p,f,g => adv.s ++ imp.s ! p ! f ! g} ; + oper putClit : Agr -> ParClit -> VP -> VP = \ag, pc, vp -> let nrC = nextClit vp.nrClit pc in case pc of diff --git a/src/romanian/VerbRon.gf b/src/romanian/VerbRon.gf index b60842c83..edeee8bfd 100644 --- a/src/romanian/VerbRon.gf +++ b/src/romanian/VerbRon.gf @@ -7,7 +7,7 @@ concrete VerbRon of Verb = lin UseV = useVerb ; - 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) (useVerb v) ; + 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) (useVerb v) ; ComplVS v s = insertExtrapos (\\b => conjThat ++ s.s ! (v.m ! b)) (predV v) ; @@ -69,7 +69,7 @@ concrete VerbRon of Verb = -- 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) (useVerb v)) ** {needAgr = True ; needClit = True ;c2 = v.c2} ; + 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) (useVerb v)) ** {needAgr = True ; needClit = True ;c2 = v.c2} ; SlashV2S v s = (insertExtrapos (\\b => conjThat ++ s.s ! Indic) (useVerb v)) ** {needAgr = False; needClit = True ;c2 = v.c2}; @@ -141,7 +141,7 @@ concrete VerbRon of Verb = 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) ((useVerb v) **{c2=vp.c2; needAgr= vp.needAgr ; needClit = False; lock_VPSlash = <>}) ; + insertObjc (\\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp a ++ vp.comp ! a ++ vp.ext ! Pos) ((useVerb v) **{c2=vp.c2; needAgr= vp.needAgr ; needClit = False; lock_VPSlash = <>}) ; SlashV2VNP v np vp = let s1 = v.c2.s ++(np.s ! (v.c2.c)).comp ; ss = case np.nForm of @@ -178,6 +178,14 @@ concrete VerbRon of Verb = AdvVP vp adv = insertAdv adv.s vp ; AdVVP adv vp = insertAdv adv.s vp ; + ExtAdvVP vp adv = insertAdv (SOFT_BIND ++ "," ++ adv.s) vp ; + AdvVPSlash vp adv = (insertAdv adv.s vp) ** { + c2 = vp.c2 ; needAgr = vp.needAgr ; needClit = vp.needClit ; lock_VPSlash = <> + } ; + AdVVPSlash adv vp = (insertAdv adv.s vp) ** { + c2 = vp.c2 ; needAgr = vp.needAgr ; needClit = vp.needClit ; lock_VPSlash = <> + } ; + PassV2 v = insertSimpObj (\\a => v.s ! PPasse a.g a.n Indef ANomAcc) auxPassive ** {lock_VP = <>}; VPSlashPrep vp prep = vp ** {c2 = prep ; needAgr = False; needClit = True} ; ---- AR @@ -193,6 +201,6 @@ insertObjc : (Agr => Str) -> VPSlash -> VPSlash = \obj,vp -> 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}; + {s = \\a => "să" ++ (flattenSimpleClitics vp.nrClit vp.clAcc vp.clDat (vp.isRefl ! a)) ++ conjVP vp ag ++ vp.comp ! a ++ vp.ext ! Pos}; };