From d4c45762333bbaa490cb05e20ac70a85f6f633c6 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Fri, 28 Aug 2026 18:39:03 +0000 Subject: [PATCH 01/12] Drop the person variant from appositions and parentheses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NlSkýring, NlSkýringKomma and SvigaInnihald carried /pers, so every apposition and parenthetical noun phrase was compiled in four persons. The only person-dependent element inside them is the relative clause of a parenthesis ("(sem ég er fylgjandi)"); a census of 10,000 parsed news sentences shows 1st/2nd person winning there 3 times in total, versus ~50 for relative clauses attached directly to the noun phrase, which keep their person. Make the appositional family third-person only, with the parenthetical relative clause fixed to p3. The compiled grammar shrinks from 7,564 to 7,276 nonterminals and from 28,016 to 26,921 productions. On the 1,000-sentence baseline, 3 trees change (score ties), none lost. Engine and GreynirCorrect test suites pass. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 7dbe6c2..ee40df5 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -5356,7 +5356,7 @@ NlEind_p3/fall/kyn → NlEind/tala/pers/fall/kyn → NlStak/tala/pers/fall/kyn StakViðhengi/tala/fall/kyn? TilvísunarsetningMeðKommu/tala/pers/kyn? - Þó/tala/pers/kyn? NlSkýring/tala/pers/fall/kyn? + Þó/tala/pers/kyn? NlSkýring/tala/fall/kyn? NlEind_et_p3/fall/kyn → NlEkkiHeldur_et/fall/kyn NlEind_ft_p3/fall/kyn → NlEkkiHeldur_ft/fall/kyn @@ -5431,28 +5431,30 @@ $tag(begin_prep_scope) ÞaðTenging ÞóBotn/tala/pers/kyn → FsRuna? LoLiður_nf/tala/kyn VeraVerða_vh/tala/pers -NlSkýring/tala/pers/fall/kyn → - "(" SvigaForskeyti? SvigaInnihald/tala/pers/fall/kyn ")" - | "[" SvigaForskeyti? SvigaInnihald/tala/pers/fall/kyn "]" - | "-:em" SvigaForskeyti? SvigaInnihald/tala/pers/fall/kyn "-:em" +# Skýringar (innskot) með nafnlið eru alltaf í 3. persónu; +# persóna nafnliðarins skiptir aðeins máli í tilvísunarsetningu innskotsins +NlSkýring/tala/fall/kyn → + "(" SvigaForskeyti? SvigaInnihald/tala/fall/kyn ")" + | "[" SvigaForskeyti? SvigaInnihald/tala/fall/kyn "]" + | "-:em" SvigaForskeyti? SvigaInnihald/tala/fall/kyn "-:em" | "," Skýring Skýringarliður LokatáknEðaKomma # (Verslunin þjónar fjölbreyttum markhópi), allt frá börnum til aldraðra, (og er vinsæl í hverfinu) | Samanburðarmerki Allt 'frá:fs'_þgf Nl_þgf 'til:fs'_ef Nl_ef LokatáknEðaKomma - | NlSkýringKomma/tala/pers/fall/kyn + | NlSkýringKomma/tala/fall/kyn -NlSkýringKomma/tala/pers/fall/kyn → - "," SvigaInnihald/tala/pers/fall/kyn LokatáknEðaKomma +NlSkýringKomma/tala/fall/kyn → + "," SvigaInnihald/tala/fall/kyn LokatáknEðaKomma # Draga úr skýringum sem eru ekki auðkenndar betur en með einfaldri kommu -$score(-10) NlSkýringKomma/tala/pers/fall/kyn +$score(-10) NlSkýringKomma/tala/fall/kyn # Gefa aukastig fyrir skýringar á nafnliðum -$score(+6) NlSkýring/tala/pers/fall/kyn +$score(+6) NlSkýring/tala/fall/kyn -SvigaInnihald/tala/pers/fall/kyn → +SvigaInnihald/tala/fall/kyn → Árabil - > Tilvísunarsetning/tala/pers/kyn # (og sem ég er almennt fylgjandi) + > Tilvísunarsetning/tala/p3/kyn # (og sem er almennt fylgjandi) > Nl/fall/tala # 'Ég spurði forsætisráðherra, Sigmund Davíð, um málið' > Nl/fall # Sama fall en ekki sama tala > SvigaInnihaldFsRuna From b32135629be6b65af51e96378d8902b09e322d98 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Fri, 28 Aug 2026 19:15:01 +0000 Subject: [PATCH 02/12] Reach the wrong-case apposition fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fallback that lets an apposition or parenthesis in the wrong case parse with an error tag ("Ég ræddi við forsætisráðherra (Sigmundur Davíð)") was defined under the misspelt name Svigainnihald_* and thus never referenced, although GreynirCorrect still has the handler for its AðvörunSvigaInnihaldNl node. Attach it as the last, lowest-priority alternative of SvigaInnihald via a per-case helper. A separate definition block would have gotten top priority and pruned the correct readings, since the priority counter of a block is not shared with the generic definition. On the 1000-sentence baseline 2 trees change, both improved (a parenthesis "( átta )" now attaches as an apposition instead of forcing a heading analysis). Engine and GreynirCorrect suites pass. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index ee40df5..bc8defe 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -5459,12 +5459,15 @@ SvigaInnihald/tala/fall/kyn → > Nl/fall # Sama fall en ekki sama tala > SvigaInnihaldFsRuna > HreinYfirsetning - -# Ef ekki finnst sama fall og tala, prófa almennan nafnlið -Svigainnihald_nf/tala/pers/kyn → AðvörunSvigaInnihaldNl/fallxnf -Svigainnihald_þf/tala/pers/kyn → AðvörunSvigaInnihaldNl/fallxþf -Svigainnihald_þgf/tala/pers/kyn → AðvörunSvigaInnihaldNl/fallxþgf -Svigainnihald_ef/tala/pers/kyn → AðvörunSvigaInnihaldNl/fallxef + # Ef ekki finnst sama fall og tala, prófa nafnlið í öðru falli (villa). + # Þetta verður að vera aftast í forgangsröðinni hér, þar sem sérstök + # skilgreining (SvigaInnihald_nf/tala/kyn → ...) fengi hæsta forgang. + > SvigaInnihaldAnnaðFall/fall + +SvigaInnihaldAnnaðFall_nf → AðvörunSvigaInnihaldNl/fallxnf +SvigaInnihaldAnnaðFall_þf → AðvörunSvigaInnihaldNl/fallxþf +SvigaInnihaldAnnaðFall_þgf → AðvörunSvigaInnihaldNl/fallxþgf +SvigaInnihaldAnnaðFall_ef → AðvörunSvigaInnihaldNl/fallxef # Árabil nota en-dash From a1277c122fc7e5caa00077150a79e7bcd7341b25 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Fri, 28 Aug 2026 19:15:01 +0000 Subject: [PATCH 03/12] Fix constructions that never won a parse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A usage census over 10,000 parsed news sentences found nonterminals that never appeared in a winning tree. Four of them were meant to fire on ordinary prose and lost to a wrong analysis or could not match: - "sem:ao" does not exist in BÍN ('sem' is st or fs), so SemStendur ("sem stendur"), LoSem ("sem jöfnustu"), "svo sem" and one "sem sagt" could never match. Use "sem:st". - HjSögnLhNtFrumlag's first alternative ("Nú fer hælisleitendum fækkandi") lacked the dative subject, so the sentence was parsed with an impersonal verb instead. - HjSögnVantaSkorta ("Okkur þótti vanta mýkt") lost on score to a reading of 'vanta' as a noun; give it a bonus. - "undir eins" was read as 'undir' + the comparison "eins og". Make it a fixed phrase in Phrases.conf. On the 1000-sentence baseline 5 trees change: 3 score ties and 2 improvements (e.g. "vel viðráðanleg sem stendur" no longer becomes a relative clause), none lost. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 19 +++++++++++-------- src/reynir/config/Phrases.conf | 1 + test/test_parse.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index bc8defe..90452c4 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -3375,7 +3375,7 @@ HjSögnLhNt → # [Nú] fer hælisleitendum fækkandi # [Nú] hefur hælisleitendum farið fækkandi HjSögnLhNtFrumlag → - 'fara:so'_gm_p3_et + 'fara:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? # fer/fór/færi þeim [ekki] (fækkandi) | 'hafa:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'geta:so'_sagnb? 'fara:so'_sagnb # hefur/hafði/hefði þeim [ekki] [getað] farið (fækkandi) | 'geta:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'hafa:so'_nh? 'fara:so'_sagnb # getur/gat/gæti þeim [hafa] farið (fækkandi) | 'munu:so'_gm_p3_et NlFrumlag_þgf_ft FsAtv? 'fara:so'_nh # mun/myndi þeim [ekki] fara (fækkandi) @@ -3426,6 +3426,9 @@ HjSögnVantaSkorta → 'vanta:so'_nh # Okkur þykir/þótti vanta mýkt í rödd Pálínu | 'skorta:so'_nh # Páli þykir/þótti skorta samkvæmni í málflutningi Jóns +# Kjósum þessa greiningu fremur en að lesa 'vanta' sem nafnorð +$score(+8) HjSögnVantaSkorta + HjSögnFá/tala/pers → 'fá:so'_1_þf_gm/tala/pers # Páll fékk bílinn endurgreiddan | 'hafa:so'_gm/tala/pers 'fá:so'_gm_sagnb # Páll hefur fengið bílinn endurgreiddan @@ -5750,7 +5753,7 @@ LoMun/fall/tala/kyn → $score(+10) LoMun/fall/tala/kyn LoSem/fall/tala/kyn → - "sem:ao" lo_esb/fall/tala/kyn # (hvernig skuli stuðla að) sem jöfnustu hlutfalli + "sem:st" lo_esb/fall/tala/kyn # (hvernig skuli stuðla að) sem jöfnustu hlutfalli $score(+4) LoSem/fall/tala/kyn @@ -6491,9 +6494,9 @@ EinnAl → | 'einn:fn'_kvk_et_þf 'ferð:kvk'_þf_et_gr "enn:ao" # eina ferðina enn | "heima:ao" "fyrir:ao" | "hingað:ao" "til:ao" - | "sem:ao" 'segja:so'_lhþt_sb_hk_nf_et # sem sagt - | "svo:ao" "sem:ao" - | "sem:ao" "fyrst:ao" + | "sem:st" 'segja:so'_lhþt_sb_hk_nf_et # sem sagt + | "svo:ao" "sem:st" + | "sem:st" "fyrst:ao" | 'vinsamlegur:lo'_esb_nf_et_hk # (Þátttakendur eru) vinsamlegast (beðnir að fylla út eyðublað) | 'náðarsamlegur:lo'_esb_nf_et_hk # (Þátttakendur eru) náðarsamlegast (beðnir að fylla út eyðublað) | "mest:ao" Allra # (Ferðamönnum hefur fjölgað) mest allra @@ -6545,12 +6548,12 @@ $score(+8) FyrirLöngu # Sem stendur er hann ekki viðlátinn SemStendur → - "sem:ao" 'standa:so'_0_gm_fh_et_p3 + "sem:st" 'standa:so'_0_gm_fh_et_p3 $score(-6) SemStendur UndirEins → - "undir:ao" "eins:ao" # 'Ég fór undir eins og kannaði málið' + 'undir_eins:ao' # 'Ég fór undir eins og kannaði málið' (fasti frasinn 'undir eins' í Phrases.conf) $score(+4) UndirEins @@ -6626,7 +6629,7 @@ AtviksliðurEinkunn → eo # Einkunnarorð = atviksorð sem geta ekki jafnframt verið forsetningar | Aldur # Hin 29 ára gamla fyrirsæta | Allt "að:ao" # 'fjárfesta fyrir allt að 100 milljónir króna' - | "svo:ao" "sem:ao" # 'enda kemur kynlíf þeirra svo sem engum við' + | "svo:ao" "sem:st" # 'enda kemur kynlíf þeirra svo sem engum við' | "innan_við:fs" | "líkast:ao" "til:ao" | UmEðaYfir diff --git a/src/reynir/config/Phrases.conf b/src/reynir/config/Phrases.conf index 0df66e5..239a3fb 100644 --- a/src/reynir/config/Phrases.conf +++ b/src/reynir/config/Phrases.conf @@ -1382,6 +1382,7 @@ meaning = ao frasi - "á stangli", "aþ nheþ", "á stangl" "á ný", "aa aa", "á ný" +"undir eins", "aa aa", "undir eins" "hvað mest", "aa aae", "hvað mjög" "út og suður", "aa c aa", "út og suður" "heils hugar", "lkeesf nkee", "heill hugur" diff --git a/test/test_parse.py b/test/test_parse.py index 77ec5a6..43c3f00 100644 --- a/test/test_parse.py +++ b/test/test_parse.py @@ -2780,6 +2780,34 @@ def test_sagdur_hafa(r) -> None: assert "lhþt" in s.tree.flat, sentence +def test_never_winning_constructions(r) -> None: + """Constructions that a grammar usage census showed never won a parse, + because of a dead terminal ('sem:ao' does not exist in BÍN), a missing + subject in a production, or losing on score""" + # sem stendur / sem jöfnustu: 'sem' is a conjunction in BÍN, not an adverb + s = r.parse_single("Sem stendur er hann ekki viðlátinn.") + assert s and s.tree and "ADVP st VP so_0" in s.tree.flat, s.tree.flat if s.tree else None + s = r.parse_single("Stuðla skal að sem jöfnustu hlutfalli.") + assert s and s.tree and "st lo_" in s.tree.flat, s.tree.flat if s.tree else None + # undir eins: a fixed phrase, not 'undir' + a comparison + s = r.parse_single("Ég fór undir eins og kannaði málið.") + assert s and s.tree and "CP-ADV-CMP" not in s.tree.flat, s.tree.flat if s.tree else None + assert any(t.text.lower() == "undir eins" for t in s.tree.leaves) + # Nú fer hælisleitendum fækkandi: dative subject after the auxiliary + s = r.parse_single("Nú fer hælisleitendum fækkandi.") + assert s and s.tree and "NP-SUBJ no_ft_þgf_kk /NP-SUBJ" in s.tree.flat, ( + s.tree.flat if s.tree else None + ) + assert "subj_op" not in s.tree.flat + # Okkur þótti vanta mýkt: 'vanta' is the infinitive, 'mýkt' its object + s = r.parse_single("Okkur þótti vanta mýkt í rödd hennar.") + assert s and s.tree and "vanta" in s.tree.verbs, s.tree.flat if s.tree else None + assert "NP-OBJ no_et_þf_kvk" in s.tree.flat + # Apposition in the wrong case parses via the error fallback + s = r.parse_single("Ég ræddi við forsætisráðherra (Sigmundur Davíð) um málið.") + assert s and s.tree and "person_nf_kk person_nf_kk" in s.tree.flat + + if __name__ == "__main__": # When invoked as a main module, do a verbose test from reynir import Greynir @@ -2849,4 +2877,5 @@ def test_sagdur_hafa(r) -> None: test_quoted_question_attribution(g) test_thess_i_stad(g) test_sagdur_hafa(g) + test_never_winning_constructions(g) g.__class__.cleanup() From 7be82ff0b07ad1b0e3291945f8ce90cac222466a Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:30:04 +0000 Subject: [PATCH 04/12] =?UTF-8?q?Delete=20the=20redundant=20HjS=C3=B6gnVh?= =?UTF-8?q?=20helper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HjSögnVh matched singular subjunctive auxiliaries (hafi/gæti/mætti/ þætti/skyldi/myndi [ekki] hafa) in a single verb-initial impersonal alternative of SetningSoSagnliður. It never won a parse in a 10,000-sentence census, and all five of its canonical example sentences (including "Í dag gæti hafa rignt") parse identically via the generic auxiliary path, since so_et_p3 does not restrict mood. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 90452c4..70f8b36 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -1223,10 +1223,6 @@ SetningSoSagnliður → # Þarf til þess lagafyrirmæli að svipta mann réttindum | 'þurfa:so'_1_þf_gm_et_p3 FsAtv? NlBeintAndlag_þf AðLiður? - # (Því) hafi þurft að senda alla farþegana (á hótel) - # (Í dag) gæti hafa rignt - | FsAtv? HjSögnVh so_sagnb NhFylling? - # Þykir/finnst þeim vera slagsíða [í umfjölluninni] / þeim [það] ósanngjarnt | HjSögnFinnst NlFrumlag_þgf SögnFinnstBotn @@ -3091,17 +3087,6 @@ HjSögn_mm_nh → $tag(purge_verb) HjSögn_mm_nh -HjSögnVh → - 'hafa:so'_et_p3_vh # hafi þurft - | 'geta:so'_et_p3_vh # gæti þurft - | 'geta:so'_et_p3_vh FsAtv? 'hafa:so'_nh # gæti [ekki] hafa þurft - | 'mega:so'_et_p3_vh FsAtv? 'hafa:so'_nh # mætti [ekki] hafa þurft - | 'þykja:so'_et_p3_vh FsAtv? 'hafa:so'_nh # þætti [ekki] hafa þurft - | 'skulu:so'_et_p3_vh FsAtv? 'hafa:so'_nh # skyldi [ekki] hafa þurft - | 'munu:so'_et_p3_vh FsAtv? 'hafa:so'_nh # myndi [ekki] hafa þurft - -$tag(purge_verb) HjSögnVh - HjSögnHafaNh/tala/pers → 'hafa:so'_gm/tala/pers 'hafa:so'_sagnb? # hef/hefur/hafði [haft] sögu að segja | 'geta:so'_gm/tala/pers FsAtv? 'hafa:so'_nh? 'hafa:so'_sagnb # getur/gæti [hafa] haft sögu að segja From 24f5f30af2950e43a4f5e8b8f001dc3b69afc5f8 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:32:09 +0000 Subject: [PATCH 05/12] Delete the redundant VeraInnskot insert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VeraInnskot ("vera [stöðugt] að") was an optional element of the accusative-with-infinitive bottoms ÓpSagnarBotn and MiðmyndarBotnFlókinn. It never won a parse in a 10,000-sentence census, and probing its home contexts ("Mér sýndist kötturinn vera að lepja mjólkina") shows the progressive reading always wins through the generic infinitive path; all probes still parse identically without it. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 70f8b36..96c7fd8 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -1673,7 +1673,7 @@ AukafallsBotn → FsAtv # (Mér líkaði) vel við Jón | NhFylling # (Okkur langaði) gríðarlega að fara til útlanda strax | FsAtv? HjSögnVantaSkorta NlBeintAndlag_þf AtvFsAuka? # (Okkur þótti) [algjörlega] vanta broddinn í ræðuna - | Nl_nf AtvFs? VeraInnskot? NhRuna FsAtv? # (Okkur þótti) hún teygja lopann gríðarlega + | Nl_nf AtvFs? NhRuna FsAtv? # (Okkur þótti) hún teygja lopann gríðarlega | MiðmyndarBotnLo # (Okkur þótti) kettirnir [ekk] [vera] fallegir MiðmyndarBotn → @@ -1682,8 +1682,8 @@ MiðmyndarBotn → | FsAtv MiðmyndarBotnFlókinn → - # (Mér sýndist) kötturinn [ekki] [vera [skyndilega] að] lepja mjólkina og borða matinn í gær - Nl_nf AtvFs? VeraInnskot? NhRuna FsAtv? + # (Mér sýndist) kötturinn [ekki] lepja mjólkina og borða matinn í gær + Nl_nf AtvFs? NhRuna FsAtv? # (Mér leyfist) vonandi að fara út | NhFylling @@ -1708,9 +1708,6 @@ MiðmyndarBotnLo → $score(+24) MiðmyndarBotnLo # Gefa plús fyrir heildstætt samhengi lýsingarorðs -VeraInnskot → - HjSögnVera FsAtv? Nhm # vera [stöðugt] að / geta hafa verið [alltaf] að / verðir [í snatri] að / hafa orðið að... - # Setningar án frumlags (notaðar t.d. í tengisetningum eftir 'sem'). # Í setningum án frumlags getur sagnliðurinn verið "öfugur", # þ.e. "konurnar sem borðað höfðu matinn" í stað "höfðu borðað". From 44441018257950aa01ee0f73b9b1ce6e99bbd44a Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:34:01 +0000 Subject: [PATCH 06/12] =?UTF-8?q?Delete=20the=20redundant=20SetningA=C3=B0?= =?UTF-8?q?=20rules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SetningAð handled infinitive-phrase subjects ("Að raða frímerkjum er góð skemmtun") as an alternative of Setning_et_p3_hk, already marked down with $score(-4), and SetningAðHugsaSér was reachable only through it. Neither ever won a parse in a 10,000-sentence census; the IP-INF-SUBJ path wins every probe with correct trees, and all probes (including "Að hugsa sér!") parse identically without them. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 96c7fd8..b785a07 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -1045,11 +1045,9 @@ Setning/tala/pers/kyn → | NlFrumlagLeppur SagnHluti/tala/pers/kyn Upptalning/tala? Setning_et_p3_hk → - # 'Að raða frímerkjum er góð skemmtun' - SetningAð - # Um er/var að ræða þriggja ára stelpu + # Um er/var að ræða þriggja ára stelpu # (-> Það er um að ræða þriggja ára stelpu) - | SetningUmAðRæða + SetningUmAðRæða # 'Nú/þá/alltaf er/var/væri verið að reka fólk burt af jörðum sínum' # ('verið' er ekki til sem LHÞT, en það er hins vegar 'búið' o.fl.) # ERROR -- bæta við í bín? og/eða er þetta villa? | SetningForskeyti 'vera:so'_0_gm_p3_et 'vera:so'_sagnb NhFylling @@ -1084,22 +1082,9 @@ SögnÞaðLeppur → # Nýtt undirtré fyrir tengingu sagnar og forsetningar $tag(begin_prep_scope) Setning/tala/pers/kyn -SetningAð → - # 'Að reyna að raða frímerkjum [í ró og næði] er góð skemmtun' - NhLiðir SagnRuna_et_p3_hk - | SetningAðHugsaSér - -$score(-4) SetningAð # Óalgengt form - -$tag(begin_prep_scope) SetningAð - -SetningAðHugsaSér → - Nhm 'hugsa:so'_1_þgf_gm_nh abfn_þgf # 'Að hugsa sér [, sagði Anna]' - # Nafnháttarmerki, 'að' Nhm → nhm -$score(+2) SetningAðHugsaSér # !!! ATH: Við lítum á nafnliðinn í "um að ræða" sem andlag (viðfang) # !!! forsetningarinnar 'um', ekki sagnarinnar 'ræða' From f4889a857c35169aafe9eda59cf06ae0662ad27d Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:39:05 +0000 Subject: [PATCH 07/12] Trim the dominated SagnKomma prefix from SagnFramhald MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inside SagnFramhald, the optional SagnKomma* prefix could never win: KommaOgEðaEn already matches a bare comma, so a comma-separated verb sequence always parses as a chain of SagnFramhald units, each earning $score(+32), which the $score(+2) prefix path cannot beat. Removing the prefix eliminates a spurious forest family per comma. SagnKomma itself stays: it is the only path to three or more verbs in the correlative alternatives (hvorki/bæði/ýmist/annaðhvort), where it demonstrably wins ("Hann hvorki söng, dansaði né hló"). Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index b785a07..5180984 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -855,7 +855,7 @@ SagnRunaKnöpp/tala/pers/kyn → Sagnliður/tala/pers/kyn LoTengtSögn_nf/tala/kyn? SagnInnskotAtv? SagnFramhald/tala/pers/kyn → - SagnKomma/tala/pers/kyn* KommaOgEðaEn FsAtv? SagnRunaKnöpp/tala/pers/kyn + KommaOgEðaEn FsAtv? SagnRunaKnöpp/tala/pers/kyn SagnKomma/tala/pers/kyn → "," SagnRunaKnöpp/tala/pers/kyn From 8ffece711abf3e485d0c39c2f53cb1bb39e76af9 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:48:45 +0000 Subject: [PATCH 08/12] =?UTF-8?q?Fix=20quote=20continuations=20by=20replac?= =?UTF-8?q?ing=20=C3=81framSagt=20with=20Segir=C3=81framSagt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ÁframSagt (Segir SegirÁfram Sagt) required a second ", segir X" attribution after Segjandi and allowed no colon, so it could not even match the canonical example in its own comment and never won a parse. The question alternative of Staðhæfing already uses SegirÁframSagt (SegirÁfram ":"? Sagt?), which does win; pointing the declarative alternative at the same rule makes "„Þetta er gott,“ segir Jón og bætir við: „Þetta er mjög gott.““ parse as a single attributed statement instead of being split at the continuation. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 5180984..cf6cb1a 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -154,7 +154,7 @@ MgrInnihald → # "Allt er klárt," segir Jón og bætir við: "Komum þessu í gang." Staðhæfing → - Sagt Segjandi ÁframSagt? Lokatákn? + Sagt Segjandi SegirÁframSagt? Lokatákn? # Spurning eða upphrópun í beinni ræðu, án kommu á undan segjanda: # "Komst hann ekki í hópinn?" sagði hann. / "Við erum að falla á tíma!" skrifar Limbourg. | Forskeyti? SagtSpurning ","? SegirKjarni SegirÁframSagt? Lokatákn? @@ -167,9 +167,6 @@ SagtSpurning → Upphrópun* Spurnarsetning | Yfirsetning StLiður* "!" -ÁframSagt → - Segir SegirÁfram Sagt - Segjandi → Segir # "Allt er klappað og klárt", segir Jón. From 81aca621ad070d5a0f5adf4786ff147ec4c5a29f Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 19:52:30 +0000 Subject: [PATCH 09/12] Prune and fix the never-winning date rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Census-driven cleanup of the date family: - Delete the Dagsetningarliður wrapper and its single use site (the 'dagsett + date' alternative of Lo_sb_nf): the participle reading with a generic date adverbial always wins, and the children (FöstDagsetning, AfstæðDagsetning) remain heavily used elsewhere. - Delete Mánaðamót: the tokenizer delivers "ágúst-september" as a single WORD token, so the rule ('mánaðamót' dagsafs '-' dagsafs) could never match its target pattern. Handling fused month ranges would be a tokenizer-level fix. - Fix DaganaTímabilFast with $score(+8) so "dagana 13. október til 14. nóvember 2017" wins as one date period, and add a raðnr-til-dagsafs alternative for the year-less "dagana 5. til 7. ágúst". FráTilTími stays: it wins today ("frá kl. 10 til kl. 14 á morgun"). Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index cf6cb1a..8c22ccc 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -5784,8 +5784,6 @@ Lo_sb_nf/tala/kyn → # (Hann vann keppnina) fyrstur [karla/allra] # (Jóna var) glöðust [allra gesta] (í partíinu) LoAtviksliðir? lo_sb_nf/tala/kyn EfLiður_ft? - # (Bréfið var) dagsett 10. júlí - | LoAtviksliðir? 'dagsetja:so'_lhþt_sb_nf/tala/kyn Dagsetningarliður # Jón hefur verið hlynntur málinu | LoAtviksliðir? lo_sb_nf/sfall/tala/kyn LoViðhengi/sfall # Hann er málinu [efnislega] hlynntur @@ -6701,13 +6699,6 @@ LoðinnTímaNafnliður → $score(-999) LoðinnTímaNafnliður -Dagsetningarliður → - FöstDagsetning | AfstæðDagsetning - -$score(+12) Dagsetningarliður -$tag(apply_prep_bonus) Dagsetningarliður # Gefa bónus þegar dagsetning fylgir sögn frekar en nafnlið -$tag(apply_length_bonus) Dagsetningarliður # Gefa bónus eftir því hversu margar eindir (tokens) falla undir dagsetninguna - # Aðalliður: Föst dagsetning FöstDagsetning → Vikudagur_gr_þf_et? dagsföst @@ -6752,7 +6743,6 @@ OgÁratugum → | ártal | Árstíð_þf_et/kyn ártal_þf_et # haustið 2016, veturinn 1998 | HinnSá_þf raðnr SáÞessi_ef_et_kk 'mánuður:kk'_ef_et # þann/hinn 23. þess/þessa mánaðar - | Mánaðamót # mánaðamótin mars-apríl | DaganaAfs NæstSíðast_þf_et_kk? # dagana 14. og 15. október | ÁrinAfs # árin 1938 og 1967 | TímaÁkvæðisliður_þf_et_kk Vikudagur_et_þf OgVikudagur_et_þf? # næsta fimmtudag [[, föstudag] og/eða laugardag] @@ -6824,9 +6814,6 @@ FyrirEftir → ártal ÁraRuna* Til tala # 2016-2017, 2016 til 17 | 'ár:hk'_ft_gr_þf tala ÁraRuna* Til tala # árin 670-80, árin 2016 til 2017 -Mánaðamót → - 'mánaðamót:hk'_ft_þf dagsafs '-:en' dagsafs - Árstíð_þf_et_hk → 'vor:hk'_þf_et | 'sumar:hk'_þf_et | 'haust:hk'_þf_et @@ -7288,8 +7275,11 @@ DaganaTímabilAfstætt → DaganaTímabilFast → Dagana? dagsafs Til dagsföst # (dagana/helgina) 13. október til 14. nóvember 2017; 13. október-14. nóvember 2017 | Dagana? raðnr Til dagsföst # (dagana/helgina) 13.-14. nóvember 2017, 13. til 14. nóvember 2017 + | Dagana? raðnr Til dagsafs # (dagana/helgina) 5. til 7. ágúst | Vikudagur_et_þf tímapunkturfast Til tími # miðvikudaginn 13. desember 2017 kl 14:00 - 15:00 +$score(+8) DaganaTímabilFast + FráTilTími → 'frá:fs'_þgf? tími Til tími DaganaTímabilAfstætt? | 'frá:fs'_þgf? tími Til tími DaganaTímabilFast? From 9a076e7e95072a488be0f3f8da2bfee761e25ae7 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 20:03:55 +0000 Subject: [PATCH 10/12] Delete seven coordination twins that never win MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Census-driven cleanup of coordination/continuation helpers that never won a parse in 10,000 sentences and lose in their own home contexts under targeted probes: - OgSögn_mm_sagnb: "hafa reynst og nýst mér" wins via the generic sagnbót coordination - OgNhSögn_lhþt, OgNhSögn_expl_op: "að reistar yrðu og byggðar íbúðir" / "að rigna og snjóa" win via CP or generic paths (the OgNhSögn base family stays; it wins regularly) - HreinSögnAtv_nh: unused optional trailer in SagnliðurÁnF - AukafallÖfugSögn: unmatchable — 'gera' has no bare-dative frame, so "skal engum gert" never matched (a working replacement for the constitutional sentence follows separately) - FramhaldÁnFMeðKommu: 0 wins vs ~35 for the plain sibling despite $score(+8) - KommuSögn_bh: imperative sequences win as separate clauses; OgSögn_bh (which does win) stays The nine other census-flagged twins were probed alive and are kept. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 40 ++++++-------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 8c22ccc..0ec9fc9 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -1435,9 +1435,6 @@ SetningAukafall → # Miklu má veðja að Guðný snúi aftur í pólitík | NlFrumlag/aukafall AðvörunKomma? HjSögnMegiSkuli_et_p3 FsAtv? So_1_nh/aukafall AðLiður? - # Nauðungarvinnu skal engum gert að leysa af hendi - | NlFrumlag/aukafall AðvörunKomma? HjSögnMegiSkuli_et_p3 FsAtv? AukafallÖfugSögn Nhm So_1_nh/aukafall FsAtv? - # Engan þarf/ætti að undra (að mig langi í ís) # Greinarmun verður [ekki] að gera (á Jóni og séra Jóni) | NlFrumlag/aukafall HjSögnÞurfaEiga_et_p3 FsAtv? Nhm So_1_nh/aukafall AðLiður? @@ -1633,10 +1630,6 @@ SögnAukafallEfBotn → $score(+3) SögnAukafallEfBotn -AukafallÖfugSögn → - NlBeintAndlag/fall AtvFs? So_1_nh/fall # (skal) engum gera - | NlBeintAndlag/fall AtvFs? So_1_sagnb/fall # (skal) engum gert - # Tilvik þar sem sögn í lhþt eintölu fylgir andlag í fleirtölu: # 'Öllum skal tryggð mannhelgi og vernd gegn hvers kyns ofbeldi' @@ -1718,13 +1711,7 @@ $tag(begin_prep_scope) EinSetningÁnF/tala/pers/kyn # Nýtt undirtré fyrir teng $score(-3) ÖfugtFramhald/tala/pers/kyn FramhaldÁnF/tala/pers/kyn → - FramhaldÁnFMeðKommu/tala/pers/kyn - | FramhaldÁnFÁnKommu/tala/pers/kyn - -FramhaldÁnFMeðKommu/tala/pers/kyn → - "," FramhaldÁnFÁnKommu/tala/pers/kyn LokatáknEðaKomma - -$score(+8) FramhaldÁnFMeðKommu/tala/pers/kyn # Framhald innan kommu er mjög líklega rétt + FramhaldÁnFÁnKommu/tala/pers/kyn FramhaldÁnFÁnKommu/tala/pers/kyn → Samtenging HreinYfirsetning # (sem borðað höfðu matinn) þegar hann var framreiddur fyrr um kvöldið @@ -1770,7 +1757,7 @@ SagnliðurÁnF → | HjSögnLhÞtSM_p3_et FsAtv? so_mm_sagnb NhFyllingEðaAtv # (Í dag) verður/skal/mun [líklega] ráðist (í verkið) | HjSögnMegiSkuli_et_p3 HreinSögn_nh_et_hk SagnInnskot? # [Í dag] má sækja tölvuna (og byrja að vinna) - | so_0_nh HjSögnNhMeðSo_et_p3 HreinSögnAtv_nh? # [hvort] leggja skuli/eigi/þarf/verður [á skatt, breyta honum eða afnema hann] + | so_0_nh HjSögnNhMeðSo_et_p3 # [hvort] leggja skuli/eigi/þarf/verður [á skatt, breyta honum eða afnema hann] | HjSögnNh_p3/tala FsAtv? so_mm_nh FsRunaEftirSögn? NlFrumlag_nf/tala # [Í kröfunum] skulu felast [í snatri] tillögur (um nýtt fyrirkomulag) @@ -1793,9 +1780,6 @@ StökSögn_et_p3_gm → # Óalgengt að sagnorð standi ein og sér án frumlags $score(-16) StökSögn_et_p3_gm -HreinSögnAtv_nh → - FsAtv? HreinSögn_nh_et_hk - # Sagnliður sem hefst á viðtengingarhætti: # 'Haldi þessi þróun áfram er voðinn vís / þarf að grípa til aðgerða' # !!! TODO: hér þyrfti að leyfa að setja "þá" á milli, mætti merkja sem óþarft samt. @@ -1889,10 +1873,6 @@ OgSögn_mm_nh → FsAtv? Aðaltenging FsAtv? so_mm_nh | FsAtv? "," Aðaltenging FsAtv? so_mm_nh FsAtvKomma? -OgSögn_mm_sagnb → - FsAtv? Aðaltenging FsAtv? so_mm_sagnb - | FsAtv? "," Aðaltenging FsAtv? so_mm_sagnb FsAtvKomma? - OgSögn_sagnb/tala/kyn → # (hefur staðið) keikur í brúnni og mótmælt yfirgangi Rússa LoTengtSögn_nf/tala/kyn? FsAtv? ÁframOgSögn_sagnb/tala/kyn* Aðaltenging FsAtv? EinSögn_sagnb/tala/kyn @@ -2198,16 +2178,12 @@ BhBotn → $score(-3) BhBotn SögnFrh_bh → - KommuSögn_bh* OgSögn_bh+ - -KommuSögn_bh → - "," FsAtv? Sögn_bh + OgSögn_bh+ OgSögn_bh → ","? Aðaltenging FsAtv? Sögn_bh # ...en þegar eru komnar tvær eða fleiri sagnir í röð þá er það líklegri lausn -$score(+10) KommuSögn_bh $score(+10) OgSögn_bh # Sögn með engu viðfangi ('lenti') @@ -2738,7 +2714,7 @@ Sögn_1/tala/pers/kyn → | So_1_þf_nh/tala/pers OgSögn_1_þf_nh/tala/pers* SagnarBotn # (Bankar) hafa reynst og gagnast mér (vel) - | HjSögn/tala/pers FsAtv? so_mm_sagnb OgSögn_mm_sagnb* NlBeintAndlag_þgf + | HjSögn/tala/pers FsAtv? so_mm_sagnb NlBeintAndlag_þgf # Konan hefur verið/skal/mun gefin Páli | HjSögnLhÞtSM/tala/pers FsAtv? so_2_þgf_þf_lhþt/tala/kyn NlBeintAndlag_þgf @@ -3530,11 +3506,11 @@ NhSögn → | so_2_þgf_þgf_nh so_0_gm_vh_p3_et? OgNhSögn_þgf_þgf* FsRunaEftirSögn? NlÓbeintAndlag_þgf NlBeintAndlag_þgf # að taka Páli opnum örmum | so_2_þgf_ef_nh so_0_gm_vh_p3_et? OgNhSögn_þgf_ef* FsRunaEftirSögn? NlÓbeintAndlag_þgf NlBeintAndlag_ef # að óska [eigi] og óska Páli góðs bata | 'gera:so'_1_þgf_nh so_0_gm_vh_p3_et? NlÓbeintAndlag_þgf LoTengtSögn_nf_et_hk NhFylling # að gera [eigi] Páli kleift að matast með reisn - | so_expl_op_p3_et OgNhSögn_expl_op* # að rigna gífurlega + | so_expl_op_p3_et # að rigna gífurlega # að reistar yrðu og byggðar íbúðir / að barinn skyldi fiskurinn og flakaður # !!! Ath: sennilega geta aðeins hjálparsagnir staðið í viðtengingarhætti hér, # !!! ekki allar sagnir - | so_0_lhþt/tala/kyn so_0_gm_vh/tala OgNhSögn_lhþt/tala/kyn* NlFrumlag_nf/tala/kyn OgNhSögn_lhþt/tala/kyn* + | so_0_lhþt/tala/kyn so_0_gm_vh/tala NlFrumlag_nf/tala/kyn # (Páll fór inn eftir að) hafa fært bílinn / (fyrir að) geta lyft grettistaki | NhSögnHafaGetaFá @@ -3592,10 +3568,6 @@ OgNhSögn_þgf_þgf → OgEðaHeldur so_2_þgf_þgf_nh so_0_gm_vh_p3_et? OgNhSögn_þgf_ef → OgEðaHeldur so_2_þgf_ef_nh so_0_gm_vh_p3_et? -OgNhSögn_lhþt/tala/kyn → - OgEðaHeldur so_0_lhþt/tala/kyn -OgNhSögn_expl_op → - OgEðaHeldur so_expl_op_p3_et # Gefa til kynna hvar lesa á upp sagnir til að nota í # tengingu sagna og forsetninga From cc752a039b17032b18fcb29765d30b98d6f9b4f9 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Tue, 1 Sep 2026 20:05:04 +0000 Subject: [PATCH 11/12] =?UTF-8?q?Parse=20the=20constitutional=20gert-a?= =?UTF-8?q?=C3=B0=20construction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the unmatchable AukafallÖfugSögn path deleted in the previous commit with a working rule. Verbs.conf already carries the 'gera þgf |nh' frame ("Dómarinn gerði mér að greiða sektina"), so "Engum skal gert að leysa nauðungarvinnu af hendi" parsed fine; what failed was the topicalized variant in article 68 of the constitution, "Nauðungarvinnu skal engum gert að leysa af hendi", where the object of the embedded infinitive is fronted. A new SetningAukafall alternative anchors on the literal 'gera:so'_gm_sagnb with a dative NP and an infinitive whose object is the fronted phrase. Co-Authored-By: Claude Fable 5 --- src/reynir/Greynir.grammar | 5 +++++ test/test_parse.py | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 0ec9fc9..4f7ef62 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -1435,6 +1435,11 @@ SetningAukafall → # Miklu má veðja að Guðný snúi aftur í pólitík | NlFrumlag/aukafall AðvörunKomma? HjSögnMegiSkuli_et_p3 FsAtv? So_1_nh/aukafall AðLiður? + # Nauðungarvinnu skal engum gert að leysa af hendi + # (andlag nafnháttarsagnarinnar er fremst; 'gera e-m að gera e-ð') + | NlFrumlag/aukafall AðvörunKomma? HjSögnMegiSkuli_et_p3 FsAtv? + NlÓbeintAndlag_þgf 'gera:so'_gm_sagnb Nhm So_1_nh/aukafall FsAtv? + # Engan þarf/ætti að undra (að mig langi í ís) # Greinarmun verður [ekki] að gera (á Jóni og séra Jóni) | NlFrumlag/aukafall HjSögnÞurfaEiga_et_p3 FsAtv? Nhm So_1_nh/aukafall AðLiður? diff --git a/test/test_parse.py b/test/test_parse.py index 43c3f00..705a3a2 100644 --- a/test/test_parse.py +++ b/test/test_parse.py @@ -2806,6 +2806,12 @@ def test_never_winning_constructions(r) -> None: # Apposition in the wrong case parses via the error fallback s = r.parse_single("Ég ræddi við forsætisráðherra (Sigmundur Davíð) um málið.") assert s and s.tree and "person_nf_kk person_nf_kk" in s.tree.flat + # Constitution, article 68: topicalized object of the infinitive + # in the 'gera e-m að gera e-ð' construction + s = r.parse_single("Nauðungarvinnu skal engum gert að leysa af hendi.") + assert s and s.tree, "constitutional sentence must parse" + assert "NP-IOBJ fn_et_þgf_kk /NP-IOBJ VP so_gm_sagnb" in s.tree.flat, s.tree.flat + assert "leysa" in s.tree.verbs if __name__ == "__main__": From 0c9d910b0068f97cc86262906c12111815c4cf60 Mon Sep 17 00:00:00 2001 From: Vilhjalmur Thorsteinsson Date: Wed, 2 Sep 2026 18:34:02 +0000 Subject: [PATCH 12/12] Document the single-value variant idiom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Name the /hk, /kvk, /nf, /þf, /et, /p3 declarations for what they are — "eins gildis tilbrigði" — and explain the pinning idiom (Tilvísunarsetning/tala/p3/kyn) in the grammar comment and in CLAUDE.md, so it doesn't have to be rediscovered again. Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 5 +++++ src/reynir/Greynir.grammar | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index e828fc4..eb6ef10 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,6 +97,11 @@ The public API is defined by the exports in `src/reynir/__init__.py`. - Grammar terminal and category names are Icelandic abbreviations (`no`=noun, `so`=verb, `nf`/`þf`/`þgf`/`ef`=cases, `et`/`ft`=number, `kk`/`kvk`/`hk`=gender); these appear throughout the code, tests and grammar files. +- In the grammar, single-value variants ("eins gildis tilbrigði", e.g. + `/p3 = p3`, `/et = et`) pin a nonterminal reference to one fixed variant + value: `Tilvísunarsetning/tala/p3/kyn` unifies with the `p3` slice of a + `/tala/pers/kyn` definition, since variant expansion is purely textual + name generation. The value must be declared as a variant first. - Ruff line length is 88; `E731` (lambda assignment) is ignored. - CI (`.github/workflows/python-package.yml`) runs ruff + pytest via `uv sync --locked` on Python 3.10–3.14 and PyPy 3.11 on Linux, plus one diff --git a/src/reynir/Greynir.grammar b/src/reynir/Greynir.grammar index 4f7ef62..1bee8c8 100644 --- a/src/reynir/Greynir.grammar +++ b/src/reynir/Greynir.grammar @@ -114,7 +114,9 @@ # Person (1st, 2nd, 3rd) variant /pers = p1 p2 p3 sp # sp = spurnarmynd með viðskeyttu frumlagi (ertu, viltu) -# Hacks to generate single variants only +# Eins gildis tilbrigði: hvert þeirra vísar í eitt fast gildi og er notað +# til að njörva tilvísun við það gildi, sbr. Tilvísunarsetning/tala/p3/kyn +# (tilvísunarsetning sem er alltaf í 3. persónu) /hk = hk /kvk = kvk /nf = nf