コード例 #1
0
        public SynthesisRewriteRuleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, bool isIterative, Pattern<Word, ShapeNode> lhs,
			IEnumerable<RewriteSubrule> subrules)
            : base(lhs.IsEmpty)
        {
            Pattern.Acceptable = match => CheckTarget(match, lhs);

            if (lhs.IsEmpty)
            {
                Pattern.Children.Add(new Constraint<Word, ShapeNode>(FeatureStruct.New().Symbol(HCFeatureSystem.Segment, HCFeatureSystem.Anchor).Value));
            }
            else
            {
                foreach (Constraint<Word, ShapeNode> constraint in lhs.Children.Cast<Constraint<Word, ShapeNode>>())
                {
                    var newConstraint = constraint.DeepClone();
                    if (isIterative)
                        newConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                    Pattern.Children.Add(newConstraint);
                }
            }
            Pattern.Freeze();

            int i = 0;
            foreach (RewriteSubrule subrule in subrules)
            {
                if (lhs.Children.Count == subrule.Rhs.Children.Count)
                    SubruleSpecs.Add(new FeatureSynthesisRewriteSubruleSpec(spanFactory, matcherSettings, isIterative, subrule, i));
                else if (lhs.Children.Count > subrule.Rhs.Children.Count)
                    SubruleSpecs.Add(new NarrowSynthesisRewriteSubruleSpec(spanFactory, matcherSettings, isIterative, lhs.Children.Count, subrule, i));
                else if (lhs.Children.Count == 0)
                    SubruleSpecs.Add(new EpenthesisSynthesisRewriteSubruleSpec(spanFactory, matcherSettings, isIterative, subrule, i));
                i++;
            }
        }
コード例 #2
0
        public NarrowSynthesisRewriteSubruleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, bool isIterative,
			int targetCount, RewriteSubrule subrule, int index)
            : base(spanFactory, matcherSettings, isIterative, subrule, index)
        {
            _rhs = subrule.Rhs;
            _targetCount = targetCount;
        }
コード例 #3
0
ファイル: PatternRule.cs プロジェクト: FieldDB/machine
 public PatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec,
                    MatcherSettings <TOffset> matcherSettings)
 {
     _spanFactory = spanFactory;
     _ruleSpec    = ruleSpec;
     _matcher     = new Matcher <TData, TOffset>(spanFactory, _ruleSpec.Pattern, matcherSettings);
 }
コード例 #4
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;
            }
        }
コード例 #5
0
 public NarrowSynthesisRewriteSubruleSpec(MatcherSettings <ShapeNode> matcherSettings, bool isIterative,
                                          int targetCount, RewriteSubrule subrule, int index)
     : base(matcherSettings, isIterative, subrule, index)
 {
     _rhs         = subrule.Rhs;
     _targetCount = targetCount;
 }
コード例 #6
0
 public AnalysisRewriteSubruleSpec(MatcherSettings <ShapeNode> matcherSettings, RewriteSubrule subrule,
                                   Action <Match <Word, ShapeNode>, Range <ShapeNode>, VariableBindings> applyAction)
     : base(matcherSettings, CreateEnvironmentPattern(subrule.LeftEnvironment),
            CreateEnvironmentPattern(subrule.RightEnvironment))
 {
     _applyAction = applyAction;
 }
