public bool Scan(char c) { // get expected lexemes var expectedLexemes = from rule in _parseEngine.GetExpectedLexerRules() where rule.LexerRuleType == TerminalLexerRule.TerminalLexerRuleType let terminalRule = rule as ITerminalLexerRule select new TerminalLexeme(terminalRule); // filter on first rule to pass (since all rules are one character per lexeme) // PERF: Avoid Linq FirstOrDefault due to lambda allocation TerminalLexeme firstPassingRule = null; foreach (var lexeme in expectedLexemes) if (lexeme.Scan(c)) { firstPassingRule = lexeme; break; } if (firstPassingRule == null) return false; var token = new Token(firstPassingRule.Capture, _parseEngine.Location, firstPassingRule.TokenType); var result = _parseEngine.Pulse(token); if (result) _capture.Append(c); return result; }
private IForestNode CreateNullParseNode(ISymbol symbol, int location) { var symbolNode = _nodeSet.AddOrGetExistingSymbolNode(symbol, location, location); var token = new Token(string.Empty, location, new TokenType(string.Empty)); var nullNode = new TokenForestNode(token, location, location); symbolNode.AddUniqueFamily(nullNode); return symbolNode; }
public override void Visit(ITerminalForestNode terminalNode) { var token = new Token( terminalNode.Capture.ToString(), terminalNode.Origin, new TokenType(terminalNode.ToString())); VisitToken(terminalNode.Origin, terminalNode.Location, token); }