// Generated by TinyPG v1.1 available at www.codeproject.com
using System;
using System.Collections.Generic;
namespace TinyPG
{
#region Parser
public partial class Parser
{
private Scanner scanner;
private ParseTree tree;
public Parser(Scanner scanner)
{
this.scanner = scanner;
}
public ParseTree Parse(string input)
{
tree = new ParseTree();
return Parse(input, tree);
}
public ParseTree Parse(string input, ParseTree tree)
{
scanner.Init(input);
this.tree = tree;
ParseStart(tree);
tree.Skipped = scanner.Skipped;
return tree;
}
private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start
{
Token tok;
ParseNode n;
ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Start), "Start");
parent.Nodes.Add(node);
// Concat Rule
do { // OneOrMore Rule
ParseAddExpr(node); // NonTerminal Rule: AddExpr
tok = scanner.LookAhead(TokenType.NUMBER, TokenType.BROPEN); // OneOrMore Rule
|| tok.Type == TokenType.NUMBER
|| tok.Type == TokenType.BROPEN); // OneOrMore Rule
// Concat Rule
tok = scanner.Scan(TokenType.EOF); // Terminal Rule: EOF
if (tok.Type != TokenType.EOF)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.EOF.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
parent.Token.UpdateRange(node.Token);
} // NonTerminalSymbol: Start
private void ParseAddExpr(ParseNode parent) // NonTerminalSymbol: AddExpr
{
Token tok;
ParseNode n;
ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddExpr), "AddExpr");
parent.Nodes.Add(node);
// Concat Rule
ParseMultExpr(node); // NonTerminal Rule: MultExpr
// Concat Rule
tok = scanner.LookAhead(TokenType.PLUSMINUS); // ZeroOrMore Rule
while (tok.Type == TokenType.PLUSMINUS)
{
// Concat Rule
tok = scanner.Scan(TokenType.PLUSMINUS); // Terminal Rule: PLUSMINUS
if (tok.Type != TokenType.PLUSMINUS)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.PLUSMINUS.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
// Concat Rule
ParseMultExpr(node); // NonTerminal Rule: MultExpr
tok = scanner.LookAhead(); // ZeroOrMore Rule
}
parent.Token.UpdateRange(node.Token);
} // NonTerminalSymbol: AddExpr
private void ParseMultExpr(ParseNode parent) // NonTerminalSymbol: MultExpr
{
Token tok;
ParseNode n;
ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.MultExpr), "MultExpr");
parent.Nodes.Add(node);
// Concat Rule
ParseAtom(node); // NonTerminal Rule: Atom
// Concat Rule
tok = scanner.LookAhead(TokenType.MULTDIV); // ZeroOrMore Rule
while (tok.Type == TokenType.MULTDIV)
{
// Concat Rule
tok = scanner.Scan(TokenType.MULTDIV); // Terminal Rule: MULTDIV
if (tok.Type != TokenType.MULTDIV)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.MULTDIV.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
// Concat Rule
ParseAtom(node); // NonTerminal Rule: Atom
tok = scanner.LookAhead(); // ZeroOrMore Rule
}
parent.Token.UpdateRange(node.Token);
} // NonTerminalSymbol: MultExpr
private void ParseAtom(ParseNode parent) // NonTerminalSymbol: Atom
{
Token tok;
ParseNode n;
ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Atom), "Atom");
parent.Nodes.Add(node);
tok = scanner.LookAhead(TokenType.NUMBER, TokenType.BROPEN); // Choice Rule
switch (tok.Type)
{ // Choice Rule
case TokenType.NUMBER:
tok = scanner.Scan(TokenType.NUMBER); // Terminal Rule: NUMBER
if (tok.Type != TokenType.NUMBER)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.NUMBER.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
break;
case TokenType.BROPEN:
// Concat Rule
tok = scanner.Scan(TokenType.BROPEN); // Terminal Rule: BROPEN
if (tok.Type != TokenType.BROPEN)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.BROPEN.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
// Concat Rule
ParseAddExpr(node); // NonTerminal Rule: AddExpr
// Concat Rule
tok = scanner.Scan(TokenType.BRCLOSE); // Terminal Rule: BRCLOSE
if (tok.Type != TokenType.BRCLOSE)
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.BRCLOSE.ToString(), 0x1001, 0, tok.StartPos, tok.StartPos, tok.Length));
n = node.CreateNode(tok, tok.ToString() );
node.Token.UpdateRange(tok);
node.Nodes.Add(n);
break;
default:
tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found.", 0x0002, 0, tok.StartPos, tok.StartPos, tok.Length));
break;
} // Choice Rule
parent.Token.UpdateRange(node.Token);
} // NonTerminalSymbol: Atom
}
#endregion Parser
}