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); }
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); }