コード例 #1
0
ファイル: ParseEngineLexeme.cs プロジェクト: whitten/Pliant
        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;
        }
コード例 #2
0
ファイル: ParseEngine.cs プロジェクト: bilsaboob/Pliant
 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;
 }
コード例 #3
0
 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);
 }