コード例 #7
0
        public FeatureAnalysisRewriteRuleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, Pattern<Word, ShapeNode> lhs, RewriteSubrule subrule)
            : base(false)
        {
            var rhsAntiFSs = new List<FeatureStruct>();
            foreach (Constraint<Word, ShapeNode> constraint in subrule.Rhs.Children.OfType<Constraint<Word, ShapeNode>>().Where(c => c.Type() == HCFeatureSystem.Segment))
                rhsAntiFSs.Add(constraint.FeatureStruct.AntiFeatureStruct());

            Pattern.Acceptable = match => IsUnapplicationNonvacuous(match, rhsAntiFSs);

            _analysisRhs = new Pattern<Word, ShapeNode>();
            int i = 0;
            foreach (Tuple<PatternNode<Word, ShapeNode>, PatternNode<Word, ShapeNode>> tuple in lhs.Children.Zip(subrule.Rhs.Children))
            {
                var lhsConstraint = (Constraint<Word, ShapeNode>) tuple.Item1;
                var rhsConstraint = (Constraint<Word, ShapeNode>) tuple.Item2;

                if (lhsConstraint.Type() == HCFeatureSystem.Segment && rhsConstraint.Type() == HCFeatureSystem.Segment)
                {
                    var targetConstraint = lhsConstraint.DeepClone();
                    targetConstraint.FeatureStruct.PriorityUnion(rhsConstraint.FeatureStruct);
                    targetConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                    Pattern.Children.Add(new Group<Word, ShapeNode>("target" + i) {Children = {targetConstraint}});

                    FeatureStruct fs = rhsConstraint.FeatureStruct.AntiFeatureStruct();
                    fs.Subtract(lhsConstraint.FeatureStruct.AntiFeatureStruct());
                    fs.AddValue(HCFeatureSystem.Type, HCFeatureSystem.Segment);
                    _analysisRhs.Children.Add(new Constraint<Word, ShapeNode>(fs));

                    i++;
                }
            }
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(spanFactory, matcherSettings, subrule, Unapply));
        }
コード例 #8
0
 protected SynthesisRewriteSubruleSpec(SpanFactory <ShapeNode> spanFactory, MatcherSettings <ShapeNode> matcherSettings, bool isIterative,
                                       RewriteSubrule subrule, int index)
     : base(spanFactory, matcherSettings, subrule.LeftEnvironment, subrule.RightEnvironment)
 {
     _isIterative = isIterative;
     _subrule     = subrule;
     _index       = index;
 }
コード例 #9
0
        protected SynthesisRewriteSubruleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, bool isIterative,
			RewriteSubrule subrule, int index)
            : base(spanFactory, matcherSettings, subrule.LeftEnvironment, subrule.RightEnvironment)
        {
            _isIterative = isIterative;
            _subrule = subrule;
            _index = index;
        }
コード例 #10
0
        public NarrowAnalysisRewriteRuleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, Pattern<Word, ShapeNode> lhs, RewriteSubrule subrule)
            : base(subrule.Rhs.IsEmpty)
        {
            _analysisRhs = lhs;
            _targetCount = subrule.Rhs.Children.Count;

            if (subrule.Rhs.IsEmpty)
                Pattern.Children.Add(new Constraint<Word, ShapeNode>(FeatureStruct.New().Symbol(HCFeatureSystem.Segment, HCFeatureSystem.Anchor).Value));
            else
                Pattern.Children.AddRange(subrule.Rhs.Children.DeepClone());
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(spanFactory, matcherSettings, subrule, Unapply));
        }
コード例 #11
0
        public EpenthesisAnalysisRewriteRuleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, RewriteSubrule subrule)
            : base(false)
        {
            Pattern.Acceptable = IsUnapplicationNonvacuous;
            _targetCount = subrule.Rhs.Children.Count;

            foreach (Constraint<Word, ShapeNode> constraint in subrule.Rhs.Children.Cast<Constraint<Word, ShapeNode>>())
            {
                var newConstraint = constraint.DeepClone();
                newConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                Pattern.Children.Add(newConstraint);
            }
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(spanFactory, matcherSettings, subrule, Unapply));
        }
コード例 #12
0
        public SynthesisMetathesisRule(SpanFactory <ShapeNode> spanFactory, Morpher morpher, MetathesisRule rule)
        {
            _morpher = morpher;
            _rule    = rule;

            var ruleSpec = new SynthesisMetathesisRuleSpec(spanFactory, rule.Pattern, rule.LeftSwitchName, rule.RightSwitchName);

            var settings = new MatcherSettings <ShapeNode>
            {
                Direction   = rule.Direction,
                Filter      = ann => ann.Type().IsOneOf(HCFeatureSystem.Segment, HCFeatureSystem.Boundary, HCFeatureSystem.Anchor) && !ann.IsDeleted(),
                UseDefaults = true
            };

            _patternRule = new IterativePhonologicalPatternRule(spanFactory, ruleSpec, settings);
        }
