From 0d3591ca08aa5a589fb5149ef2383112c6681c16 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Wed, 30 Sep 2026 08:34:08 +0200 Subject: [PATCH] changes suggested by Codex --- src/afrikaans/AllAfr.gf | 3 +- src/afrikaans/AllAfrAbs.gf | 2 +- src/afrikaans/CatAfr.gf | 2 +- src/afrikaans/ExtendAfr.gf | 17 +++-- src/afrikaans/IdiomAfr.gf | 3 +- src/afrikaans/NounAfr.gf | 4 +- src/afrikaans/ParadigmsAfr.gf | 7 +- src/afrikaans/PhraseAfr.gf | 2 +- src/afrikaans/ResAfr.gf | 114 +++++++++++++++++++++++++-------- src/afrikaans/SentenceAfr.gf | 16 +++-- src/afrikaans/StructuralAfr.gf | 4 +- src/afrikaans/VerbAfr.gf | 5 +- 12 files changed, 125 insertions(+), 54 deletions(-) diff --git a/src/afrikaans/AllAfr.gf b/src/afrikaans/AllAfr.gf index 08c762c1..33b7a99b 100644 --- a/src/afrikaans/AllAfr.gf +++ b/src/afrikaans/AllAfr.gf @@ -4,8 +4,7 @@ concrete AllAfr of AllAfrAbs = LangAfr, IrregAfr, ExtendAfr - ** -{ + ** open ExtraAfr in { --{} ; } diff --git a/src/afrikaans/AllAfrAbs.gf b/src/afrikaans/AllAfrAbs.gf index 166beb49..1d972176 100644 --- a/src/afrikaans/AllAfrAbs.gf +++ b/src/afrikaans/AllAfrAbs.gf @@ -3,7 +3,7 @@ abstract AllAfrAbs = Lang, IrregAfrAbs, - ExtraAfrAbs + Extend ** { --{} ; diff --git a/src/afrikaans/CatAfr.gf b/src/afrikaans/CatAfr.gf index dddcd6ad..8531b64d 100644 --- a/src/afrikaans/CatAfr.gf +++ b/src/afrikaans/CatAfr.gf @@ -92,7 +92,7 @@ concrete CatAfr of Cat = lindef VPSlash = \s -> { - s = {s = \\_ => s; prefix = ""; aux = VHebben; vtype = VAct} ; + s = {s = \\_ => s; prefix = ""; hasPrefix = False; hasPast = False; aux = VHebben; vtype = VAct} ; a1 = \\_ => "" ; n0 = \\_ => "" ; n2 = \\_ => "" ; diff --git a/src/afrikaans/ExtendAfr.gf b/src/afrikaans/ExtendAfr.gf index e60514bc..e7ea12aa 100644 --- a/src/afrikaans/ExtendAfr.gf +++ b/src/afrikaans/ExtendAfr.gf @@ -109,7 +109,7 @@ lin GenModNP num np cn = heavyNP { isPre = True } ; PastPartAgentAP vp np = { - s = \\_ => partVP vp (agrP3 Sg) ++ "door" ++ np.s ! NPAcc ; + s = \\_ => partVP vp (agrP3 Sg) ++ "deur" ++ np.s ! NPAcc ; isPre = False } ; ProgrVPSlash vp = vp ; @@ -121,12 +121,12 @@ lin GenModNP num np cn = heavyNP { s = \\_ => infVPString vp (agrP3 Sg) ; a = agrP3 Sg } ; - GerundAdv vp = {s = "door" ++ infVPString vp (agrP3 Sg)} ; - ByVP vp = {s = "door" ++ infVPString vp (agrP3 Sg)} ; - InOrderToVP vp = {s = "om" ++ infVPString vp (agrP3 Sg)} ; + GerundAdv vp = {s = "deur" ++ infVPBody vp (agrP3 Sg)} ; + ByVP vp = {s = "deur" ++ infVPBody vp (agrP3 Sg)} ; + InOrderToVP vp = {s = infVPString vp (agrP3 Sg)} ; ApposNP np1 np2 = heavyNP { - s = \\c => np1.s ! c ++ "," ++ np2.s ! c ; + s = \\c => np1.s ! c ++ bindComma ++ np2.s ! c ; a = np1.a } ; PositAdVAdj a = {s = a.s ! Posit ! APred} ; @@ -155,11 +155,14 @@ lin BaseImp = twoTable2 Polarity ImpForm ; lin PassVPSlash vps = insertInf (vps.s.s ! VPerf) (predV word_V) ; PassAgentVPSlash vps np = - insertAdv (appPrep "door" np.s) (insertInf (vps.s.s ! VPerf) (predV word_V)) ; + insertAdv (appPrep "deur" np.s) (insertInf (vps.s.s ! VPerf) (predV word_V)) ; oper infVPString : ResAfr.VP -> Agr -> Str = \vp,a -> - "om" ++ vp.n0 ! a ++ vp.n2 ! a ++ vp.a2 ++ "te" ++ + "om" ++ infVPBody vp a ; + + infVPBody : ResAfr.VP -> Agr -> Str = \vp,a -> + vp.n0 ! a ++ vp.n2 ! a ++ vp.a2 ++ vp.s.prefix ++ "te" ++ vp.s.s ! VInf ++ vp.inf.p1 ++ vp.ext ; partVP : ResAfr.VP -> Agr -> Str = \vp,a -> diff --git a/src/afrikaans/IdiomAfr.gf b/src/afrikaans/IdiomAfr.gf index 158759b2..c0aff532 100644 --- a/src/afrikaans/IdiomAfr.gf +++ b/src/afrikaans/IdiomAfr.gf @@ -54,7 +54,8 @@ concrete IdiomAfr of Idiom = CatAfr ** a = np.a } ; - ProgrVP vp = insertAdv ("aan" ++ "die" ++ useInfVP True vp) (predV zijn_V) ; --afr + ProgrVP vp = insertExtrapos (useInfVP False vp) + (insertObj (\\_ => "besig") (predV zijn_V)) ; ImpPl1 vp = let diff --git a/src/afrikaans/NounAfr.gf b/src/afrikaans/NounAfr.gf index 1dada391..e61408ad 100644 --- a/src/afrikaans/NounAfr.gf +++ b/src/afrikaans/NounAfr.gf @@ -40,7 +40,7 @@ concrete NounAfr of Noun = CatAfr ** open ResAfr, Prelude in { } ; ExtAdvNP np adv = heavyNP { - s = \\c => np.s ! c ++ "," ++ adv.s ++ "," ; + s = \\c => np.s ! c ++ embedInCommas adv.s ; a = np.a } ; @@ -163,7 +163,7 @@ concrete NounAfr of Noun = CatAfr ** open ResAfr, Prelude in { } ; RelNP np rs = { - s = \\c => np.s ! c ++ "," ++ rs.s ! np.a.g ! np.a.n ; + s = \\c => np.s ! c ++ bindComma ++ rs.s ! np.a.g ! np.a.n ; a = np.a ; isPron = False } ; diff --git a/src/afrikaans/ParadigmsAfr.gf b/src/afrikaans/ParadigmsAfr.gf index 8926c9f2..275ef791 100644 --- a/src/afrikaans/ParadigmsAfr.gf +++ b/src/afrikaans/ParadigmsAfr.gf @@ -243,11 +243,14 @@ oper mkV : (breek,gebreek : Str) -> V = \a,b -> lin V (v2vv (irregVerb a b)) ; mkV : (wil,wou,gewil : Str) -> V = - \a,b,c -> lin V (v2vv (mkVerb a a b c)) ; + \a,b,c -> lin V (v2vvPast (mkVerb a a b c)) ; mkV : Str -> V -> V = \v,s ->lin V (prefixV v s) ; } ; zijnV v = v ; -- lin V (v2vvAux v VZijn) ; - reflV v = lin V {s = v.s ; aux = v.aux ; prefix = v.prefix ; vtype = VRefl} ; + reflV v = lin V { + s = v.s ; aux = v.aux ; prefix = v.prefix ; hasPrefix = v.hasPrefix ; + hasPast = v.hasPast ; vtype = VRefl + } ; zijn_V : V = lin V ResAfr.zijn_V ; hebben_V : V = lin V ResAfr.hebben_V ; diff --git a/src/afrikaans/PhraseAfr.gf b/src/afrikaans/PhraseAfr.gf index 4349c26b..4b7e4cab 100644 --- a/src/afrikaans/PhraseAfr.gf +++ b/src/afrikaans/PhraseAfr.gf @@ -26,6 +26,6 @@ concrete PhraseAfr of Phrase = CatAfr ** open Prelude, ResAfr in PConjConj conj = ss (conj.s2) ; NoVoc = {s = []} ; - VocNP np = {s = "," ++ np.s ! NPNom} ; + VocNP np = {s = bindComma ++ np.s ! NPNom} ; } diff --git a/src/afrikaans/ResAfr.gf b/src/afrikaans/ResAfr.gf index bb5784de..12dbb1d7 100644 --- a/src/afrikaans/ResAfr.gf +++ b/src/afrikaans/ResAfr.gf @@ -58,6 +58,9 @@ resource ResAfr = ParamX ** open Prelude in { b + v@("ei"|"eu"|"oe"|"ou"|"ie"|"y"|"ui") + "g" => mkNoun s (b + v + "e") Neutr ; --tuig, tuie --R13.1 _ + ("oir" | "ion" | "je") => mkNoun s (s + "s") Neutr ; --uit Nederlandse reël + + b + "heid" => mkNoun s (b + "hede") Neutr ; + _ + "teit" => mkNoun s (s + "e") Neutr ; _ + ("rm" | "lm") => mkNoun s (s + "s") Neutr ; --R13.3 @@ -120,8 +123,9 @@ resource ResAfr = ParamX ** open Prelude in { b + v@("aal"|"baar"|"eel"|"loos") => b + init (init v) + last v + "e" ; --p288 _ + ("agtig"|"ant"|"ent"|"êr"|"ies"|"ig"|"lik"|"matig"|"s") => s + "e" ; --p288 b + "ief" => b + "iewe" ; --p288 + + _ + "af" => s ; -- compounds such as kortaf - --b + ("ei"|"eu"|"oe"|"ou"|"ie"|"y"|"ui") + ? => endCons s + "e" ; b + v@("ou"|"y") + "d" => b + v + "e" ; --koud, koue / wyd, wye --b + v@("oo"|"ee") + "d" => b + init v + "ë" ; --leeg, leë @@ -132,6 +136,7 @@ resource ResAfr = ParamX ** open Prelude in { b + v@("aa"|"ee"|"oo"|"uu") + "r" => s ; --duur, duur b + v@("aa"|"ee"|"oo"|"uu") + c@#cons => b + shortVoc v c + "e" ; --gaaf, gawe + b + ("ei"|"eu"|"oe"|"ou"|"ie"|"y"|"ui") + ? => endCons s + "e" ; b + v@("a"|"e"|"i"|"o"|"u" ) + "f" => b + v + "ww" + "e" ; --grof, growwe --b + v@("a"|"e"|"i"|"o"|"u" ) + c@? => b + v + c + c + "e" ; --stom, growwe _ + "d" => s + "e" ; --p286 @@ -175,12 +180,19 @@ resource ResAfr = ParamX ** open Prelude in { s = table { VInf => aaien; -- hij/zij/het/wij aaien VPres => aai; -- ik aai - VPast => aai; -- ik aaide --# notpresent --!afr! lyk vir nou soos VPres + VPast => aaide; --# notpresent VPerf => geaaid -- ik heb geaaid } }; - regVerb : Str -> Verb = \s -> irregVerb s ("ge" + s) ; + regVerb : Str -> Verb = \s -> + let perf : Str = case s of { + ("be" | "ge" | "her" | "er" | "ont" | "ver") + _ => s ; + "e" + r => "geë" + r ; + "i" + r => "geï" + r ; + _ => "ge" + s + } + in irregVerb s perf ; irregVerb : (breek, gebreek : Str) -> Verb = \breek,gebreek -> mkVerb breek breek breek gebreek ; @@ -195,10 +207,12 @@ resource ResAfr = ParamX ** open Prelude in { if_then_Str b (ein + geb) geb ; in {s = table { - f@(VInf | VPerf) => ein + vs ! f ; ---- TODO: eingegeven + VPerf => ein + vs ! VPerf ; ---- TODO: eingegeven f => vs ! f } ; prefix = ein ; + hasPrefix = True ; + hasPast = verb.hasPast ; aux = verb.aux ; vtype = verb.vtype } ; @@ -211,18 +225,22 @@ resource ResAfr = ParamX ** open Prelude in { } ; aux = VZijn ; prefix = [] ; + hasPrefix = False ; + hasPast = True ; vtype = VAct ; } ; hebben_V : VVerb = { s = table { - VInf => "het" ; + VInf => "hê" ; VPres => "het" ; VPast => "het" ; --# notpresent VPerf => "gehad" } ; aux = VHebben ; prefix = [] ; + hasPrefix = False ; + hasPast = False ; vtype = VAct ; } ; @@ -241,6 +259,8 @@ resource ResAfr = ParamX ** open Prelude in { } ; aux = VHebben ; prefix = [] ; + hasPrefix = False ; + hasPast = True ; vtype = VAct ; } ; @@ -248,11 +268,13 @@ resource ResAfr = ParamX ** open Prelude in { s = table { VInf => "word" ; VPres => "word" ; - VPast => "word" ; --# notpresent - VPerf => "geword" + VPast => "is" ; --# notpresent + VPerf => [] } ; - aux = VHebben ; + aux = VZijn ; prefix = [] ; + hasPrefix = False ; + hasPast = True ; vtype = VAct ; } ; @@ -273,15 +295,18 @@ param Adjf = Strong | Weak ; - oper VVerb = Verb ** {prefix : Str ; aux : VAux ; vtype : VType} ; + oper VVerb = Verb ** { + prefix : Str ; hasPrefix : Bool ; hasPast : Bool ; aux : VAux ; vtype : VType + } ; param VAux = VHebben | VZijn ; param VType = VAct | VRefl ; oper v2vvAux : Verb -> VAux -> VVerb = \v,a -> - {s = v.s ; aux = a ; prefix = [] ; vtype = VAct} ; + {s = v.s ; aux = a ; prefix = [] ; hasPrefix = False ; hasPast = False ; vtype = VAct} ; v2vv : Verb -> VVerb = \v -> v2vvAux v VHebben ; + v2vvPast : Verb -> VVerb = \v -> (v2vvAux v VHebben) ** {hasPast = True} ; @@ -325,11 +350,10 @@ param -- Used in $NounAfr$. - agrAdj : Gender -> Adjf -> NForm -> AForm = \g,a,n -> - case of { - => APred ; - _ => AAttr - } ; + -- Afrikaans attributive agreement does not depend on the article in the + -- way Dutch/German strong and weak agreement does. The adjective's + -- lexical paradigm determines whether its attributive form has -e. + agrAdj : Gender -> Adjf -> NForm -> AForm = \_,_,_ -> AAttr ; oper VP : Type = { s : VVerb ; @@ -440,30 +464,47 @@ param auxv = (auxVerb vp.s.aux).s ; vperf = vp.s.s ! VPerf ; verb : Str * Str = case of { - => ; --# notpresent + => ; --# notpresent => ; --# notpresent + => case vp.s.hasPast of { + True => ; + False => + } ; <_, Anter> => ; --# notpresent <_, Simul> => } ; - fin = verb.p1 ; + fin = case of { + => joinPrefix vp.s.hasPrefix vp.s.prefix verb.p1 ; + => joinPrefix vp.s.hasPrefix vp.s.prefix verb.p1 ; + _ => verb.p1 + } ; neg = vp.a1 ! b ; + tailNeg = case b of {Pos => [] ; Neg => "nie"} ; obj0 = vp.n0 ! agr ; obj = vp.n2 ! agr ; - compl = obj0 ++ neg ++ obj ++ vp.a2 ++ vp.s.prefix ; + pref = case of { + => vp.s.prefix ; + => vp.s.prefix ; + _ => [] + } ; + compl = obj0 ++ neg ++ obj ++ vp.a2 ++ pref ; inf = case of { --# notpresent => vp.s.s ! VInf ++ vp.inf.p1 ; --# notpresent - _ => --# notpresent - vp.inf.p1 ++ verb.p2 ++ neg + _ => case of { + => vp.inf.p1 ++ verb.p2 ++ tailNeg ; + _ => verb.p2 ++ vp.inf.p1 ++ tailNeg + } } --# notpresent ; extra = vp.ext ; inffin = - case of { --# notpresent - => fin ++ inf ; -- double inf --# notpresent - _ => --# notpresent - inf ++ fin --- or just auxiliary vp - } --# notpresent + case of { + => fin ++ inf ; + <_,True,_,_> => fin ++ inf ; + => fin ++ inf ; + _ => inf ++ fin + } in case o of { Main => subj ++ fin ++ compl ++ inf ++ extra ; @@ -477,17 +518,34 @@ param VZijn => zijn_V } ; + -- Separable prefixes are joined to the verb in subordinate clauses and + -- infinitives. An unconditional BIND is not safe here: with an empty + -- prefix it binds the preceding constituent to the verb (e.g. *hy salgaan). + joinPrefix : Bool -> Str -> Str -> Str = \has,p,v -> case has of { + False => v ; + True => p ++ BIND ++ v + } ; + infVP : Bool -> VP -> ((Agr => Str) * Str * Str) = \isAux, vp -> < \\agr => vp.n0 ! agr ++ vp.n2 ! agr ++ vp.a2, vp.a1 ! Pos ++ - if_then_Str isAux [] "om" ++ "te" ++ vp.s.s ! VInf, + case isAux of { + True => joinPrefix vp.s.hasPrefix vp.s.prefix (vp.s.s ! VInf) ; + False => "om" ++ vp.s.prefix ++ "te" ++ vp.s.s ! VInf + }, vp.inf.p1 ++ vp.ext > ; useInfVP : Bool -> VP -> Str = \isAux,vp -> - let vpi = infVP isAux vp in - vpi.p1 ! agrP3 Sg ++ vpi.p3 ++ vpi.p2 ; + let a = agrP3 Sg ; + obj = vp.n0 ! a ++ vp.n2 ! a ++ vp.a2 + in case isAux of { + True => obj ++ joinPrefix vp.s.hasPrefix vp.s.prefix (vp.s.s ! VInf) ++ + vp.inf.p1 ++ vp.ext ; + False => "om" ++ obj ++ vp.s.prefix ++ "te" ++ vp.s.s ! VInf ++ + vp.inf.p1 ++ vp.ext + } ; reflPron : Agr => Str = table { {n = Sg ; p = P1} => "my" ; --afr diff --git a/src/afrikaans/SentenceAfr.gf b/src/afrikaans/SentenceAfr.gf index c7852f0a..7d555c1d 100644 --- a/src/afrikaans/SentenceAfr.gf +++ b/src/afrikaans/SentenceAfr.gf @@ -21,7 +21,7 @@ concrete SentenceAfr of Sentence = CatAfr ** open ResAfr, Prelude in { inf = vp.inf.p1 ; in verb ++ ps.p2 ++ - vp.n2 ! agr ++ vp.a1 ! pol ++ vp.a2 ++ inf ++ vp.ext + vp.n2 ! agr ++ vp.a1 ! pol ++ vp.a2 ++ vp.s.prefix ++ inf ++ vp.ext } ; SlashVP np vp = @@ -60,18 +60,24 @@ concrete SentenceAfr of Sentence = CatAfr ** open ResAfr, Prelude in { c2 = cl.c2 } ; - AdvS a s = {s = \\o => a.s ++ s.s ! Inv} ; + AdvS a s = {s = \\o => a.s ++ s.s ! case o of { + Sub => Sub ; + _ => Inv + }} ; - ExtAdvS a s = {s = \\o => a.s ++ "," ++ s.s ! Inv} ; + ExtAdvS a s = {s = \\o => a.s ++ bindComma ++ s.s ! case o of { + Sub => Sub ; + _ => Inv + }} ; SSubjS s1 subj s2 = { - s = \\o => s1.s ! o ++ "," ++ subj.s ++ s2.s ! Sub + s = \\o => s1.s ! o ++ bindComma ++ subj.s ++ s2.s ! Sub } ; AdvImp adv imp = { s = \\p,i => adv.s ++ imp.s ! p ! i } ; - RelS s r = {s = \\o => s.s ! o ++ "," ++ r.s ! Neutr ! Sg} ; + RelS s r = {s = \\o => s.s ! o ++ bindComma ++ r.s ! Neutr ! Sg} ; } diff --git a/src/afrikaans/StructuralAfr.gf b/src/afrikaans/StructuralAfr.gf index adb7ca6c..ffac0c78 100644 --- a/src/afrikaans/StructuralAfr.gf +++ b/src/afrikaans/StructuralAfr.gf @@ -23,11 +23,11 @@ concrete StructuralAfr of Structural = CatAfr, Prelude ** but_PConj = ss "maar" ; by8agent_Prep = mkPrep "deur" ; by8means_Prep = mkPrep "met" ; - can8know_VV, can_VV = auxVV (mkV "kan" "kon") ; + can8know_VV, can_VV = auxVV (mkV "kan" "kon" "gekon") ; during_Prep = mkPrep "tydens" ; either7or_DConj = {s1 = "òf" ; s2 = "òf" ; n = Pl} ; everybody_NP = mkNP "almal" Neutr Pl ; ---- - every_Det = mkDet "elke" "elk" Sg ; ---- + every_Det = mkDet "elke" "elke" Sg ; everything_NP = mkNP "alles" Neutr Sg ; ---- everywhere_Adv = ss "oral" ; few_Det = mkDet "min" "min" Pl ; diff --git a/src/afrikaans/VerbAfr.gf b/src/afrikaans/VerbAfr.gf index e2fae681..67ad8719 100644 --- a/src/afrikaans/VerbAfr.gf +++ b/src/afrikaans/VerbAfr.gf @@ -78,7 +78,7 @@ concrete VerbAfr of Verb = CatAfr ** open Prelude, ResAfr in { CompAdv a = {s = \\_ => a.s} ; AdvVP vp adv = insertAdv adv.s vp ; - ExtAdvVP vp adv = insertAdv ("," ++ adv.s ++ ",") vp ; + ExtAdvVP vp adv = insertAdv (embedInCommas adv.s) vp ; AdVVP adv vp = insertAdV adv.s vp ; AdvVPSlash vp adv = vp ** {a2 = vp.a2 ++ adv.s} ; @@ -93,6 +93,7 @@ concrete VerbAfr of Verb = CatAfr ** open Prelude, ResAfr in { ---- workaround for a subtyping bug oper v2v : VVerb -> VVerb = \v -> - {s = v.s ; aux = v.aux ; prefix = v.prefix ; vtype = v.vtype} ; + {s = v.s ; aux = v.aux ; prefix = v.prefix ; hasPrefix = v.hasPrefix ; + hasPast = v.hasPast ; vtype = v.vtype} ; predVv : VVerb -> ResAfr.VP = \v -> predV (v2v v) ; }