package org.jalgo.module.c0h0.parser;

import org.jalgo.module.c0h0.models.ast.Number;
import beaver.*;
import beaver.Symbol;
import org.jalgo.module.c0h0.models.ast.*;

/**
 * This class is a LALR parser generated by
 * <a href="http://beaver.sourceforge.net">Beaver</a> v0.9.6.1
 * from the grammar specification "c00-parser.g".
 */
public class GeneratedC00Parser extends Parser {
	/**
	 * terminal symbols (constant declarations)
	 *
	 */
	static public class Terminals {
		static public final short EOF = 0;
		static public final short IDENT = 1;
		static public final short SEMICOLON = 2;
		static public final short IF = 3;
		static public final short WHILE = 4;
		static public final short LPAREN = 5;
		static public final short PLUS = 6;
		static public final short MINUS = 7;
		static public final short RBRACKET = 8;
		static public final short LBRACKET = 9;
		static public final short NUMBER = 10;
		static public final short RPAREN = 11;
		static public final short EQ = 12;
		static public final short NE = 13;
		static public final short LE = 14;
		static public final short GE = 15;
		static public final short LT = 16;
		static public final short GT = 17;
		static public final short MULT = 18;
		static public final short DIV = 19;
		static public final short MOD = 20;
		static public final short RETURN = 21;
		static public final short COMMA = 22;
		static public final short ELSE = 23;
		static public final short INT = 24;
		static public final short PRINTF = 25;
		static public final short INCLUDE = 26;
		static public final short STDIO = 27;
		static public final short MAIN = 28;
		static public final short SCANF = 29;
		static public final short IFORMAT = 30;
		static public final short AMP = 31;
		static public final short DFORMAT = 32;
		static public final short ASSIGN = 33;
	}

	static final ParsingTables PARSING_TABLES = new ParsingTables(
		"U9orbLbiLKKOn$$dtjvosrlQidIphQMtz9RQ1P15G055PH4L1554G4751TIwMuc9yOt49ry" +
		"C8IR6#AWFlXY83oQ#QL5H4Tnn5rHG4LHS67zdpjpJqtlFhS74a$pcMsVEp3TdvaZU6hLgeL" +
		"gqG5FKhRFKf0krN5brQB8wbLENpb6FUcrqeTh8cruosaxql9BHQKJdbupErW8pL39w0NsJ9" +
		"QABj8vePKmqlvgyl5e9FQHBaNbFcQxJE2t5KuKsNbirLkjrTnY$mewzEjBZR4rIIciAFEMw" +
		"iS0pHhT6F7tMbzPKdQivM8FgrmndpL85LfyociaCyXdL#6f2grRzneJMH68JGgiUgyvP$bl" +
		"wYzPzYVKtQ4d1V2vplHhDgPXUAtMHRjQgq6xMnRfU6uhoRg22YxMvoBz5SwdfxN2#bj5U1V" +
		"Dq3UqcNQuhTPjMqFDQhQNTg9jeRz4TjDjqf#uoftMl1dIVxj7zUa0Fwc4zmku5ErnETJsi9" +
		"FjNnOvLKwbQUewdAXDjDCZB$6$Htb6ZpQD64p7H$6hoie8grlEzL8IUHhxlhFNaa4ryzzre" +
		"hM4y63lQeulJqLBaIHLvCYCydlLLa1TKkP6JvJahnRdohHxQfZ2Z3YiHMcaiXTOah5HeULZ" +
		"rplBVKXcpxc16XVD9kru9#xRYNYbRcxpTpWXHUpWlooc8ytisFyiuVdLzAfsMOgoShNsGqM" +
		"2reAsZVvhL#cjguqHvv2RiEgNjZya#ws4kR857uMbu1fw7Ps6Jozi6By1BC0IlmtuNEm1xO" +
		"2ySWYDWuAYB$m8l6cDEEtitp8DNOPdlErDuNeEnJdyvujy7BO7kzKRy1w5dv1YUNvjFaVuN" +
		"SHW6q3F87s3GzJlfScVHd49EWwIBxK0V4td7aqwcyC#9#DUwCMgW1nemTZbVSsG#$T21yfo" +
		"pkoAn6R045i5oM0hJOJPCXHMm65Qw$5LEhexCeockbYxsb9CxOGDiB9NxRx3Fr5G3JZ#E6F" +
		"Gd0e$$b$5uQk6967yRl1BZfuuQYl7FTzBVtyrEFy7Kgfnk8hbR0ndi3x8QMeRZtZWdMmlUu" +
		"Sw4r#PaEqnmUdPahZSPwftUELeDpWIUxOfvp9yZh9C5qHDESbRD#$2sEMWEcFVCVlEkUSVi" +
		"Cs#PDyqRPg$vqdnXypw7pymXgxFVvXFpiTK$CX#Q3wmMjCTj#oCSpNlDDrRxsdn5#xi$5$E" +
		"R#HLv37woiU$XMtFO$6mjziiSCT$5hOh87$0N$8qnapzV3LJp9qX0ady1vvuRj9lREOSlnt" +
		"sQuslqzQozLykWtDwjMNAozXPEsnjsMERzFfb8RZb$DS#HX8IZh40FSZh8wR9$Z68wYKr15" +
		"jBt3ppeIBW=");