コード例 #13
0
        public EpenthesisAnalysisRewriteRuleSpec(MatcherSettings <ShapeNode> matcherSettings, RewriteSubrule subrule)
            : base(false)
        {
            Pattern.Acceptable = IsUnapplicationNonvacuous;
            _targetCount       = subrule.Rhs.Children.Count;

            foreach (Constraint <Word, ShapeNode> constraint in subrule.Rhs.Children.Cast <Constraint <Word, ShapeNode> >())
            {
                Constraint <Word, ShapeNode> newConstraint = constraint.Clone();
                newConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                Pattern.Children.Add(newConstraint);
            }
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(matcherSettings, subrule, Unapply));
        }
コード例 #14
0
        public SynthesisRewriteRuleSpec(MatcherSettings <ShapeNode> matcherSettings, bool isIterative,
                                        Pattern <Word, ShapeNode> lhs, IEnumerable <RewriteSubrule> subrules)
            : base(lhs.IsEmpty)
        {
            Pattern.Acceptable = match => CheckTarget(match, lhs);

            if (lhs.IsEmpty)
            {
                Pattern.Children.Add(new Constraint <Word, ShapeNode>(
                                         FeatureStruct.New().Symbol(HCFeatureSystem.Segment, HCFeatureSystem.Anchor).Value));
            }
            else
            {
                foreach (Constraint <Word, ShapeNode> constraint in lhs.Children.Cast <Constraint <Word, ShapeNode> >())
                {
                    var newConstraint = constraint.Clone();
                    if (isIterative)
                    {
                        newConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                    }
                    Pattern.Children.Add(newConstraint);
                }
            }
            Pattern.Freeze();

            int i = 0;

            foreach (RewriteSubrule subrule in subrules)
            {
                if (lhs.Children.Count == subrule.Rhs.Children.Count)
                {
                    SubruleSpecs.Add(new FeatureSynthesisRewriteSubruleSpec(matcherSettings, isIterative, subrule, i));
                }
                else if (lhs.Children.Count > subrule.Rhs.Children.Count)
                {
                    SubruleSpecs.Add(new NarrowSynthesisRewriteSubruleSpec(matcherSettings, isIterative,
                                                                           lhs.Children.Count, subrule, i));
                }
                else if (lhs.Children.Count == 0)
                {
                    SubruleSpecs.Add(new EpenthesisSynthesisRewriteSubruleSpec(matcherSettings, isIterative, subrule,
                                                                               i));
                }
                i++;
            }
        }
コード例 #15
0
        public FeatureAnalysisRewriteRuleSpec(MatcherSettings <ShapeNode> matcherSettings, Pattern <Word, ShapeNode> lhs,
                                              RewriteSubrule subrule)
            : base(false)
        {
            var rhsAntiFSs = new List <FeatureStruct>();

            foreach (Constraint <Word, ShapeNode> constraint in subrule.Rhs.Children
                     .OfType <Constraint <Word, ShapeNode> >().Where(c => c.Type() == HCFeatureSystem.Segment))
            {
                rhsAntiFSs.Add(constraint.FeatureStruct.AntiFeatureStruct());
            }

            Pattern.Acceptable = match => IsUnapplicationNonvacuous(match, rhsAntiFSs);

            _analysisRhs = new Pattern <Word, ShapeNode>();
            int i = 0;

            foreach (Tuple <PatternNode <Word, ShapeNode>, PatternNode <Word, ShapeNode> > tuple in lhs.Children
                     .Zip(subrule.Rhs.Children))
            {
                var lhsConstraint = (Constraint <Word, ShapeNode>)tuple.Item1;
                var rhsConstraint = (Constraint <Word, ShapeNode>)tuple.Item2;

                if (lhsConstraint.Type() == HCFeatureSystem.Segment && rhsConstraint.Type() == HCFeatureSystem.Segment)
                {
                    Constraint <Word, ShapeNode> targetConstraint = lhsConstraint.Clone();
                    targetConstraint.FeatureStruct.PriorityUnion(rhsConstraint.FeatureStruct);
                    targetConstraint.FeatureStruct.AddValue(HCFeatureSystem.Modified, HCFeatureSystem.Clean);
                    Pattern.Children.Add(new Group <Word, ShapeNode>("target" + i)
                    {
                        Children = { targetConstraint }
                    });

                    FeatureStruct fs = rhsConstraint.FeatureStruct.AntiFeatureStruct();
                    fs.Subtract(lhsConstraint.FeatureStruct.AntiFeatureStruct());
                    fs.AddValue(HCFeatureSystem.Type, HCFeatureSystem.Segment);
                    _analysisRhs.Children.Add(new Constraint <Word, ShapeNode>(fs));

                    i++;
                }
            }
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(matcherSettings, subrule, Unapply));
        }
