示例#1
0
        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");
        }
示例#4
0
        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;
        }
示例#5
0
        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");
        }
示例#6
0
        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");
        }
示例#7
0
        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");
        }
示例#8
0
        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));
            }
        }
示例#9
0
        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");
        }
示例#10
0
        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");
        }
示例#11
0
        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");
        }
示例#12
0
        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);
        }
示例#13
0
        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");
        }
示例#14
0
        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");
        }
示例#17
0
        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");
        }
示例#18
0
        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");
        }
示例#19
0
        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");
        }