private void ParseExpression(ParseNode parent) // NonTerminalSymbol: Expression
{
ParseNode node = parent.CreateNode(_scanner.GetToken(TokenType.Expression), "Expression");
parent.Nodes.Add(node);
// Concat Rule
ParseLogicalOr(node); // NonTerminal Rule: LogicalOr
// Concat Rule
var tok = _scanner.LookAhead(TokenType.QUESTION);
if (tok.Type == TokenType.QUESTION)
{
// Concat Rule
tok = _scanner.Scan(TokenType.QUESTION); // Terminal Rule: QUESTION
var n = node.CreateNode(tok, tok.ToString());
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
if (tok.Type != TokenType.QUESTION)
{
tree.Errors.Add(new ParseError(
"Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.QUESTION.ToString(), 0x1001, tok));
return;
}
// Concat Rule
ParseExpression(node); // NonTerminal Rule: Expression
// Concat Rule
tok = _scanner.Scan(TokenType.COLON); // Terminal Rule: COLON
n = node.CreateNode(tok, tok.ToString());
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
if (tok.Type != TokenType.COLON)
{
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.COLON.ToString(),
0x1001, tok));
return;
}
// Concat Rule
ParseExpression(node); // NonTerminal Rule: Expression
}
parent.Token.UpdateRange(node.Token);
} // NonTerminalSymbol: Expression