コード例 #16
0
        public NarrowAnalysisRewriteRuleSpec(SpanFactory <ShapeNode> spanFactory, MatcherSettings <ShapeNode> matcherSettings, Pattern <Word, ShapeNode> lhs, RewriteSubrule subrule)
            : base(subrule.Rhs.IsEmpty)
        {
            _analysisRhs = lhs;
            _targetCount = subrule.Rhs.Children.Count;

            if (subrule.Rhs.IsEmpty)
            {
                Pattern.Children.Add(new Constraint <Word, ShapeNode>(FeatureStruct.New().Symbol(HCFeatureSystem.Segment, HCFeatureSystem.Anchor).Value));
            }
            else
            {
                Pattern.Children.AddRange(subrule.Rhs.Children.DeepClone());
            }
            Pattern.Freeze();

            SubruleSpecs.Add(new AnalysisRewriteSubruleSpec(spanFactory, matcherSettings, subrule, Unapply));
        }
コード例 #17
0
        public AnalysisMetathesisRule(SpanFactory <ShapeNode> spanFactory, Morpher morpher, MetathesisRule rule)
        {
            _morpher = morpher;
            _rule    = rule;

            var ruleSpec = new AnalysisMetathesisRuleSpec(rule.Pattern, rule.LeftSwitchName, rule.RightSwitchName);

            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
            };

            _patternRule = new IterativePhonologicalPatternRule(spanFactory, ruleSpec, settings);
        }
コード例 #18
0
        protected RewriteSubruleSpec(SpanFactory <ShapeNode> spanFactory, MatcherSettings <ShapeNode> matcherSettings,
                                     Pattern <Word, ShapeNode> leftEnv, Pattern <Word, ShapeNode> rightEnv)
        {
            if (leftEnv != null && !leftEnv.IsEmpty)
            {
                MatcherSettings <ShapeNode> leftEnvMatcherSettings = matcherSettings.DeepClone();
                leftEnvMatcherSettings.Direction       = Direction.RightToLeft;
                leftEnvMatcherSettings.AnchoredToStart = true;
                _leftEnvMatcher = new Matcher <Word, ShapeNode>(spanFactory, leftEnv, leftEnvMatcherSettings);
            }

            if (rightEnv != null && !rightEnv.IsEmpty)
            {
                MatcherSettings <ShapeNode> rightEnvMatcherSettings = matcherSettings.DeepClone();
                rightEnvMatcherSettings.Direction       = Direction.LeftToRight;
                rightEnvMatcherSettings.AnchoredToStart = true;
                _rightEnvMatcher = new Matcher <Word, ShapeNode>(spanFactory, rightEnv, rightEnvMatcherSettings);
            }
        }
コード例 #19
0
        protected RewriteSubruleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings,
			Pattern<Word, ShapeNode> leftEnv, Pattern<Word, ShapeNode> rightEnv)
        {
            if (leftEnv != null && !leftEnv.IsEmpty)
            {
                MatcherSettings<ShapeNode> leftEnvMatcherSettings = matcherSettings.DeepClone();
                leftEnvMatcherSettings.Direction = Direction.RightToLeft;
                leftEnvMatcherSettings.AnchoredToStart = true;
                _leftEnvMatcher = new Matcher<Word, ShapeNode>(spanFactory, leftEnv, leftEnvMatcherSettings);
            }

            if (rightEnv != null && !rightEnv.IsEmpty)
            {
                MatcherSettings<ShapeNode> rightEnvMatcherSettings = matcherSettings.DeepClone();
                rightEnvMatcherSettings.Direction = Direction.LeftToRight;
                rightEnvMatcherSettings.AnchoredToStart = true;
                _rightEnvMatcher = new Matcher<Word, ShapeNode>(spanFactory, rightEnv, rightEnvMatcherSettings);
            }
        }
