package de.fuberlin.projecta.parser;
import java.util.Set;
import java.util.Stack;
import de.fuberlin.commons.lexer.ILexer;
import de.fuberlin.commons.lexer.IToken;
import de.fuberlin.commons.lexer.TokenType;
import de.fuberlin.commons.parser.IParser;
import de.fuberlin.commons.parser.ISyntaxTree;
import de.fuberlin.projecta.lexer.SyntaxErrorException;
import de.fuberlin.projecta.utils.ListComprehension;
public class Parser implements IParser {
private ParseTable table = new ParseTable();
private Stack<Symbol> stack = new Stack<Symbol>();
private boolean debugEnabled = false;
private ISyntaxTree parseTree;
public Parser() {
try {
fillParseTable();
} catch (IllegalStateException e) {
System.out.println("Error: " + e);
e.printStackTrace();
}
}
private void initStack() {
stack.clear();
stack.push(new Symbol(TokenType.EOF));
stack.push(new Symbol(NonTerminal.program));
}
/// Implement the public interface
@Override
public ISyntaxTree parse(ILexer lexer, String grammar) throws ParseException {
// We're not interested in the grammar, we don't implement a generic parser
return parse(lexer);
}
private ISyntaxTree parse(ILexer lexer) throws SyntaxErrorException, ParseException {
if (table.isAmbigous()) {
throw new ParseException(
"Parsing table is ambigous! Won't start syntax analysis", null);
}
initStack();
IToken token = lexer.getNextToken(); // may throw
ISyntaxTree currentNode = new Tree(new Symbol(Symbol.Reserved.EPSILON));
do {
if (debugEnabled)
printStack();
Symbol peek = stack.pop();
if (peek.isReservedTerminal()) {
Symbol.Reserved reservedTerminal = peek.asReservedTerminal();
switch (reservedTerminal) {
case FP:
currentNode = currentNode.getParent();
case EPSILON: // fall-through, do nothing
default:
break;
}
} else if (peek.isTerminal()) {
TokenType terminal = peek.asTerminal();
if (terminal == TokenType.valueOf(token.getType())) {
Tree node = new Tree(new Symbol(terminal));
node.setToken(token);
currentNode.addChild(node);
try {
token = lexer.getNextToken();
} catch (SyntaxErrorException e) {
e.printStackTrace();
}
} else {
throw new ParseException("Wrong token '" + token.getText()
+ "' in input, expected type: '" + terminal.terminalSymbol() + "'", token);
}
} else /** stack symbol is non-terminal */
{
NonTerminal nonT = peek.asNonTerminal();
assert(nonT != null);
String prod = table.getEntry(nonT, TokenType.valueOf(token.getType()));
if (prod == null || prod.trim().equals("")) {
Set<String> expectedTokens = ListComprehension.map(table.getEntries(nonT).keySet(),
new ListComprehension.Func<TokenType, String>() {
public String apply(TokenType in) {
return in.terminalSymbol();
}
});
throw new ParseException("Didn't expect token",
"Syntax error: No rule in parsing table (Stack: "
+ peek + ", token: " + token + ")\n" +
"Expected: " + expectedTokens
, token);
}
ISyntaxTree node = new Tree(new Symbol(nonT));
currentNode.addChild(node);
currentNode = node;
stack.push(new Symbol(Symbol.Reserved.FP));
String[] tmp = prod.split("::=");
if (tmp.length == 2) {
String[] prods = tmp[1].split(" ");
for (int i = prods.length - 1; i >= 0; i--) {
if (!prods[i].trim().isEmpty()) {
Symbol symbol = new Symbol(prods[i]);
if (symbol.isReservedTerminal()
&& symbol.asReservedTerminal() == Symbol.Reserved.EPSILON)
continue;
stack.push(symbol);
}
}
} else {
throw new ParseException(
"Internal error",
"Wrong structure in parsing table! Productions should "
+ "be of the form: X ::= Y1 Y2 ... Yk! Problem with: "
+ prod + "(Stack: " + peek + ", token: "
+ token + ")", token);
}
}
} while (!(stack.peek().isTerminal() && stack.peek().asTerminal() == TokenType.EOF));
assert (stack.size() == 1); // containing the EOF symbol
assert (currentNode != null);
parseTree = currentNode;
return parseTree;
}
private void printStack() {
System.out.println(stack);
}
/**
* Cells should be filled by Productions of the form: X ::= Y1 Y2 ... Yk
* Treats basic as { INT_TYPE, REAL_TYPE, STRING_TYPE, BOOL_TYPE }!
*
* @throws IllegalStateException
*/
private void fillParseTable() throws IllegalStateException {
// program
table.setEntry(NonTerminal.program, TokenType.DEF, "program ::= funcs");
// funcs
table.setEntry(NonTerminal.funcs, TokenType.DEF,
"funcs ::= func funcs");
table.setEntry(NonTerminal.funcs, TokenType.EOF, "funcs ::= EPSILON");
// func_
table.setEntry(NonTerminal.func, TokenType.DEF,
"func ::= DEF type ID LPAREN optparams RPAREN func_");
table.setEntry(NonTerminal.func_, TokenType.OP_SEMIC,
"func_ ::= OP_SEMIC");
table.setEntry(NonTerminal.func_, TokenType.LBRACE, "func_ ::= block");
// optparams
table.setEntry(NonTerminal.optparams, TokenType.RPAREN,
"optparams ::= EPSILON");
table.setEntry(NonTerminal.optparams, TokenType.BASIC,
"optparams ::= params");
table.setEntry(NonTerminal.optparams, TokenType.RECORD,
"optparams ::= params");
// params
table.setEntry(NonTerminal.params, TokenType.BASIC,
"params ::= type ID params_");
table.setEntry(NonTerminal.params, TokenType.RECORD,
"params ::= type ID params_");
// params_
table.setEntry(NonTerminal.params_, TokenType.RPAREN,
"params_ ::= EPSILON");
table.setEntry(NonTerminal.params_, TokenType.OP_COMMA,
"params_ ::= OP_COMMA params");
// block
table.setEntry(NonTerminal.block, TokenType.LBRACE,
"block ::= LBRACE decls stmts RBRACE");
// decls
table.setEntry(NonTerminal.decls, TokenType.OP_NOT, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.OP_MINUS,
"decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.LPAREN, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.ID, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.IF, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.WHILE, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.DO, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.BREAK, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.RETURN, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.PRINT, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.LBRACE, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.RBRACE, "decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.INT_LITERAL,
"decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.REAL_LITERAL,
"decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.STRING_LITERAL,
"decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.BOOL_LITERAL,
"decls ::= EPSILON");
table.setEntry(NonTerminal.decls, TokenType.BASIC,
"decls ::= decl decls");
table.setEntry(NonTerminal.decls, TokenType.RECORD,
"decls ::= decl decls");
// decl
table.setEntry(NonTerminal.decl, TokenType.BASIC,
"decl ::= type ID OP_SEMIC");
table.setEntry(NonTerminal.decl, TokenType.RECORD,
"decl ::= type ID OP_SEMIC");
// type
table.setEntry(NonTerminal.type, TokenType.BASIC,
"type ::= BASIC type_");
table.setEntry(NonTerminal.type, TokenType.RECORD,
"type ::= RECORD LBRACE decls RBRACE type_");
// type_
table.setEntry(NonTerminal.type_, TokenType.ID, "type_ ::= EPSILON");
table.setEntry(NonTerminal.type_, TokenType.LBRACKET,
"type_ ::= LBRACKET INT_LITERAL RBRACKET type_ ");
// stmts
table.setEntry(NonTerminal.stmts, TokenType.ID, "stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.IF, "stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.WHILE,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.DO, "stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.BREAK,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.RETURN,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.PRINT,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.LBRACE,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.OP_NOT,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.OP_MINUS,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.LPAREN,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.INT_LITERAL,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.REAL_LITERAL,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.BOOL_LITERAL,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.STRING_LITERAL,
"stmts ::= stmt stmts");
table.setEntry(NonTerminal.stmts, TokenType.RBRACE, "stmts ::= EPSILON");
// stmt
table.setEntry(NonTerminal.stmt, TokenType.ID,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.OP_NOT,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.OP_MINUS,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.LPAREN,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.INT_LITERAL,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.REAL_LITERAL,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.BOOL_LITERAL,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.STRING_LITERAL,
"stmt ::= assign OP_SEMIC");
table.setEntry(NonTerminal.stmt, TokenType.LBRACE, "stmt ::= block");
table.setEntry(NonTerminal.stmt, TokenType.IF,
"stmt ::= IF LPAREN assign RPAREN stmt stmt_");
table.setEntry(NonTerminal.stmt, TokenType.WHILE,
"stmt ::= WHILE LPAREN assign RPAREN stmt ");
table.setEntry(NonTerminal.stmt, TokenType.DO,
"stmt ::= DO stmt WHILE LPAREN assign RPAREN OP_SEMIC ");
table.setEntry(NonTerminal.stmt, TokenType.BREAK,
"stmt ::= BREAK OP_SEMIC ");
table.setEntry(NonTerminal.stmt, TokenType.RETURN,
"stmt ::= RETURN stmt__");
table.setEntry(NonTerminal.stmt, TokenType.PRINT,
"stmt ::= PRINT loc OP_SEMIC ");
// stmt_
table.setEntry(NonTerminal.stmt_, TokenType.ELSE, "stmt_ ::= ELSE stmt");
table.setEntry(NonTerminal.stmt_, TokenType.ID, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.IF, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.WHILE, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.DO, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.BREAK, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.RETURN, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.PRINT, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.LBRACE, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.RBRACE, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.OP_NOT, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.OP_MINUS,
"stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.LPAREN, "stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.INT_LITERAL,
"stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.REAL_LITERAL,
"stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.STRING_LITERAL,
"stmt_ ::= EPSILON");
table.setEntry(NonTerminal.stmt_, TokenType.BOOL_LITERAL,
"stmt_ ::= EPSILON");
// stmt__
table.setEntry(NonTerminal.stmt__, TokenType.ID,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.INT_LITERAL,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.REAL_LITERAL,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.STRING_LITERAL,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.BOOL_LITERAL,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.OP_NOT,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.OP_MINUS,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.LPAREN,
"stmt__ ::= bool OP_SEMIC");
table.setEntry(NonTerminal.stmt__, TokenType.OP_SEMIC,
"stmt__ ::= OP_SEMIC");
// loc
table.setEntry(NonTerminal.loc, TokenType.ID, "loc ::= ID loc__ ");
// loc_
table.setEntry(NonTerminal.loc_, TokenType.LBRACKET,
"loc_ ::= LBRACKET assign RBRACKET");
table.setEntry(NonTerminal.loc_, TokenType.OP_DOT, "loc_ ::= OP_DOT ID");
// loc__
table.setEntry(NonTerminal.loc__, TokenType.LBRACKET,
"loc__ ::= loc_ loc__ ");
table.setEntry(NonTerminal.loc__, TokenType.OP_DOT,
"loc__ ::= loc_ loc__ ");
table.setEntry(NonTerminal.loc__, TokenType.LPAREN, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_SEMIC,
"loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_LT, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_LE, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_GE, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_GT, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_ADD, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_MINUS,
"loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_MUL, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_DIV, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_EQ, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_NE, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_AND, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_OR, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.RBRACKET,
"loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.RPAREN, "loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_ASSIGN,
"loc__ ::= EPSILON");
table.setEntry(NonTerminal.loc__, TokenType.OP_COMMA,
"loc__ ::= EPSILON");
// assign
table.setEntry(NonTerminal.assign, TokenType.ID,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.LPAREN,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.OP_MINUS,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.OP_NOT,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.INT_LITERAL,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.REAL_LITERAL,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.STRING_LITERAL,
"assign ::= bool assign_");
table.setEntry(NonTerminal.assign, TokenType.BOOL_LITERAL,
"assign ::= bool assign_");
// assign'
table.setEntry(NonTerminal.assign_, TokenType.OP_ASSIGN,
"assign_ ::= OP_ASSIGN assign assign_");
table.setEntry(NonTerminal.assign_, TokenType.RPAREN,
"assign_ ::= EPSILON ");
table.setEntry(NonTerminal.assign_, TokenType.RBRACKET,
"assign_ ::= EPSILON ");
table.setEntry(NonTerminal.assign_, TokenType.OP_COMMA,
"assign_ ::= EPSILON ");
table.setEntry(NonTerminal.assign_, TokenType.OP_SEMIC,
"assign_ ::= EPSILON ");
// bool
table.setEntry(NonTerminal.bool, TokenType.ID, "bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.LPAREN,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.INT_LITERAL,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.OP_MINUS,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.OP_NOT,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.REAL_LITERAL,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.STRING_LITERAL,
"bool ::= join bool_");
table.setEntry(NonTerminal.bool, TokenType.BOOL_LITERAL,
"bool ::= join bool_");
// bool_
table.setEntry(NonTerminal.bool_, TokenType.RPAREN,
"bool_ ::= EPSILON ");
table.setEntry(NonTerminal.bool_, TokenType.RBRACKET,
"bool_ ::= EPSILON ");
table.setEntry(NonTerminal.bool_, TokenType.OP_ASSIGN,
"bool_ ::= EPSILON ");
table.setEntry(NonTerminal.bool_, TokenType.OP_COMMA,
"bool_ ::= EPSILON ");
table.setEntry(NonTerminal.bool_, TokenType.OP_SEMIC,
"bool_ ::= EPSILON ");
table.setEntry(NonTerminal.bool_, TokenType.OP_OR,
"bool_ ::= OP_OR join bool_");
// join
table.setEntry(NonTerminal.join, TokenType.ID,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.LPAREN,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.INT_LITERAL,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.OP_MINUS,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.OP_NOT,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.REAL_LITERAL,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.STRING_LITERAL,
"join ::= equality join_");
table.setEntry(NonTerminal.join, TokenType.BOOL_LITERAL,
"join ::= equality join_");
// join_
table.setEntry(NonTerminal.join_, TokenType.RPAREN,
"join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.RBRACKET,
"join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.OP_ASSIGN,
"join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.OP_COMMA,
"join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.OP_OR, "join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.OP_SEMIC,
"join_ ::= EPSILON ");
table.setEntry(NonTerminal.join_, TokenType.OP_AND,
"join_ ::= OP_AND equality join_");
// equality
table.setEntry(NonTerminal.equality, TokenType.ID,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.LPAREN,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.INT_LITERAL,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.OP_MINUS,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.OP_NOT,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.REAL_LITERAL,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.STRING_LITERAL,
"equality ::= rel equality_");
table.setEntry(NonTerminal.equality, TokenType.BOOL_LITERAL,
"equality ::= rel equality_");
// equality_
table.setEntry(NonTerminal.equality_, TokenType.RPAREN,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.RBRACKET,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_ASSIGN,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_COMMA,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_OR,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_AND,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_SEMIC,
"equality_ ::= EPSILON ");
table.setEntry(NonTerminal.equality_, TokenType.OP_EQ,
"equality_ ::= OP_EQ rel equality_");
table.setEntry(NonTerminal.equality_, TokenType.OP_NE,
"equality_ ::= OP_NE rel equality_");
// rel
table.setEntry(NonTerminal.rel, TokenType.ID, "rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.LPAREN, "rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.INT_LITERAL,
"rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.OP_MINUS,
"rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.OP_NOT, "rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.REAL_LITERAL,
"rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.STRING_LITERAL,
"rel ::= expr rel_");
table.setEntry(NonTerminal.rel, TokenType.BOOL_LITERAL,
"rel ::= expr rel_");
// rel_
table.setEntry(NonTerminal.rel_, TokenType.RPAREN, "rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.RBRACKET,
"rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_ASSIGN,
"rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_COMMA,
"rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_SEMIC,
"rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_OR, "rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_AND, "rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_EQ, "rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_NE, "rel_ ::= EPSILON ");
table.setEntry(NonTerminal.rel_, TokenType.OP_LT, "rel_ ::= OP_LT expr");
table.setEntry(NonTerminal.rel_, TokenType.OP_LE, "rel_ ::= OP_LE expr");
table.setEntry(NonTerminal.rel_, TokenType.OP_GE, "rel_ ::= OP_GE expr");
table.setEntry(NonTerminal.rel_, TokenType.OP_GT, "rel_ ::= OP_GT expr");
// expr
table.setEntry(NonTerminal.expr, TokenType.ID, "expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.LPAREN,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.INT_LITERAL,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.OP_MINUS,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.OP_NOT,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.REAL_LITERAL,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.STRING_LITERAL,
"expr ::= term expr_");
table.setEntry(NonTerminal.expr, TokenType.BOOL_LITERAL,
"expr ::= term expr_");
// expr_
table.setEntry(NonTerminal.expr_, TokenType.OP_ADD,
"expr_ ::= OP_ADD term expr_");
table.setEntry(NonTerminal.expr_, TokenType.OP_MINUS,
"expr_ ::= OP_MINUS term expr_");
table.setEntry(NonTerminal.expr_, TokenType.OP_LT, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_LE, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_GE, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_GT, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_EQ, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_NE, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_AND,
"expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_OR, "expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.RBRACKET,
"expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.RPAREN,
"expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_SEMIC,
"expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_ASSIGN,
"expr_ ::= EPSILON ");
table.setEntry(NonTerminal.expr_, TokenType.OP_COMMA,
"expr_ ::= EPSILON ");
// term
table.setEntry(NonTerminal.term, TokenType.ID, "term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.LPAREN,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.INT_LITERAL,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.OP_MINUS,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.OP_NOT,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.REAL_LITERAL,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.STRING_LITERAL,
"term ::= unary term_");
table.setEntry(NonTerminal.term, TokenType.BOOL_LITERAL,
"term ::= unary term_");
// term_
table.setEntry(NonTerminal.term_, TokenType.OP_MUL,
"term_ ::= OP_MUL unary term_");
table.setEntry(NonTerminal.term_, TokenType.OP_DIV,
"term_ ::= OP_DIV unary term_");
table.setEntry(NonTerminal.term_, TokenType.OP_LT, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_LE, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_GE, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_GT, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_ADD,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_MINUS,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_EQ, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_NE, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_AND,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_OR, "term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.RBRACKET,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.RPAREN,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_SEMIC,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_ASSIGN,
"term_ ::= EPSILON ");
table.setEntry(NonTerminal.term_, TokenType.OP_COMMA,
"term_ ::= EPSILON ");
// unary
table.setEntry(NonTerminal.unary, TokenType.ID, "unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.LPAREN, "unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.INT_LITERAL,
"unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.REAL_LITERAL,
"unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.STRING_LITERAL,
"unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.BOOL_LITERAL,
"unary ::= factor");
table.setEntry(NonTerminal.unary, TokenType.OP_MINUS,
"unary ::= OP_MINUS unary");
table.setEntry(NonTerminal.unary, TokenType.OP_NOT,
"unary ::= OP_NOT unary");
// factor
table.setEntry(NonTerminal.factor, TokenType.ID,
"factor ::= loc factor_");
table.setEntry(NonTerminal.factor, TokenType.LPAREN,
"factor ::= LPAREN assign RPAREN");
table.setEntry(NonTerminal.factor, TokenType.INT_LITERAL,
"factor ::= INT_LITERAL");
table.setEntry(NonTerminal.factor, TokenType.REAL_LITERAL,
"factor ::= REAL_LITERAL");
table.setEntry(NonTerminal.factor, TokenType.STRING_LITERAL,
"factor ::= STRING_LITERAL");
table.setEntry(NonTerminal.factor, TokenType.BOOL_LITERAL,
"factor ::= BOOL_LITERAL");
// factor_
table.setEntry(NonTerminal.factor_, TokenType.LPAREN,
"factor_ ::= LPAREN optargs RPAREN ");
table.setEntry(NonTerminal.factor_, TokenType.OP_LT,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_LE,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_GE,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_GT,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_ADD,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_MINUS,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_MUL,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_DIV,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_EQ,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_NE,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_AND,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_OR,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.RBRACKET,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.RPAREN,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_SEMIC,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_ASSIGN,
"factor_ ::= EPSILON ");
table.setEntry(NonTerminal.factor_, TokenType.OP_COMMA,
"factor_ ::= EPSILON ");
// optargs
table.setEntry(NonTerminal.optargs, TokenType.ID, "optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.OP_NOT,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.OP_MINUS,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.LPAREN,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.INT_LITERAL,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.REAL_LITERAL,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.BOOL_LITERAL,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.STRING_LITERAL,
"optargs ::= args");
table.setEntry(NonTerminal.optargs, TokenType.RPAREN,
"optargs ::= EPSILON");
// args
table.setEntry(NonTerminal.args, TokenType.ID, "args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.LPAREN,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.INT_LITERAL,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.OP_MINUS,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.OP_NOT,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.REAL_LITERAL,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.STRING_LITERAL,
"args ::= assign args_");
table.setEntry(NonTerminal.args, TokenType.BOOL_LITERAL,
"args ::= assign args_");
// args_
table.setEntry(NonTerminal.args_, TokenType.RPAREN, "args_ ::= EPSILON");
table.setEntry(NonTerminal.args_, TokenType.OP_COMMA,
"args_ ::= OP_COMMA args");
}
public boolean isDebugEnabled() {
return debugEnabled;
}
public void setDebugEnabled(boolean debugEnabled) {
this.debugEnabled = debugEnabled;
}
public ISyntaxTree getParseTree() {
return parseTree;
}
}