    public ErrorEvents getErrorEvents() {
        return (ErrorEvents) report;
    }
    private int convertToInt(String str) {
        return Integer.parseInt(str);
    }

	private final Action[] actions;

	public GeneratedC00Parser() {
		super(PARSING_TABLES);
		actions = new Action[] {
			new Action() {	// [0] Program = INCLUDE STDIO INT MAIN LPAREN RPAREN LBRACKET Declaration.d SEMICOLON ScanfSequence.c Block.b PrintfStatement.p RETURN SEMICOLON RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_d = _symbols[offset + 8];
					final Declaration d = (Declaration) _symbol_d.value;
					final Symbol _symbol_c = _symbols[offset + 10];
					final ScanfSequence c = (ScanfSequence) _symbol_c.value;
					final Symbol _symbol_b = _symbols[offset + 11];
					final Block b = (Block) _symbol_b.value;
					final Symbol _symbol_p = _symbols[offset + 12];
					final PrintfStatement p = (PrintfStatement) _symbol_p.value;
					 return new Symbol(new Program(d, c, b, p));
				}
			},
			new Action() {	// [1] Program = INCLUDE STDIO INT MAIN LPAREN RPAREN LBRACKET Declaration.d SEMICOLON ScanfSequence.c PrintfStatement.p RETURN SEMICOLON RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_d = _symbols[offset + 8];
					final Declaration d = (Declaration) _symbol_d.value;
					final Symbol _symbol_c = _symbols[offset + 10];
					final ScanfSequence c = (ScanfSequence) _symbol_c.value;
					final Symbol _symbol_p = _symbols[offset + 11];
					final PrintfStatement p = (PrintfStatement) _symbol_p.value;
					 return new Symbol(new Program(d, c, null, p));
				}
			},
			new Action() {	// [2] Declaration = INT IDENT.i
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 2];
					final String i = (String) _symbol_i.value;
					 return new Symbol(new Declaration(new Var(i)));
				}
			},
			new Action() {	// [3] Declaration = Declaration.d COMMA IDENT.i
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_d = _symbols[offset + 1];
					final Declaration d = (Declaration) _symbol_d.value;
					final Symbol _symbol_i = _symbols[offset + 3];
					final String i = (String) _symbol_i.value;
					 d.addVariable(new Var(i)); return new Symbol(d);
				}
			},
			new Action() {	// [4] ScanfSequence = 
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(new ScanfSequence());
				}
			},
			new Action() {	// [5] ScanfSequence = ScanfSequence.s SCANF LPAREN IFORMAT COMMA AMP IDENT.i RPAREN SEMICOLON
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_s = _symbols[offset + 1];
					final ScanfSequence s = (ScanfSequence) _symbol_s.value;
					final Symbol _symbol_i = _symbols[offset + 7];
					final String i = (String) _symbol_i.value;
					 s.addScanf(new Var(i)); return new Symbol(s);
				}
			},
			new Action() {	// [6] PrintfStatement = PRINTF LPAREN DFORMAT COMMA IDENT.i RPAREN SEMICOLON
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 5];
					final String i = (String) _symbol_i.value;
					 return new Symbol(new PrintfStatement(new Var(i)));
				}
			},
			new Action() {	// [7] Block = LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(new Block(true));
				}
			},
			new Action() {	// [8] Block = LBRACKET Block.b Statement.stat RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_b = _symbols[offset + 2];
					final Block b = (Block) _symbol_b.value;
					final Symbol _symbol_stat = _symbols[offset + 3];
					final Statement stat = (Statement) _symbol_stat.value;
					 b.addStatement(stat); return new Symbol(b);
				}
			},
			new Action() {	// [9] Block = Statement.stat
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_stat = _symbols[offset + 1];
					final Statement stat = (Statement) _symbol_stat.value;
					 return new Symbol(new Block(stat, true));
				}
			},
			new Action() {	// [10] Block = Block.b Statement.stat
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_b = _symbols[offset + 1];
					final Block b = (Block) _symbol_b.value;
					final Symbol _symbol_stat = _symbols[offset + 2];
					final Statement stat = (Statement) _symbol_stat.value;
					 b.addStatement(stat); return new Symbol(b);
				}
			},
			new Action() {	// [11] Statement = SEMICOLON
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(new Statement());
				}
			},
			new Action() {	// [12] Statement = IDENT.i ASSIGN Term.t SEMICOLON
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 1];
					final String i = (String) _symbol_i.value;
					final Symbol _symbol_t = _symbols[offset + 3];
					final Term t = (Term) _symbol_t.value;
					 return new Symbol(new Assignment(new Var(i), t));
				}
			},
			new Action() {	// [13] Statement = IF LPAREN Relation.r RPAREN LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					 return new Symbol(new If(r, new Block(true), new Block(false)));
				}
			},
			new Action() {	// [14] Statement = IF LPAREN Relation.r RPAREN Statement.s
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s = _symbols[offset + 5];
					final Statement s = (Statement) _symbol_s.value;
					 return new Symbol(new If(r, new Block(s, false), new Block(false)));
				}
			},
			new Action() {	// [15] Statement = IF LPAREN Relation.r RPAREN LBRACKET Block.b RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_b = _symbols[offset + 6];
					final Block b = (Block) _symbol_b.value;
					 return new Symbol(new If(r, b));
				}
			},
			new Action() {	// [16] Statement = IF LPAREN Relation.r RPAREN LBRACKET RBRACKET ELSE LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					 return new Symbol(new If(r, new Block(true), new Block(true)));
				}
			},
			new Action() {	// [17] Statement = IF LPAREN Relation.r RPAREN LBRACKET RBRACKET ELSE Statement.s2
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s2 = _symbols[offset + 8];
					final Statement s2 = (Statement) _symbol_s2.value;
					 return new Symbol(new If(r, new Block(true), new Block(s2, false)));
				}
			},
			new Action() {	// [18] Statement = IF LPAREN Relation.r RPAREN LBRACKET RBRACKET ELSE LBRACKET Block.s2 RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s2 = _symbols[offset + 9];
					final Block s2 = (Block) _symbol_s2.value;
					 return new Symbol(new If(r, new Block(true), s2));
				}
			},
			new Action() {	// [19] Statement = IF LPAREN Relation.r RPAREN Statement.s ELSE LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s = _symbols[offset + 5];
					final Statement s = (Statement) _symbol_s.value;
					 return new Symbol(new If(r, new Block(s, false), new Block(true)));
				}
			},
			new Action() {	// [20] Statement = IF LPAREN Relation.r RPAREN LBRACKET Block.b RBRACKET ELSE LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_b = _symbols[offset + 6];
					final Block b = (Block) _symbol_b.value;
					 return new Symbol(new If(r, b, new Block(true)));
				}
			},
			new Action() {	// [21] Statement = IF LPAREN Relation.r RPAREN Statement.s1 ELSE Statement.s2
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s1 = _symbols[offset + 5];
					final Statement s1 = (Statement) _symbol_s1.value;
					final Symbol _symbol_s2 = _symbols[offset + 7];
					final Statement s2 = (Statement) _symbol_s2.value;
					 return new Symbol(new If(r, new Block(s1, false), new Block(s2, false)));
				}
			},
			new Action() {	// [22] Statement = IF LPAREN Relation.r RPAREN Statement.s1 ELSE LBRACKET Block.s2 RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s1 = _symbols[offset + 5];
					final Statement s1 = (Statement) _symbol_s1.value;
					final Symbol _symbol_s2 = _symbols[offset + 8];
					final Block s2 = (Block) _symbol_s2.value;
					 return new Symbol(new If(r, new Block(s1, false), s2));
				}
			},
			new Action() {	// [23] Statement = IF LPAREN Relation.r RPAREN LBRACKET Block.s1 RBRACKET ELSE Statement.s2
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s1 = _symbols[offset + 6];
					final Block s1 = (Block) _symbol_s1.value;
					final Symbol _symbol_s2 = _symbols[offset + 9];
					final Statement s2 = (Statement) _symbol_s2.value;
					 return new Symbol(new If(r, s1, new Block(s2, false)));
				}
			},
			new Action() {	// [24] Statement = IF LPAREN Relation.r RPAREN LBRACKET Block.s1 RBRACKET ELSE LBRACKET Block.s2 RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s1 = _symbols[offset + 6];
					final Block s1 = (Block) _symbol_s1.value;
					final Symbol _symbol_s2 = _symbols[offset + 10];
					final Block s2 = (Block) _symbol_s2.value;
					 return new Symbol(new If(r, s1, s2));
				}
			},
			new Action() {	// [25] Statement = WHILE LPAREN Relation.r RPAREN Statement.s
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_s = _symbols[offset + 5];
					final Statement s = (Statement) _symbol_s.value;
					 return new Symbol(new While(r, new Block(s, false)));
				}
			},
			new Action() {	// [26] Statement = WHILE LPAREN Relation.r RPAREN LBRACKET Block.b RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					final Symbol _symbol_b = _symbols[offset + 6];
					final Block b = (Block) _symbol_b.value;
					 return new Symbol(new While(r, b));
				}
			},
			new Action() {	// [27] Statement = WHILE LPAREN Relation.r RPAREN LBRACKET RBRACKET
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 3];
					final Relation r = (Relation) _symbol_r.value;
					 return new Symbol(new While(r, new Block(true)));
				}
			},
			new Action() {	// [28] Term = IDENT.i
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 1];
					final String i = (String) _symbol_i.value;
					 return new Symbol(new Var(i));
				}
			},
			new Action() {	// [29] Term = NUMBER.n
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_n = _symbols[offset + 1];
					final String n = (String) _symbol_n.value;
					 return new Symbol(new Number(convertToInt(n)));
				}
			},
			new Action() {	// [30] Term = LPAREN Term.t RPAREN
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_t = _symbols[offset + 2];
					final Term t = (Term) _symbol_t.value;
					 return new Symbol(new Term(t));
				}
			},
			new Action() {	// [31] Term = PLUS IDENT.i
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 2];
					final String i = (String) _symbol_i.value;
					 return new Symbol(new Var(i, UnaryType.PLUS));
				}
			},
			new Action() {	// [32] Term = PLUS NUMBER.n
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_n = _symbols[offset + 2];
					final String n = (String) _symbol_n.value;
					 return new Symbol(new Number(convertToInt(n), UnaryType.PLUS));
				}
			},
			new Action() {	// [33] Term = PLUS LPAREN Term.t RPAREN
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_t = _symbols[offset + 3];
					final Term t = (Term) _symbol_t.value;
					 return new Symbol(new Term(t, UnaryType.PLUS));
				}
			},
			new Action() {	// [34] Term = MINUS IDENT.i
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_i = _symbols[offset + 2];
					final String i = (String) _symbol_i.value;
					 return new Symbol(new Var(i, UnaryType.MINUS));
				}
			},
			new Action() {	// [35] Term = MINUS NUMBER.n
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_n = _symbols[offset + 2];
					final String n = (String) _symbol_n.value;
					 return new Symbol(new Number(convertToInt(n), UnaryType.MINUS));
				}
			},
			new Action() {	// [36] Term = MINUS LPAREN Term.t RPAREN
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_t = _symbols[offset + 3];
					final Term t = (Term) _symbol_t.value;
					 return new Symbol(new Term(t, UnaryType.MINUS));
				}
			},
			new Action() {	// [37] Term = Operation.o
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_o = _symbols[offset + 1];
					final Operation o = (Operation) _symbol_o.value;
					 return new Symbol(o);
				}
			},
			new Action() {	// [38] Term = Relation.r
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_r = _symbols[offset + 1];
					final Relation r = (Relation) _symbol_r.value;
					 return new Symbol(r);
				}
			},
			new Action() {	// [39] Relation = Term.l RelationType.rel Term.r
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_l = _symbols[offset + 1];
					final Term l = (Term) _symbol_l.value;
					final Symbol _symbol_rel = _symbols[offset + 2];
					final RelationType rel = (RelationType) _symbol_rel.value;
					final Symbol _symbol_r = _symbols[offset + 3];
					final Term r = (Term) _symbol_r.value;
					 return new Symbol(new Relation(l, rel, r));
				}
			},
			new Action() {	// [40] RelationType = EQ
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.EQ);
				}
			},
			new Action() {	// [41] RelationType = NE
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.NE);
				}
			},
			new Action() {	// [42] RelationType = LE
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.LE);
				}
			},
			new Action() {	// [43] RelationType = GE
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.GE);
				}
			},
			new Action() {	// [44] RelationType = LT
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.LT);
				}
			},
			new Action() {	// [45] RelationType = GT
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(RelationType.GT);
				}
			},
			new Action() {	// [46] Operation = Term.l OperationType.op Term.r
				public Symbol reduce(Symbol[] _symbols, int offset) {
					final Symbol _symbol_l = _symbols[offset + 1];
					final Term l = (Term) _symbol_l.value;
					final Symbol _symbol_op = _symbols[offset + 2];
					final OperationType op = (OperationType) _symbol_op.value;
					final Symbol _symbol_r = _symbols[offset + 3];
					final Term r = (Term) _symbol_r.value;
					 return new Symbol(new Operation(l, op, r));
				}
			},
			new Action() {	// [47] OperationType = PLUS
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(OperationType.ADD);
				}
			},
			new Action() {	// [48] OperationType = MINUS
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(OperationType.SUB);
				}
			},
			new Action() {	// [49] OperationType = MULT
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(OperationType.MUL);
				}
			},
			new Action() {	// [50] OperationType = DIV
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(OperationType.DIV);
				}
			},
			new Action() {	// [51] OperationType = MOD
				public Symbol reduce(Symbol[] _symbols, int offset) {
					 return new Symbol(OperationType.MOD);
				}
			}
		};


        this.report = ErrorEvents.createReport();
	}

	protected Symbol invokeReduceAction(int rule_num, int offset) {
		return actions[rule_num].reduce(_symbols, offset);
	}
}
