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 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); }
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); }
public bool MatchSubrule(PhonologicalPatternRule rule, Match <Word, ShapeNode> match, out PhonologicalSubruleMatch subruleMatch) { subruleMatch = new PhonologicalSubruleMatch(this, match.Span, match.VariableBindings); return(true); }
public AnalysisRewriteRule(SpanFactory <ShapeNode> spanFactory, Morpher morpher, RewriteRule rule) { _morpher = morpher; _rule = rule; var settings = new MatcherSettings <ShapeNode> { Direction = rule.Direction == Direction.LeftToRight ? Direction.RightToLeft : Direction.LeftToRight, Filter = ann => ann.Type().IsOneOf(HCFeatureSystem.Segment, HCFeatureSystem.Anchor), MatchingMethod = MatchingMethod.Unification, UseDefaults = true, // during analysis shape nodes can have features that are underspecified, so this must be non-deterministic Nondeterministic = true }; _rules = new List <Tuple <ReapplyType, PhonologicalPatternRule> >(); foreach (RewriteSubrule sr in _rule.Subrules) { IPhonologicalPatternRuleSpec ruleSpec = null; var mode = RewriteApplicationMode.Iterative; var reapplyType = ReapplyType.Normal; if (_rule.Lhs.Children.Count == sr.Rhs.Children.Count) { ruleSpec = new FeatureAnalysisRewriteRuleSpec(spanFactory, settings, rule.Lhs, sr); if (_rule.ApplicationMode == RewriteApplicationMode.Simultaneous) { foreach (Constraint <Word, ShapeNode> constraint in sr.Rhs.Children.Cast <Constraint <Word, ShapeNode> >()) { if (constraint.Type() == HCFeatureSystem.Segment) { if (!IsUnifiable(constraint, sr.LeftEnvironment) || !IsUnifiable(constraint, sr.RightEnvironment)) { reapplyType = ReapplyType.SelfOpaquing; break; } } } } } else if (_rule.Lhs.Children.Count > sr.Rhs.Children.Count) { ruleSpec = new NarrowAnalysisRewriteRuleSpec(spanFactory, settings, _rule.Lhs, sr); mode = RewriteApplicationMode.Simultaneous; reapplyType = ReapplyType.Deletion; } else if (_rule.Lhs.Children.Count == 0) { ruleSpec = new EpenthesisAnalysisRewriteRuleSpec(spanFactory, settings, sr); if (_rule.ApplicationMode == RewriteApplicationMode.Simultaneous) { reapplyType = ReapplyType.SelfOpaquing; } } Debug.Assert(ruleSpec != null); PhonologicalPatternRule patternRule = null; switch (mode) { case RewriteApplicationMode.Iterative: patternRule = new IterativePhonologicalPatternRule(spanFactory, ruleSpec, settings); break; case RewriteApplicationMode.Simultaneous: patternRule = new SimultaneousPhonologicalPatternRule(spanFactory, ruleSpec, settings); break; } _rules.Add(Tuple.Create(reapplyType, patternRule)); } }
public bool MatchSubrule(PhonologicalPatternRule rule, Match <Word, ShapeNode> match, out PhonologicalSubruleMatch subruleMatch) { foreach (RewriteSubruleSpec subruleSpec in _subruleSpecs) { if (!subruleSpec.IsApplicable(match.Input)) { continue; } ShapeNode leftNode, rightNode, startNode, endNode; if (_isTargetEmpty) { if (match.Matcher.Direction == Direction.LeftToRight) { leftNode = match.Span.Start; rightNode = match.Span.End.Next; } else { leftNode = match.Span.Start.Prev; rightNode = match.Span.End; } startNode = leftNode; endNode = rightNode; } else { leftNode = match.Span.Start.Prev; rightNode = match.Span.End.Next; startNode = match.Span.Start; endNode = match.Span.End; } if (leftNode == null || rightNode == null) { subruleMatch = null; return(false); } VariableBindings varBindings = match.VariableBindings; Match <Word, ShapeNode> leftEnvMatch = subruleSpec.LeftEnvironmentMatcher == null ? null : subruleSpec.LeftEnvironmentMatcher.Match(match.Input, leftNode, varBindings); if (leftEnvMatch == null || leftEnvMatch.Success) { if (leftEnvMatch != null && leftEnvMatch.VariableBindings != null) { varBindings = leftEnvMatch.VariableBindings; } Match <Word, ShapeNode> rightEnvMatch = subruleSpec.RightEnvironmentMatcher == null ? null : subruleSpec.RightEnvironmentMatcher.Match(match.Input, rightNode, varBindings); if (rightEnvMatch == null || rightEnvMatch.Success) { if (rightEnvMatch != null && rightEnvMatch.VariableBindings != null) { varBindings = rightEnvMatch.VariableBindings; } subruleMatch = new PhonologicalSubruleMatch(subruleSpec, rule.SpanFactory.Create(startNode, endNode), varBindings); return(true); } } } subruleMatch = null; return(false); }