From dfbb754bf2c37637923b20a06254f12f0dbc7b5b Mon Sep 17 00:00:00 2001 From: John T Maxwell III Date: Wed, 23 Oct 2024 07:51:31 -0700 Subject: [PATCH] Fix LT-21939 (#264) * Fix LT-21939 * Fix format * Fix format --- .../SynthesisAffixProcessAllomorphRuleSpec.cs | 31 +++++++++++++++---- .../AffixProcessRuleTests.cs | 30 +++++++++++++++--- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/SIL.Machine.Morphology.HermitCrab/MorphologicalRules/SynthesisAffixProcessAllomorphRuleSpec.cs b/src/SIL.Machine.Morphology.HermitCrab/MorphologicalRules/SynthesisAffixProcessAllomorphRuleSpec.cs index a1c80d66d..aab74102d 100644 --- a/src/SIL.Machine.Morphology.HermitCrab/MorphologicalRules/SynthesisAffixProcessAllomorphRuleSpec.cs +++ b/src/SIL.Machine.Morphology.HermitCrab/MorphologicalRules/SynthesisAffixProcessAllomorphRuleSpec.cs @@ -165,7 +165,13 @@ public Word ApplyRhs(PatternRule rule, Match m _allomorph, output.MorphologicalRuleApplicationCount.ToString() ); - + if (outputNewMorph == null) + { + // There are no new output morphs in a truncation rule, + // so we add its allomorph to the last output shape. + string morphID = output.MorphologicalRuleApplicationCount.ToString(); + output.MarkMorph(new List() { output.Shape.Last }, _allomorph, morphID); + } var markedAllomorphs = new HashSet(); foreach (Annotation inputMorph in match.Input.Morphs) { @@ -178,11 +184,24 @@ public Word ApplyRhs(PatternRule rule, Match m } else if (inputMorph.Parent == null && !markedAllomorphs.Contains(allomorph)) { - // an existing morph has been completely subsumed by the new morph - // mark the subsumed morph so we don't lose track of it - // this is only necessary if the allomorph hasn't already been marked elsewhere - Annotation outputMorph = output.MarkSubsumedMorph(outputNewMorph, allomorph, morphID); - MarkSubsumedMorphs(match.Input, output, inputMorph, outputMorph); + // This is only necessary if the allomorph hasn't already been marked elsewhere. + if (outputNewMorph == null) + { + // There are no new output morphs in a truncation rule, + // So we add allomorph to the first output shape. + output.MarkMorph(new List() { output.Shape.First }, allomorph, morphID); + } + else + { + // an existing morph has been completely subsumed by the new morph + // mark the subsumed morph so we don't lose track of it + Annotation outputMorph = output.MarkSubsumedMorph( + outputNewMorph, + allomorph, + morphID + ); + MarkSubsumedMorphs(match.Input, output, inputMorph, outputMorph); + } } markedAllomorphs.Add(allomorph); } diff --git a/tests/SIL.Machine.Morphology.HermitCrab.Tests/MorphologicalRules/AffixProcessRuleTests.cs b/tests/SIL.Machine.Morphology.HermitCrab.Tests/MorphologicalRules/AffixProcessRuleTests.cs index efc768277..d222c9476 100644 --- a/tests/SIL.Machine.Morphology.HermitCrab.Tests/MorphologicalRules/AffixProcessRuleTests.cs +++ b/tests/SIL.Machine.Morphology.HermitCrab.Tests/MorphologicalRules/AffixProcessRuleTests.cs @@ -1192,7 +1192,7 @@ public void TruncateRules() Morphophonemic.MorphologicalRules.Add(truncate); var morpher = new Morpher(TraceManager, Language); - AssertMorphsEqual(morpher.ParseWord("sa"), "32"); + AssertMorphsEqual(morpher.ParseWord("sa"), "32 3SG"); truncate.Allomorphs.Clear(); truncate.Allomorphs.Add( @@ -1208,7 +1208,7 @@ public void TruncateRules() ); morpher = new Morpher(TraceManager, Language); - AssertMorphsEqual(morpher.ParseWord("ag"), "32"); + AssertMorphsEqual(morpher.ParseWord("ag"), "32 3SG"); truncate.Allomorphs.Clear(); truncate.Allomorphs.Add( @@ -1224,7 +1224,7 @@ public void TruncateRules() ); morpher = new Morpher(TraceManager, Language); - AssertMorphsEqual(morpher.ParseWord("ag"), "32"); + AssertMorphsEqual(morpher.ParseWord("ag"), "32 3SG"); truncate.Allomorphs.Clear(); truncate.Allomorphs.Add( @@ -1240,7 +1240,7 @@ public void TruncateRules() ); morpher = new Morpher(TraceManager, Language); - AssertMorphsEqual(morpher.ParseWord("sa"), "32"); + AssertMorphsEqual(morpher.ParseWord("sa"), "32 3SG"); truncate.Allomorphs.Clear(); truncate.Allomorphs.Add( @@ -1866,10 +1866,32 @@ public void SubsumedAffix() ); Morphophonemic.MorphologicalRules.Add(nominalizer); + var deleteVowelSuffix = new AffixProcessRule + { + Name = "delete_vowel_suffix", + Gloss = "PRES", + RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, + }; + deleteVowelSuffix.Allomorphs.Add( + new AffixProcessAllomorph + { + Lhs = + { + Pattern.New("1").Annotation(any).OneOrMore.Value, + Pattern.New("2").Annotation(vowel).Value + }, + Rhs = { new CopyFromInput("1") } + } + ); + Morphophonemic.MorphologicalRules.Add(deleteVowelSuffix); + var morpher = new Morpher(TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("tagu"), "47 3SG"); AssertMorphsEqual(morpher.ParseWord("tags"), "47 3SG PAST"); AssertMorphsEqual(morpher.ParseWord("tagsv"), "47 3SG PAST NOM"); + // Test deleteVowelSuffix. + AssertMorphsEqual(morpher.ParseWord("tag"), "47 3SG PRES", "47"); + AssertMorphsEqual(morpher.ParseWord("bubib"), "42 PRES", "43 PRES"); } [Test]