Esempio n. 1
0
        public IParseResultGroup Parse(ILexResultGroup lexedSource)
        {
            // initialize group
            IParseResultGroup parseGroup = new ParseResultGroup(
                ParseStatus.Success,
                new ASTNode(ParseMatchType.Program, lexedSource)
                );

            Action <IParseResult> addItem = pr => {
                if (pr.Status != ParseStatus.None)
                {
                    parseGroup.Node.Add(pr.Node);
                    parseGroup.Add(pr);
                }
            };

            foreach (IParseRule rule in _parserRules)
            {
                foreach (ILexResult lexResult in lexedSource)
                {
                    if (!rule.Accepts(lexResult))
                    {
                        continue;
                    }

                    IParseResult parseResult = rule.Parse(lexResult);
                    addItem(parseResult);
                }
            }

            return(parseGroup);
        }
Esempio n. 2
0
        public IParseResult Parse(ILexResult target)
        {
            if (!Accepts(target))
            {
                return(ParseResult.Empty);
            }

            ASTNode containerNode = new ASTNode(target);

            containerNode.MatchType = MatchType;
            IParseResultGroup resultGroup = new ParseResultGroup(ParseStatus.Success, containerNode);

            Action <IParseResult> prAdder = pr => {
                if (pr.Status != ParseStatus.None && pr.Node.MatchType != ParseMatchType.None)
                {
                    containerNode.Add(pr.Node);
                    resultGroup.Add(pr);
                }
            };

            foreach (IParseRule rule in _parseRules)
            {
                if (target is ILexResultGroup)
                {
                    ILexResultGroup targetGroup = target as ILexResultGroup;
                    foreach (ILexResult lexResult in targetGroup)
                    {
                        IParseResult parseResult = rule.Parse(lexResult);
                        prAdder(parseResult);
                    }
                }
                else
                {
                    IParseResult parseResult = rule.Parse(target);
                    prAdder(parseResult);
                }
            }

            return(resultGroup);
        }