Esempio n. 1
0
                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));
                }
Esempio n. 2
0
            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));
            }