コード例 #20
0
ファイル: Stemmer.cs プロジェクト: JRetza/cog
        private void StemWords(Direction dir, IEnumerable <Word> words, IEnumerable <Affix> affixes)
        {
            var ruleSpec = new BatchPatternRuleSpec <Word, ShapeNode>();

            foreach (Affix affix in affixes)
            {
                var pattern = new Pattern <Word, ShapeNode> {
                    Acceptable = CheckStemWholeWord
                };
                if (dir == Direction.LeftToRight)
                {
                    pattern.Children.Add(new Constraint <Word, ShapeNode>(FeatureStruct.New().Symbol(CogFeatureSystem.AnchorType).Value));
                }
                foreach (ShapeNode node in affix.Shape)
                {
                    pattern.Children.Add(new Quantifier <Word, ShapeNode>(0, 1, new Constraint <Word, ShapeNode>(FeatureStruct.New().Symbol(CogFeatureSystem.BoundaryType).Value)));
                    pattern.Children.Add(new Constraint <Word, ShapeNode>(node.Annotation.FeatureStruct.Clone()));
                    pattern.Children.Add(new Quantifier <Word, ShapeNode>(0, 1, new Constraint <Word, ShapeNode>(FeatureStruct.New().Symbol(CogFeatureSystem.ToneLetterType).Value)));
                }
                if (dir == Direction.RightToLeft)
                {
                    pattern.Children.Add(new Constraint <Word, ShapeNode>(FeatureStruct.New().Symbol(CogFeatureSystem.AnchorType).Value));
                }
                string category = affix.Category;
                ruleSpec.RuleSpecs.Add(new DefaultPatternRuleSpec <Word, ShapeNode>(pattern, MarkStem, word => category == null || word.Meaning.Category == category));
            }

            var matcherSettings = new MatcherSettings <ShapeNode>
            {
                Direction = dir,
                Filter    = ann => ann.Type().IsOneOf(CogFeatureSystem.ConsonantType, CogFeatureSystem.VowelType, CogFeatureSystem.AnchorType,
                                                      CogFeatureSystem.ToneLetterType, CogFeatureSystem.BoundaryType)
            };
            var rule = new PatternRule <Word, ShapeNode>(ruleSpec, matcherSettings);

            foreach (Word word in words.Where(w => w.Shape.Count > 0))
            {
                rule.Apply(word);
            }
        }
コード例 #21
0
 public MultiplePatternRule(SpanFactory <TOffset> spanFactory, IPatternRuleSpec <TData, TOffset> ruleSpec, MatcherSettings <TOffset> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
 }
コード例 #22
0
 protected PhonologicalPatternRule(SpanFactory <ShapeNode> spanFactory, IPhonologicalPatternRuleSpec ruleSpec, MatcherSettings <ShapeNode> matcherSettings)
 {
     _spanFactory = spanFactory;
     _ruleSpec    = ruleSpec;
     _matcher     = new Matcher <Word, ShapeNode>(spanFactory, _ruleSpec.Pattern, matcherSettings);
 }
コード例 #23
0
 public IterativePhonologicalPatternRule(SpanFactory <ShapeNode> spanFactory, IPhonologicalPatternRuleSpec ruleSpec, MatcherSettings <ShapeNode> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
 }
コード例 #24
0
 protected PhonologicalPatternRule(IPhonologicalPatternRuleSpec ruleSpec,
                                   MatcherSettings <ShapeNode> matcherSettings)
 {
     _ruleSpec = ruleSpec;
     _matcher  = new Matcher <Word, ShapeNode>(_ruleSpec.Pattern, matcherSettings);
 }
