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; }
public bool MatchSubrule(PhonologicalPatternRule rule, Match<Word, ShapeNode> match, out PhonologicalSubruleMatch subruleMatch) { subruleMatch = new PhonologicalSubruleMatch(this, match.Span, match.VariableBindings); return true; }