public SynthesisRewriteRule(SpanFactory <ShapeNode> spanFactory, Morpher morpher, RewriteRule rule) { _morpher = morpher; _rule = rule; var settings = new MatcherSettings <ShapeNode> { Direction = rule.Direction, Filter = ann => ann.Type().IsOneOf(HCFeatureSystem.Segment, HCFeatureSystem.Boundary, HCFeatureSystem.Anchor) && !ann.IsDeleted(), UseDefaults = true }; var ruleSpec = new SynthesisRewriteRuleSpec(spanFactory, settings, rule.ApplicationMode == RewriteApplicationMode.Iterative, _rule.Lhs, _rule.Subrules); _patternRule = null; switch (rule.ApplicationMode) { case RewriteApplicationMode.Iterative: _patternRule = new IterativePhonologicalPatternRule(spanFactory, ruleSpec, settings); break; case RewriteApplicationMode.Simultaneous: _patternRule = new SimultaneousPhonologicalPatternRule(spanFactory, ruleSpec, settings); break; } }
public void InfixRules() { var voicelessStop = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("vd-") .Symbol("cont-").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var unasp = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("asp-").Value; var perfAct = new AffixProcessRule { Name = "perf_act", Gloss = "PER.ACT", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Symbol("V") .Feature(Head).EqualTo(head => head .Feature("aspect").EqualTo("perf") .Feature("mood").EqualTo("active")).Value }; perfAct.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("3").Annotation(cons).Value }, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "a"), new CopyFromInput("2"), new InsertSegments(Table3, "a"), new CopyFromInput("3")} }); Morphophonemic.MorphologicalRules.Add(perfAct); var perfPass = new AffixProcessRule { Name = "pref_pass", Gloss = "PER.PSV", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Symbol("V") .Feature(Head).EqualTo(head => head .Feature("aspect").EqualTo("perf") .Feature("mood").EqualTo("passive")).Value }; perfPass.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("3").Annotation(cons).Value }, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "u"), new CopyFromInput("2"), new InsertSegments(Table3, "i"), new CopyFromInput("3")} }); Morphophonemic.MorphologicalRules.Add(perfPass); var imperfAct = new AffixProcessRule { Name = "imperf_act", Gloss = "IMPF.ACT", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Symbol("V") .Feature(Head).EqualTo(head => head .Feature("aspect").EqualTo("impf") .Feature("mood").EqualTo("active")).Value }; imperfAct.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(cons).Value }, Rhs = {new InsertSegments(Table3, "a"), new CopyFromInput("1"), new InsertSegments(Table3, "u"), new CopyFromInput("2")} }); Morphophonemic.MorphologicalRules.Add(imperfAct); var imperfPass = new AffixProcessRule { Name = "imperf_pass", Gloss = "IMPF.PSV", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Symbol("V") .Feature(Head).EqualTo(head => head .Feature("aspect").EqualTo("impf") .Feature("mood").EqualTo("passive")).Value }; imperfPass.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("3").Annotation(cons).Value }, Rhs = {new InsertSegments(Table3, "u"), new CopyFromInput("1"), new CopyFromInput("2"), new InsertSegments(Table3, "a"), new CopyFromInput("3")} }); Morphophonemic.MorphologicalRules.Add(imperfPass); var aspiration = new RewriteRule {Name = "aspiration", Lhs = Pattern<Word, ShapeNode>.New().Annotation(voicelessStop).Value}; aspiration.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value, }); Allophonic.PhonologicalRules.Add(aspiration); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("katab"), "49 PER.ACT"); AssertMorphsEqual(morpher.ParseWord("kutib"), "49 PER.PSV"); AssertMorphsEqual(morpher.ParseWord("aktub"), "IMPF.ACT 49"); AssertMorphsEqual(morpher.ParseWord("uktab"), "IMPF.PSV 49"); }
public void SuffixRules() { var any = FeatureStruct.New().Symbol(HCFeatureSystem.Segment).Value; var strident = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("strident+").Value; var voicelessCons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("vd-").Value; var alvStop = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("strident-") .Symbol("del_rel-") .Symbol("alveolar") .Symbol("nasal-") .Symbol("asp-").Value; var d = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("strident-") .Symbol("del_rel-") .Symbol("alveolar") .Symbol("nasal-") .Symbol("vd+").Value; var unasp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp-").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var sSuffix = new AffixProcessRule { Name = "s_suffix", Gloss = "3SG", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, OutSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Feature(Head).EqualTo(head => head .Feature("pers").EqualTo("3")).Value }; sSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Annotation(strident).Value}, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "ɯz")} }); sSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Annotation(voicelessCons).Value}, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "s")} }); sSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value}, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "z")} }); Morphophonemic.MorphologicalRules.Add(sSuffix); var edSuffix = new AffixProcessRule { Name = "ed_suffix", Gloss = "PAST", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, OutSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Feature(Head).EqualTo(head => head .Feature("tense").EqualTo("past")).Value }; edSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value, Pattern<Word, ShapeNode>.New("2").Annotation(alvStop).Value }, Rhs = {new CopyFromInput("1"), new CopyFromInput("2"), new InsertSegments(Table3, "+ɯd")} }); edSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Annotation(voicelessCons).Value}, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "+t")} }); edSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value}, Rhs = {new CopyFromInput("1"), new InsertSegments(Table3, "+"), new InsertSimpleContext(d)} }); Morphophonemic.MorphologicalRules.Add(edSuffix); var prule1 = new RewriteRule {Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "t")).Value}; prule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Value }); Allophonic.PhonologicalRules.Add(prule1); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("sagz"), "32 3SG"); AssertMorphsEqual(morpher.ParseWord("sagd"), "32 PAST"); AssertMorphsEqual(morpher.ParseWord("sasɯz"), "33 3SG"); AssertMorphsEqual(morpher.ParseWord("sast"), "33 PAST"); AssertMorphsEqual(morpher.ParseWord("sazd"), "34 PAST"); Assert.That(morpher.ParseWord("sagɯs"), Is.Empty); Assert.That(morpher.ParseWord("sags"), Is.Empty); Assert.That(morpher.ParseWord("sasz"), Is.Empty); Assert.That(morpher.ParseWord("sass"), Is.Empty); Assert.That(morpher.ParseWord("satɯs"), Is.Empty); Assert.That(morpher.ParseWord("satz"), Is.Empty); edSuffix.Allomorphs.RemoveAt(1); edSuffix.Allomorphs.RemoveAt(1); edSuffix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1") .Annotation(any).OneOrMore .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, cons).Feature("vd").EqualToVariable("a").Value).Value }, Rhs = {new CopyFromInput("1"), new InsertSimpleContext(alvStop, Variable("vd", "a"))} }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("sagd"), "32 PAST"); AssertMorphsEqual(morpher.ParseWord("sast"), "33 PAST"); AssertMorphsEqual(morpher.ParseWord("sazd"), "34 PAST"); }
private void LoadRewriteRule(XElement pruleElem) { var multAppOrderStr = (string) pruleElem.Attribute("multipleApplicationOrder"); var prule = new RewriteRule { Name = (string) pruleElem.Element("Name"), ApplicationMode = GetApplicationMode(multAppOrderStr), Direction = GetDirection(multAppOrderStr) }; Dictionary<string, Tuple<string, SymbolicFeature>> variables = LoadVariables(pruleElem.Element("VariableFeatures")); prule.Lhs = LoadPhoneticSequence(pruleElem.Elements("PhoneticInput").Elements("PhoneticSequence").SingleOrDefault(), variables); foreach (XElement subruleElem in pruleElem.Elements("PhonologicalSubrules").Elements("PhonologicalSubrule").Where(IsActive)) prule.Subrules.Add(LoadRewriteSubrule(subruleElem, variables)); _language.PhonologicalRules.Add(prule); _prules[(string) pruleElem.Attribute("id")] = prule; }
public void LongDistanceRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-").Symbol("voc+") .Symbol("high+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var rndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("round+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var lowVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("low+").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var rule3 = new RewriteRule {Name = "rule3", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value}; Allophonic.PhonologicalRules.Add(rule3); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(rndVowel).Annotation(cons).Annotation(lowVowel).Annotation(cons).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubabu"), "13", "14"); rule3.Subrules.Clear(); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Annotation(lowVowel).Annotation(cons).Annotation(rndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubabu"), "13", "15"); rule3.Subrules.Clear(); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(highVowel) .Annotation(cons).Optional .Annotation(Char(Table3, "+")) .Annotation(cons).Optional .Annotation(vowel).Optional.Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("mimuu"), "55"); }
public void EpenthesisRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var highFrontUnrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("back-") .Symbol("round-").Value; var highBackRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("back+") .Symbol("round+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var highBackRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("high+") .Symbol("back+") .Symbol("round+").Value; var rule4 = new RewriteRule {Name = "rule4", ApplicationMode = RewriteApplicationMode.Simultaneous}; Allophonic.PhonologicalRules.Add(rule4); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buibui"), "19"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "i")).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biubiu"), "19"); rule4.ApplicationMode = RewriteApplicationMode.Iterative; rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("ipʰit"), "1"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("pʰiti"), "1"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highBackRndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biubiu"), "19"); rule4.ApplicationMode = RewriteApplicationMode.Simultaneous; rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, highVowel) .Feature("back").EqualToVariable("a") .Feature("round").EqualToVariable("b").Value).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, highVowel) .Feature("back").EqualToVariable("a") .Feature("round").EqualToVariable("b").Value).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biibuu"), "18"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biiibuii"), "18"); rule4.ApplicationMode = RewriteApplicationMode.Iterative; rule4.Direction = Direction.RightToLeft; rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); Assert.That(() => morpher.ParseWord("ipʰit"), Throws.TypeOf<InfiniteLoopException>()); Allophonic.PhonologicalRules.Clear(); var rule1 = new RewriteRule {Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value}; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(highBackRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highBackRndVowel).Value }); var rule2 = new RewriteRule {Name = "rule2"}; Allophonic.PhonologicalRules.Add(rule2); rule2.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "t")).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("butubu"), "25"); }
public void MultipleSegmentRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var backRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+") .Symbol("round+").Value; var t = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("alveolar") .Symbol("del_rel-") .Symbol("asp-") .Symbol("vd-") .Symbol("strident-").Value; var rule1 = new RewriteRule { Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Annotation(highVowel).Value }; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(backRndVowel).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buuubuuu"), "27"); var rule2 = new RewriteRule { Name = "rule2", Lhs = Pattern<Word, ShapeNode>.New().Annotation(t).Value }; Allophonic.PhonologicalRules.Add(rule2); rule2.Subrules.Add(new RewriteSubrule { RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(backRndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buuubuuu"), "27"); }
public AnalysisRewriteRule(SpanFactory <ShapeNode> spanFactory, Morpher morpher, RewriteRule rule) { _morpher = morpher; _rule = rule; var settings = new MatcherSettings <ShapeNode> { Direction = rule.Direction == Direction.LeftToRight ? Direction.RightToLeft : Direction.LeftToRight, Filter = ann => ann.Type().IsOneOf(HCFeatureSystem.Segment, HCFeatureSystem.Anchor), MatchingMethod = MatchingMethod.Unification, UseDefaults = true, // during analysis shape nodes can have features that are underspecified, so this must be non-deterministic Nondeterministic = true }; _rules = new List <Tuple <ReapplyType, PhonologicalPatternRule> >(); foreach (RewriteSubrule sr in _rule.Subrules) { IPhonologicalPatternRuleSpec ruleSpec = null; var mode = RewriteApplicationMode.Iterative; var reapplyType = ReapplyType.Normal; if (_rule.Lhs.Children.Count == sr.Rhs.Children.Count) { ruleSpec = new FeatureAnalysisRewriteRuleSpec(spanFactory, settings, rule.Lhs, sr); if (_rule.ApplicationMode == RewriteApplicationMode.Simultaneous) { foreach (Constraint <Word, ShapeNode> constraint in sr.Rhs.Children.Cast <Constraint <Word, ShapeNode> >()) { if (constraint.Type() == HCFeatureSystem.Segment) { if (!IsUnifiable(constraint, sr.LeftEnvironment) || !IsUnifiable(constraint, sr.RightEnvironment)) { reapplyType = ReapplyType.SelfOpaquing; break; } } } } } else if (_rule.Lhs.Children.Count > sr.Rhs.Children.Count) { ruleSpec = new NarrowAnalysisRewriteRuleSpec(spanFactory, settings, _rule.Lhs, sr); mode = RewriteApplicationMode.Simultaneous; reapplyType = ReapplyType.Deletion; } else if (_rule.Lhs.Children.Count == 0) { ruleSpec = new EpenthesisAnalysisRewriteRuleSpec(spanFactory, settings, sr); if (_rule.ApplicationMode == RewriteApplicationMode.Simultaneous) { reapplyType = ReapplyType.SelfOpaquing; } } Debug.Assert(ruleSpec != null); PhonologicalPatternRule patternRule = null; switch (mode) { case RewriteApplicationMode.Iterative: patternRule = new IterativePhonologicalPatternRule(spanFactory, ruleSpec, settings); break; case RewriteApplicationMode.Simultaneous: patternRule = new SimultaneousPhonologicalPatternRule(spanFactory, ruleSpec, settings); break; } _rules.Add(Tuple.Create(reapplyType, patternRule)); } }
public void CommonFeatureRules() { var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var vdLabFric = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("labiodental") .Symbol("vd+") .Symbol("strident+") .Symbol("cont+").Value; var rule1 = new RewriteRule { Name= "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "p")).Value }; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vdLabFric).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buvu"), "46"); rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "v")).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buvu"), "46"); }
public void BoundaryRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var backRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+") .Symbol("round+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var unbackUnrnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back-") .Symbol("round-").Value; var unbackUnrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back-") .Symbol("round-").Value; var backVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+").Value; var unrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("round-").Value; var lowBack = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("low+") .Symbol("high-").Value; var bilabialCons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-") .Symbol("bilabial").Value; var unvdUnasp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("vd-") .Symbol("asp-").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var asp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp+").Value; var rule1 = new RewriteRule {Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value}; Morphophonemic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(backRndVowel).Annotation(Char(Table3, "+")).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buub"), "30"); rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unbackUnrnd).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "+")).Annotation(unbackUnrndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biib"), "30"); rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(backRndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buub"), "30", "31"); rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unbackUnrnd).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(unbackUnrndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("biib"), "30", "31"); rule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "i")).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "b")).Value }); var rule2 = new RewriteRule {Name = "rule2", Lhs = Pattern<Word, ShapeNode>.New().Annotation(backVowel).Value}; rule2.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "a")).Value, RightEnvironment = Pattern<Word, ShapeNode>.New() .Group(group => group .Annotation(Char(Table3, "+")) .Annotation(Char(Table3, "b"))).Value }); Morphophonemic.PhonologicalRules.Add(rule2); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bab"), "30"); rule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "u")).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "b")).Value }); rule2.Lhs = Pattern<Word, ShapeNode>.New().Annotation(unrndVowel).Value; rule2.Subrules.Clear(); rule2.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(lowBack).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(Char(Table3, "b")) .Annotation(Char(Table3, "+")).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bab"), "30"); Morphophonemic.PhonologicalRules.Remove(rule2); rule1.Lhs = Pattern<Word, ShapeNode>.New() .Annotation(bilabialCons) .Annotation(Char(Table3, "+")) .Annotation(bilabialCons).Value; rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(unvdUnasp) .Annotation(Char(Table3, "+")) .Annotation(unvdUnasp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("appa"), "39"); rule1.Lhs = Pattern<Word, ShapeNode>.New() .Annotation(bilabialCons) .Annotation(bilabialCons).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(unvdUnasp) .Annotation(unvdUnasp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("appa"), "40"); rule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(cons).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "+")).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); Assert.That(morpher.ParseWord("pʰipʰ"), Is.Empty); Morphophonemic.PhonologicalRules.Clear(); rule1 = new RewriteRule { Name = "rule1" }; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(Char(Table1, "t")) .Annotation(Char(Table1, "a")).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Annotation(vowel).Annotation(HCFeatureSystem.RightSideAnchor).Value, RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("N").Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("taba"), "pos2"); AssertMorphsEqual(morpher.ParseWord("ba"), "pos1"); RewriteSubrule subrule = rule1.Subrules[0]; subrule.RequiredSyntacticFeatureStruct = FeatureStruct.New().Value; subrule.RequiredMprFeatures.Add(Latinate); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("taba"), "pos1"); subrule.RequiredMprFeatures.Clear(); subrule.ExcludedMprFeatures.Add(Latinate); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("taba"), "pos2"); }
public void AnchorRules() { var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var vlUnasp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("vd-") .Symbol("asp-").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var rule3 = new RewriteRule {Name = "rule3", Lhs = Pattern<Word, ShapeNode>.New().Annotation(cons).Value}; rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vlUnasp).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); Allophonic.PhonologicalRules.Add(rule3); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("gap"), "10", "11", "12"); rule3.Subrules.Clear(); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vlUnasp).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Annotation(cons).Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("kab"), "11", "12"); rule3.Subrules.Clear(); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vlUnasp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("kab"), "11", "12"); rule3.Subrules.Clear(); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vlUnasp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Annotation(cons).Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("gap"), "10", "11", "12"); }
public void AlphaVariableRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var nasalCons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-") .Symbol("nasal+").Value; var voicelessStop = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("vd-") .Symbol("cont-").Value; var asp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp+").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var unasp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp-").Value; var k = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-") .Symbol("velar") .Symbol("vd-") .Symbol("cont-") .Symbol("nasal-").Value; var g = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-") .Symbol("velar") .Symbol("vd+") .Symbol("cont-") .Symbol("nasal-").Value; var rule1 = new RewriteRule { Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }; Morphophonemic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Feature("back").EqualToVariable("a") .Feature("round").EqualToVariable("b").Value).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, highVowel) .Feature("back").EqualToVariable("a") .Feature("round").EqualToVariable("b").Value) .Annotation(cons).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bububu"), "42", "43"); rule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(nasalCons).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Feature("poa").EqualToVariable("a").Value).Value, RightEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, cons) .Feature("poa").EqualToVariable("a").Value).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("mbindiŋg"), "45"); Morphophonemic.PhonologicalRules.Clear(); Allophonic.PhonologicalRules.Add(rule1); rule1.Lhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, voicelessStop) .Feature("poa").EqualToVariable("a").Value).Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, voicelessStop) .Feature("poa").EqualToVariable("a").Value) .Annotation(vowel).Value }); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value, }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("pipʰ"), "41"); rule1.Lhs = Pattern<Word, ShapeNode>.New().Value; rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "f")).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, vowel) .Feature("high").EqualToVariable("a") .Feature("back").EqualToVariable("b") .Feature("round").EqualToVariable("c").Value).Value, RightEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, vowel) .Feature("high").EqualToVariable("a") .Feature("back").EqualToVariable("b") .Feature("round").EqualToVariable("c").Value).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buifibuifi"), "27"); Allophonic.PhonologicalRules.Clear(); Morphophonemic.PhonologicalRules.Add(rule1); rule1.Subrules.Clear(); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, k) .Feature("asp").EqualToVariable("a").Value).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, g) .Feature("asp").EqualToVariable("a").Value).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); Assert.That(morpher.ParseWord("sagk"), Is.Empty); }
public void SimpleRules() { var asp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp+").Value; var nonCons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-").Value; var rule1 = new RewriteRule {Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "t")).Value}; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(nonCons).Value }); var rule2 = new RewriteRule {Name = "rule2", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "p")).Value}; Allophonic.PhonologicalRules.Add(rule2); Morphophonemic.PhonologicalRules.Add(rule2); rule2.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(nonCons).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("pʰitʰ"), "1", "2"); AssertMorphsEqual(morpher.ParseWord("datʰ"), "8", "9"); AssertMorphsEqual(morpher.ParseWord("gab"), "11", "12"); }
public void QuantifierRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var lowVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("low+").Value; var rndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment).Symbol("cons-") .Symbol("voc+") .Symbol("round+").Value; var backRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+") .Symbol("round+").Value; var rule3 = new RewriteRule { Name = "rule3", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }; Allophonic.PhonologicalRules.Add(rule3); rule3.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, RightEnvironment = Pattern<Word, ShapeNode>.New() .Group(g => g.Annotation(cons).Annotation(lowVowel)).LazyRange(1, 2) .Annotation(cons).Annotation(rndVowel).Value }); var rule4 = new RewriteRule { Name = "rule4", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }; Allophonic.PhonologicalRules.Add(rule4); rule4.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(rndVowel) .Group(g => g.Annotation(cons).Annotation(lowVowel)).LazyRange(1, 2) .Annotation(cons).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "19"); AssertMorphsEqual(morpher.ParseWord("bubabu"), "13", "14", "15"); AssertMorphsEqual(morpher.ParseWord("bubababu"), "20", "21"); Assert.That(morpher.ParseWord("bubabababu"), Is.Empty); Allophonic.PhonologicalRules.Clear(); var rule1 = new RewriteRule { Name= "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }; Allophonic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(backRndVowel).Annotation(highVowel).LazyRange(0, 2).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buuubuuu"), "27"); }
public void PrefixRules() { var any = FeatureStruct.New().Symbol(HCFeatureSystem.Segment).Value; var alvStop = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("strident-") .Symbol("cont-") .Symbol("del_rel-") .Symbol("alveolar") .Symbol("nasal-").Value; var voicelessCons = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("vd-").Value; var strident = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("strident+").Value; var voicelessStop = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("vd-") .Symbol("cont-").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var lowVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high-") .Symbol("low+") .Symbol("back+") .Symbol("round-") .Symbol("vd+") .Symbol("cont+").Value; var unasp = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("asp-").Value; var sPrefix = new AffixProcessRule { Name = "s_prefix", Gloss = "3SG", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, OutSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Feature(Head).EqualTo(head => head .Feature("pers").EqualTo("3")).Value }; sPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(strident).Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "zi"), new CopyFromInput("1")} }); sPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(voicelessCons).Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "s"), new CopyFromInput("1")} }); sPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "z"), new CopyFromInput("1")} }); Morphophonemic.MorphologicalRules.Add(sPrefix); var edPrefix = new AffixProcessRule { Name = "ed_prefix", Gloss = "PAST", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, OutSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Feature(Head).EqualTo(head => head .Feature("tense").EqualTo("past")).Value }; edPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(alvStop).Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "di+"), new CopyFromInput("1")} }); edPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(voicelessCons).Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "t+"), new CopyFromInput("1")} }); edPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = {Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value}, Rhs = {new InsertSegments(Table3, "d+"), new CopyFromInput("1")} }); Morphophonemic.MorphologicalRules.Add(edPrefix); var aspiration = new RewriteRule {Name = "aspiration", Lhs = Pattern<Word, ShapeNode>.New().Annotation(voicelessStop).Value}; aspiration.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value, }); Allophonic.PhonologicalRules.Add(aspiration); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("zisag"), "3SG 32"); AssertMorphsEqual(morpher.ParseWord("stag"), "3SG 47"); AssertMorphsEqual(morpher.ParseWord("zabba"), "3SG 39", "3SG 40"); AssertMorphsEqual(morpher.ParseWord("ditag"), "PAST 47"); AssertMorphsEqual(morpher.ParseWord("tpag"), "PAST 48"); AssertMorphsEqual(morpher.ParseWord("dabba"), "PAST 39", "PAST 40"); Assert.That(morpher.ParseWord("zitag"), Is.Empty); Assert.That(morpher.ParseWord("sabba"), Is.Empty); Assert.That(morpher.ParseWord("ztag"), Is.Empty); Assert.That(morpher.ParseWord("disag"), Is.Empty); Assert.That(morpher.ParseWord("tabba"), Is.Empty); Assert.That(morpher.ParseWord("dtag"), Is.Empty); edPrefix.Allomorphs.RemoveAt(1); edPrefix.Allomorphs.RemoveAt(1); edPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1") .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment).Feature("vd").EqualToVariable("a").Value) .Annotation(any).OneOrMore.Value }, Rhs = {new InsertSimpleContext(FeatureStruct.New(Language.PhonologicalFeatureSystem, alvStop).Feature("vd").EqualToVariable("a").Value), new CopyFromInput("1")} }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("ditag"), "PAST 47"); AssertMorphsEqual(morpher.ParseWord("tpag"), "PAST 48"); AssertMorphsEqual(morpher.ParseWord("dabba"), "PAST 39", "PAST 40"); edPrefix.Allomorphs.Clear(); edPrefix.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, lowVowel).Feature("ATR").EqualToVariable("a").Value).Value, Pattern<Word, ShapeNode>.New("3").Annotation(any).OneOrMore.Value }, Rhs = { new InsertSegments(Table3, "m"), new InsertSimpleContext(FeatureStruct.New(Language.PhonologicalFeatureSystem, lowVowel).Feature("ATR").EqualToVariable("a").Value), new CopyFromInput("1"), new CopyFromInput("3") } }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("masg"), "PAST 32"); }
public void ReduplicationRules() { var any = FeatureStruct.New().Symbol(HCFeatureSystem.Segment).Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("cons+").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("voc+").Value; var voiced = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("vd+").Value; var affricate = FeatureStruct.New(Language.PhonologicalFeatureSystem).Symbol(HCFeatureSystem.Segment) .Symbol("del_rel+") .Symbol("cont-").Value; var redup = new AffixProcessRule { Name = "redup", Gloss = "RED", RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("V").Value, OutSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem) .Feature(Head).EqualTo(head => head .Feature("pers").EqualTo("3")).Value }; redup.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Annotation(vowel).Value, Pattern<Word, ShapeNode>.New("2").Annotation(any).OneOrMore.Value }, Rhs = {new CopyFromInput("1"), new CopyFromInput("1"), new CopyFromInput("2")} }); Morphophonemic.MorphologicalRules.Add(redup); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("sasag"), "RED 32"); var voicing = new RewriteRule {Name = "voicing", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "s")).Value}; voicing.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(voiced).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); Allophonic.PhonologicalRules.Add(voicing); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("sazag"), "RED 32"); var affrication = new RewriteRule {Name = "affrication", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "s")).Value}; affrication.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(affricate).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value }); Allophonic.PhonologicalRules.Add(affrication); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("tsazag"), "RED 32"); redup.Allomorphs.Clear(); redup.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value, Pattern<Word, ShapeNode>.New("2").Annotation(vowel).Annotation(cons).Value, }, Rhs = {new CopyFromInput("1"), new CopyFromInput("2"), new CopyFromInput("2")} }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("tsagag"), "32 RED"); Allophonic.PhonologicalRules.Clear(); redup.Allomorphs.Clear(); redup.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(any).ZeroOrMore.Value, Pattern<Word, ShapeNode>.New("2").Annotation(cons).Annotation(vowel).Annotation(cons).Value, }, Rhs = {new CopyFromInput("1"), new CopyFromInput("2"), new CopyFromInput("2")} }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("sagsag"), "32 RED"); AssertMorphsEqual(morpher.ParseWord("sasibudbud"), "38 RED"); redup.Allomorphs.Clear(); redup.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(any).OneOrMore.Value, Pattern<Word, ShapeNode>.New("2").Annotation(vowel).Annotation(cons).Value, }, Rhs = {new CopyFromInput("1"), new CopyFromInput("2"), new CopyFromInput("2")} }); var gDelete = new RewriteRule {Name = "g_delete", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table1, "g")).Value}; gDelete.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); Allophonic.PhonologicalRules.Add(gDelete); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("saag"), "32 RED"); gDelete.Subrules.Clear(); gDelete.Subrules.Add(new RewriteSubrule { RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("saga"), "32 RED"); Allophonic.PhonologicalRules.Clear(); redup.RequiredSyntacticFeatureStruct = FeatureStruct.New(Language.SyntacticFeatureSystem).Symbol("N").Value; redup.OutSyntacticFeatureStruct = FeatureStruct.New().Value; redup.Allomorphs.Clear(); redup.Allomorphs.Add(new AffixProcessAllomorph { Lhs = { Pattern<Word, ShapeNode>.New("1").Annotation(cons).Value, Pattern<Word, ShapeNode>.New("2").Annotation(vowel).Annotation(vowel).Value, Pattern<Word, ShapeNode>.New("3").Annotation(cons).Value }, Rhs = {new CopyFromInput("1"), new CopyFromInput("2"), new CopyFromInput("2"), new CopyFromInput("3")} }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("buiuib"), "30 RED", "31 RED"); }
public void DeletionRules() { var highFrontUnrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("low-") .Symbol("back-") .Symbol("round-").Value; var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var highBackRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("back+") .Symbol("round+").Value; var asp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp+").Value; var nonCons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var voiced = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("vd+").Value; var rule4 = new RewriteRule {Name = "rule4", Lhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Value}; Allophonic.PhonologicalRules.Add(rule4); rule4.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "24", "25", "26", "19"); morpher = new Morpher(SpanFactory, TraceManager, Language) {DeletionReapplications = 1}; AssertMorphsEqual(morpher.ParseWord("bubu"), "24", "25", "26", "27", "19"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(cons).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "25", "19"); rule4.Lhs = Pattern<Word, ShapeNode>.New().Annotation(highFrontUnrndVowel).Annotation(highFrontUnrndVowel).Value; morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "29", "19"); rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(highBackRndVowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "27", "19"); Allophonic.PhonologicalRules.Clear(); Morphophonemic.PhonologicalRules.Add(rule4); rule4.Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "b")).Value; rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "+")).Value }); var rule5 = new RewriteRule { Name = "rule5", Lhs = Pattern<Word, ShapeNode>.New() .Annotation(Char(Table3, "u")) .Annotation(Char(Table3, "b")) .Annotation(Char(Table3, "u")).Value }; Morphophonemic.PhonologicalRules.Add(rule5); rule5.Subrules.Add(new RewriteSubrule { LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "+")).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); var rule1 = new RewriteRule { Name = "rule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(Char(Table3, "t")).Value }; Morphophonemic.PhonologicalRules.Add(rule1); rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(nonCons).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); Assert.That(morpher.ParseWord("b"), Is.Empty); Morphophonemic.PhonologicalRules.Clear(); Allophonic.PhonologicalRules.Add(rule4); Allophonic.PhonologicalRules.Add(rule5); Allophonic.PhonologicalRules.Add(rule1); rule4.Subrules[0].LeftEnvironment = Pattern<Word, ShapeNode>.New().Value; rule5.Lhs = Pattern<Word, ShapeNode>.New() .Annotation(Char(Table3, "u")) .Annotation(Char(Table3, "b")) .Annotation(Char(Table3, "i")).Value; rule5.Subrules[0].RightEnvironment = Pattern<Word, ShapeNode>.New().Value; morpher = new Morpher(SpanFactory, TraceManager, Language); Assert.That(morpher.ParseWord("b"), Is.Empty); Allophonic.PhonologicalRules.Clear(); Allophonic.PhonologicalRules.Add(rule4); Morphophonemic.PhonologicalRules.Add(rule5); rule4.Lhs = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, cons) .Feature("poa").EqualToVariable("a") .Feature("vd").EqualToVariable("b") .Feature("cont").EqualToVariable("c") .Feature("nasal").EqualToVariable("d").Value).Value; rule4.Subrules.Clear(); rule4.Subrules.Add(new RewriteSubrule { RightEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(FeatureStruct.New(Language.PhonologicalFeatureSystem, cons) .Feature("poa").EqualToVariable("a") .Feature("vd").EqualToVariable("b") .Feature("cont").EqualToVariable("c") .Feature("nasal").EqualToVariable("d").Value).Value }); rule5.Lhs = Pattern<Word, ShapeNode>.New().Annotation(cons).Value; rule5.Subrules.Clear(); rule5.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(voiced).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("aba"), "39", "40"); }
public void DisjunctiveRules() { var stop = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("cont-").Value; var asp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp+").Value; var unasp = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("asp-").Value; var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var backRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+") .Symbol("round+").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var highFrontVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("back-").Value; var frontRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back-") .Symbol("round+").Value; var frontRndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back-") .Symbol("round+").Value; var backUnrnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round-").Value; var backUnrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back+") .Symbol("round-").Value; var frontUnrnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back-") .Symbol("round-").Value; var frontUnrndVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("back-") .Symbol("round-").Value; var p = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("cont-") .Symbol("vd-") .Symbol("asp-") .Symbol("bilabial").Value; var vd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("vd+").Value; var vowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+").Value; var voicelessStop = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("vd-") .Symbol("cont-").Value; var disrule1 = new RewriteRule { Name = "disrule1", Lhs = Pattern<Word, ShapeNode>.New().Annotation(stop).Value }; Allophonic.PhonologicalRules.Add(disrule1); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value }); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("pʰip"), "41"); disrule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value; disrule1.Subrules.Clear(); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(backRndVowel) .Group(g => g.Annotation(cons).Annotation(highFrontVowel)).LazyZeroOrMore .Annotation(cons).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(frontRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(frontRndVowel) .Group(g => g.Annotation(cons).Annotation(highFrontVowel)).LazyZeroOrMore .Annotation(cons).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backUnrnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(backUnrndVowel) .Group(g => g.Annotation(cons).Annotation(highFrontVowel)).LazyZeroOrMore .Annotation(cons).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(frontUnrnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New() .Annotation(frontUnrndVowel) .Group(g => g.Annotation(cons).Annotation(highFrontVowel)).LazyZeroOrMore .Annotation(cons).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bububu"), "42", "43"); disrule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(stop).Value; disrule1.Subrules.Clear(); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.LeftSideAnchor).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("pʰip"), "41"); disrule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(p).Value; disrule1.Subrules.Clear(); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(vd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(vowel).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, RightEnvironment = Pattern<Word, ShapeNode>.New().Annotation(HCFeatureSystem.RightSideAnchor).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("bubu"), "46", "19"); disrule1.Lhs = Pattern<Word, ShapeNode>.New().Annotation(voicelessStop).Value; disrule1.Subrules.Clear(); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(asp).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(voicelessStop).Value }); disrule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(unasp).Value }); morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("ktʰb"), "49"); }
public void MultipleApplicationRules() { var highVowel = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+").Value; var backRnd = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("back+") .Symbol("round+").Value; var i = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons-") .Symbol("voc+") .Symbol("high+") .Symbol("back-") .Symbol("round-").Value; var cons = FeatureStruct.New(Language.PhonologicalFeatureSystem) .Symbol(HCFeatureSystem.Segment) .Symbol("cons+") .Symbol("voc-").Value; var rule1 = new RewriteRule { Name = "rule1", ApplicationMode = RewriteApplicationMode.Simultaneous, Lhs = Pattern<Word, ShapeNode>.New().Annotation(highVowel).Value }; rule1.Subrules.Add(new RewriteSubrule { Rhs = Pattern<Word, ShapeNode>.New().Annotation(backRnd).Value, LeftEnvironment = Pattern<Word, ShapeNode>.New().Annotation(i).Annotation(cons).Value }); Allophonic.PhonologicalRules.Add(rule1); var morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("gigugu"), "44"); rule1.ApplicationMode = RewriteApplicationMode.Iterative; morpher = new Morpher(SpanFactory, TraceManager, Language); AssertMorphsEqual(morpher.ParseWord("gigugi"), "44"); }