コード例 #25
0
 public SimultaneousPhonologicalPatternRule(SpanFactory <ShapeNode> spanFactory, IPhonologicalPatternRuleSpec ruleSpec, MatcherSettings <ShapeNode> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
     _ruleSpec = ruleSpec;
 }
コード例 #26
0
 public SimultaneousPhonologicalPatternRule(IPhonologicalPatternRuleSpec ruleSpec,
                                            MatcherSettings <ShapeNode> matcherSettings)
     : base(ruleSpec, matcherSettings)
 {
     _ruleSpec = ruleSpec;
 }
コード例 #27
0
        public AnalysisRewriteSubruleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, RewriteSubrule subrule,
			Action<Match<Word, ShapeNode>, Span<ShapeNode>, VariableBindings> applyAction)
            : base(spanFactory, matcherSettings, CreateEnvironmentPattern(subrule.LeftEnvironment), CreateEnvironmentPattern(subrule.RightEnvironment))
        {
            _applyAction = applyAction;
        }
コード例 #28
0
 public FeatureSynthesisRewriteSubruleSpec(MatcherSettings <ShapeNode> matcherSettings, bool isIterative,
                                           RewriteSubrule subrule, int index)
     : base(matcherSettings, isIterative, subrule, index)
 {
     _rhs = subrule.Rhs;
 }
コード例 #29
0
 public IterativePhonologicalPatternRule(SpanFactory<ShapeNode> spanFactory, IPhonologicalPatternRuleSpec ruleSpec, MatcherSettings<ShapeNode> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
 }
コード例 #30
0
        public FeatureSynthesisRewriteSubruleSpec(SpanFactory<ShapeNode> spanFactory, MatcherSettings<ShapeNode> matcherSettings, bool isIterative,
			RewriteSubrule subrule, int index)
            : base(spanFactory, matcherSettings, isIterative, subrule, index)
        {
            _rhs = subrule.Rhs;
        }
コード例 #31
0
 public EpenthesisSynthesisRewriteSubruleSpec(SpanFactory <ShapeNode> spanFactory, MatcherSettings <ShapeNode> matcherSettings, bool isIterative,
                                              RewriteSubrule subrule, int index)
     : base(spanFactory, matcherSettings, isIterative, subrule, index)
 {
     _rhs = subrule.Rhs;
 }
コード例 #32
0
ファイル: PatternRule.cs プロジェクト: ermshiperete/machine
 public PatternRule(IPatternRuleSpec <TData, TOffset> ruleSpec, MatcherSettings <TOffset> matcherSettings)
 {
     _ruleSpec = ruleSpec;
     _matcher  = new Matcher <TData, TOffset>(_ruleSpec.Pattern, matcherSettings);
 }
コード例 #33
0
 public SimultaneousPhonologicalPatternRule(SpanFactory<ShapeNode> spanFactory, IPhonologicalPatternRuleSpec ruleSpec, MatcherSettings<ShapeNode> matcherSettings)
     : base(spanFactory, ruleSpec, matcherSettings)
 {
     _ruleSpec = ruleSpec;
 }
コード例 #34
0
 public IterativePhonologicalPatternRule(IPhonologicalPatternRuleSpec ruleSpec,
                                         MatcherSettings <ShapeNode> matcherSettings)
     : base(ruleSpec, matcherSettings)
 {
 }
コード例 #35
0
        public AnalysisRewriteRule(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(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(settings, _rule.Lhs, sr);
                    mode        = RewriteApplicationMode.Simultaneous;
                    reapplyType = ReapplyType.Deletion;
                }
                else if (_rule.Lhs.Children.Count == 0)
                {
                    ruleSpec = new EpenthesisAnalysisRewriteRuleSpec(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(ruleSpec, settings);
                    break;

                case RewriteApplicationMode.Simultaneous:
                    patternRule = new SimultaneousPhonologicalPatternRule(ruleSpec, settings);
                    break;
                }

                _rules.Add(Tuple.Create(reapplyType, patternRule));
            }
        }
コード例 #36
0
		public MultiplePatternRule(IPatternRuleSpec<TData, TOffset> ruleSpec, MatcherSettings<TOffset> matcherSettings)
			: base(ruleSpec, matcherSettings)
		{
		}