public ParseTreeResult <IParseTree <TToken, TRule> > TryParse( IList <Token <TToken> > tokens, int matchFrom, IDictionary <TRule, RuleDefinition> rulesByType) { var elementTrees = new List <IParseTree <TToken, TRule> >(); var maxMatchedNextTokenIndex = matchFrom; foreach (var element in this.elements) { var parseTreeNodes = element.TryParse(tokens, matchFrom, rulesByType); if (parseTreeNodes.IsError) { return(RuleOptionResult.Error( parseTreeNodes.NextTokenIndex, Math.Max(parseTreeNodes.MaxMatchedNextTokenIndex, maxMatchedNextTokenIndex))); } if (parseTreeNodes.HasTreeItems) { elementTrees.AddRange(parseTreeNodes.TreeItems); } matchFrom = parseTreeNodes.NextTokenIndex; maxMatchedNextTokenIndex = parseTreeNodes.MaxMatchedNextTokenIndex; } return(RuleOptionResult.NonEmpty( new ParseTreeRule(this.ruleType, elementTrees), matchFrom, maxMatchedNextTokenIndex)); }
public ParseTreeResult <IParseTree <TToken, TRule> > TryParse( IList <Token <TToken> > tokens, int matchFrom, IDictionary <TRule, RuleDefinition> rulesByType) { var maxNextToken = matchFrom; var maxMaxMatchedNextToken = matchFrom; foreach (var option in this.options) { var parseTree = option.TryParse(tokens, matchFrom, rulesByType); if (!parseTree.IsError) { return(parseTree); } if (parseTree.NextTokenIndex > maxNextToken) { maxNextToken = parseTree.NextTokenIndex; } if (parseTree.MaxMatchedNextTokenIndex > maxMaxMatchedNextToken) { maxMaxMatchedNextToken = parseTree.MaxMatchedNextTokenIndex; } } return(RuleOptionResult.Error(maxNextToken, maxMaxMatchedNextToken)); }