001    // Generated from /home/csz-naf/examples/PicoJavaMethods/AST/PicoJavaParser.all
002    package AST;
003    import AST.*; 
004    import java.util.ArrayList;
005    import beaver.*;
006    
007    /**
008     * This class is a LALR parser generated by
009     * <a href="http://beaver.sourceforge.net">Beaver</a> v0.9.4
010     * from the grammar specification "PicoJavaParser.beaver".
011     */
012    public class PicoJavaParser extends Parser {
013        static public class Terminals {
014                static public final short EOF = 0;
015                static public final short WHILE = 1;
016                static public final short LPAREN = 2;
017                static public final short RPAREN = 3;
018                static public final short IDENTIFIER = 4;
019                static public final short LBRACE = 5;
020                static public final short RBRACE = 6;
021                static public final short CLASS = 7;
022                static public final short SEMICOLON = 8;
023                static public final short ASSIGN = 9;
024                static public final short RETURN = 10;
025                static public final short EXTENDS = 11;
026                static public final short DOT = 12;
027                static public final short BOOLEAN_LITERAL = 13;
028                static public final short COMMA = 14;
029    
030                static public final String[] NAMES = {
031                        "EOF",
032                        "WHILE",
033                        "LPAREN",
034                        "RPAREN",
035                        "IDENTIFIER",
036                        "LBRACE",
037                        "RBRACE",
038                        "CLASS",
039                        "SEMICOLON",
040                        "ASSIGN",
041                        "RETURN",
042                        "EXTENDS",
043                        "DOT",
044                        "BOOLEAN_LITERAL",
045                        "COMMA"
046                };
047        }
048    
049        static final ParsingTables PARSING_TABLES = new ParsingTables(
050                "U9p5b3biKq4GXlzdFqCIV2GXTWxin748TxZlMxI04AAXGtG88I4QH8D20JHGKI4A2gWG3QA" +
051                "XGnGW6WeG3H3kAq32OSWDPFXsyuWIAGqL7it$$ZbsTZqxxmM1sjIXkPgcBVPU1LKfhfWMQ8" +
052                "b2LQXIAxIIZ1bgr2fDDxCVP3GeeGtsMDNZ6Ul9o9CnqtgTE9z$BjOgC0L$wKHDQlJiXGfOh" +
053                "MYpzLYFSaghv5bSUR0EFegul57DyVmJCgfsyXnxXNnIPenfjMh10lotabWrseZrt7ufQIFs" +
054                "NHl1f#Y83QlUeJr3Xsq8hyDtw90DuWMLXGtQ1otqM6iVa3vExd2MzO6jLWRZLbOELcQlRZ1" +
055                "ltMg1TTitJWdQ6$IR3QZ3eRr61wmVBwX5i7xhmklmBTfbNrNqEC##8a$mWfeFUs8$sSNXSl" +
056                "k9VB7Fu4UjSOopVQItiprV1b$AVQrstUP62rgBvhM9dWYsJYNY9JnDsWoMb46gLQkPT3$aB" +
057                "XBqhu6riuWMrAmMugre6naYcbEMUSbejh$riOmS6KKoOhv6mllST8Juac0wyYTPv$pEIb8d" +
058                "7QreKfrIFfAWJf9JfTahyB6Gd6cQxdaLEQa95Mh8SrRWBRUFomnKJsP8pfYLc6Ib$z4A8ol" +
059                "ZhNflPR6hgEjExkpGsqMUfIWxDQbIPegwZLFk6PyYioQoGczLHDs8Hszh1UAwElR$qxwhbN" +
060                "W2tsrt$YnQ1AlCVEqKyPJlSmMOqjPEmvlJVcvXXmxei8xgk4xg3D#6MctJEUtJ8UvxZKupE" +
061                "mTrKKVqI6UrMu#Pg#swhRqwfYwzqYvTu4HtTLwNrAa7kigtvBfkgLVtTKNNT4CtzKnVrAyU" +
062                "tL5PFpIWUthOQJQ4bZkDayGS$XM#H3l1FPxFYtoXnnEHTMfYFbM#uxlb8vV7gpoSLFCfclJ" +
063                "iHUJvtxyvT3VWdkEyTK83#kuqnZiNZ6ikqZotM4TU7V42QvgnMvX6DvLPF$s1l$yCiMAqjf" +
064                "MfgMPDDRp1Qvm9ZFa9gVTpApHWdft6$JvjFDl$0F3ffzG=");
065     // Generated from /home/csz-naf/examples/PicoJavaMethods/AST/PicoJavaParser.all
066    class Events extends Parser.Events {
067        public void syntaxError(Symbol token) {
068          StringBuffer s = new StringBuffer();
069          s.append(token.getLine(token.getStart()) + ", " + token.getColumn(token.getStart()) + "\n");
070          s.append("  *** Syntactic error: unexpected token " + Terminals.NAMES[token.getId()]);
071          throw new Error(s.toString());
072        }
073        public void scannerError(Scanner.Exception e) {
074          StringBuffer s = new StringBuffer();
075          s.append(e.line + ", " + e.column + "\n");
076          s.append("  *** Lexical error: " + e.getMessage());
077          throw new Error(s.toString());
078        }
079      }
080      { report = new Events(); } // Use error handler in parser
081    
082        public PicoJavaParser() {
083                super(PARSING_TABLES);
084        }
085    
086        protected Symbol invokeReduceAction(int rule_num, int offset) {
087                switch(rule_num) {
088                        case 0: // goal = block.block
089                        {
090                                        final Symbol _symbol_block = _symbols[offset + 1];
091                                        final Block block = (Block) _symbol_block.value;
092                                         ASTNode _node_ = new Program(block);
093            _node_.setStart(Symbol.getLine(_symbol_block.getStart()), (short) Symbol.getColumn(_symbol_block.getStart()));
094            _node_.setEnd(Symbol.getLine(_symbol_block.getEnd()), (short) Symbol.getColumn(_symbol_block.getEnd()));
095            return new Symbol(_node_);
096                        }
097                        case 1: // block = LBRACE.LBRACE block_stmt_list_opt.block_stmt_list_opt RBRACE.RBRACE
098                        {
099                                        final Symbol LBRACE = _symbols[offset + 1];
100                                       final Symbol _symbol_block_stmt_list_opt = _symbols[offset + 2];
101                                       final List block_stmt_list_opt = (List) _symbol_block_stmt_list_opt.value;
102                                       final Symbol RBRACE = _symbols[offset + 3];
103                                        ASTNode _node_ = new Block(block_stmt_list_opt);
104            _node_.setStart(Symbol.getLine(LBRACE.getStart()), (short) Symbol.getColumn(LBRACE.getStart()));
105            _node_.setEnd(Symbol.getLine(RBRACE.getEnd()), (short) Symbol.getColumn(RBRACE.getEnd()));
106            return new Symbol(_node_);
107                       }
108                       case 2: // block_stmt_list_opt = 
109                       {
110                                        return new Symbol(new List());
111                       }
112                       case 3: // block_stmt_list_opt = block_stmt_list.block_stmt_list
113                       {
114                                       final Symbol _symbol_block_stmt_list = _symbols[offset + 1];
115                                       final List block_stmt_list = (List) _symbol_block_stmt_list.value;
116                                        ASTNode _node_ = block_stmt_list;
117            _node_.setStart(Symbol.getLine(_symbol_block_stmt_list.getStart()), (short) Symbol.getColumn(_symbol_block_stmt_list.getStart()));
118            _node_.setEnd(Symbol.getLine(_symbol_block_stmt_list.getEnd()), (short) Symbol.getColumn(_symbol_block_stmt_list.getEnd()));
119            return new Symbol(_node_);
120                       }
121                       case 4: // block_stmt_list = block_stmt.block_stmt
122                       {
123                                       final Symbol _symbol_block_stmt = _symbols[offset + 1];
124                                       final BlockStmt block_stmt = (BlockStmt) _symbol_block_stmt.value;
125                                        ASTNode _node_ = new List().add(block_stmt);
126            _node_.setStart(Symbol.getLine(_symbol_block_stmt.getStart()), (short) Symbol.getColumn(_symbol_block_stmt.getStart()));
127            _node_.setEnd(Symbol.getLine(_symbol_block_stmt.getEnd()), (short) Symbol.getColumn(_symbol_block_stmt.getEnd()));
128            return new Symbol(_node_);
129                       }
130                       case 5: // block_stmt_list = block_stmt_list.block_stmt_list block_stmt.block_stmt
131                       {
132                                       final Symbol _symbol_block_stmt_list = _symbols[offset + 1];
133                                       final List block_stmt_list = (List) _symbol_block_stmt_list.value;
134                                       final Symbol _symbol_block_stmt = _symbols[offset + 2];
135                                       final BlockStmt block_stmt = (BlockStmt) _symbol_block_stmt.value;
136                                        ASTNode _node_ = block_stmt_list.add(block_stmt);
137            _node_.setStart(Symbol.getLine(_symbol_block_stmt_list.getStart()), (short) Symbol.getColumn(_symbol_block_stmt_list.getStart()));
138            _node_.setEnd(Symbol.getLine(_symbol_block_stmt.getEnd()), (short) Symbol.getColumn(_symbol_block_stmt.getEnd()));
139            return new Symbol(_node_);
140                       }
141                       case 11: // class_decl = CLASS.CLASS IDENTIFIER.IDENTIFIER extends_opt.extends_opt block.block
142                       {
143                                       final Symbol CLASS = _symbols[offset + 1];
144                                       final Symbol IDENTIFIER = _symbols[offset + 2];
145                                       final Symbol _symbol_extends_opt = _symbols[offset + 3];
146                                       final Opt extends_opt = (Opt) _symbol_extends_opt.value;
147                                       final Symbol _symbol_block = _symbols[offset + 4];
148                                       final Block block = (Block) _symbol_block.value;
149                                        ASTNode _node_ = new ClassDecl(((String)IDENTIFIER.value), extends_opt, block);
150            _node_.setStart(Symbol.getLine(CLASS.getStart()), (short) Symbol.getColumn(CLASS.getStart()));
151            _node_.setEnd(Symbol.getLine(_symbol_block.getEnd()), (short) Symbol.getColumn(_symbol_block.getEnd()));
152            return new Symbol(_node_);
153                       }
154                       case 12: // extends_opt = 
155                       {
156                                        return new Symbol(new Opt());
157                       }
158                       case 13: // extends_opt = EXTENDS.EXTENDS use.use
159                       {
160                                       final Symbol EXTENDS = _symbols[offset + 1];
161                                       final Symbol _symbol_use = _symbols[offset + 2];
162                                       final Use use = (Use) _symbol_use.value;
163                                        ASTNode _node_ = new Opt(use);
164            _node_.setStart(Symbol.getLine(EXTENDS.getStart()), (short) Symbol.getColumn(EXTENDS.getStart()));
165            _node_.setEnd(Symbol.getLine(_symbol_use.getEnd()), (short) Symbol.getColumn(_symbol_use.getEnd()));
166            return new Symbol(_node_);
167                       }
168                       case 14: // var_decl = name.name IDENTIFIER.IDENTIFIER SEMICOLON.SEMICOLON
169                       {
170                                       final Symbol _symbol_name = _symbols[offset + 1];
171                                       final Access name = (Access) _symbol_name.value;
172                                       final Symbol IDENTIFIER = _symbols[offset + 2];
173                                       final Symbol SEMICOLON = _symbols[offset + 3];
174                                        ASTNode _node_ = new VarDecl(((String)IDENTIFIER.value), name);
175            _node_.setStart(Symbol.getLine(_symbol_name.getStart()), (short) Symbol.getColumn(_symbol_name.getStart()));
176            _node_.setEnd(Symbol.getLine(SEMICOLON.getEnd()), (short) Symbol.getColumn(SEMICOLON.getEnd()));
177            return new Symbol(_node_);
178                       }
179                       case 15: // assign_stmt = name.name ASSIGN.ASSIGN exp.exp SEMICOLON.SEMICOLON
180                       {
181                                       final Symbol _symbol_name = _symbols[offset + 1];
182                                       final Access name = (Access) _symbol_name.value;
183                                       final Symbol ASSIGN = _symbols[offset + 2];
184                                       final Symbol _symbol_exp = _symbols[offset + 3];
185                                       final Exp exp = (Exp) _symbol_exp.value;
186                                       final Symbol SEMICOLON = _symbols[offset + 4];
187                                        ASTNode _node_ = new AssignStmt(name, exp);
188            _node_.setStart(Symbol.getLine(_symbol_name.getStart()), (short) Symbol.getColumn(_symbol_name.getStart()));
189            _node_.setEnd(Symbol.getLine(SEMICOLON.getEnd()), (short) Symbol.getColumn(SEMICOLON.getEnd()));
190            return new Symbol(_node_);
191                       }
192                       case 16: // while_stmt = WHILE.WHILE LPAREN.LPAREN exp.exp RPAREN.RPAREN stmt.stmt
193                       {
194                                       final Symbol WHILE = _symbols[offset + 1];
195                                       final Symbol LPAREN = _symbols[offset + 2];
196                                       final Symbol _symbol_exp = _symbols[offset + 3];
197                                       final Exp exp = (Exp) _symbol_exp.value;
198                                       final Symbol RPAREN = _symbols[offset + 4];
199                                       final Symbol _symbol_stmt = _symbols[offset + 5];
200                                       final Stmt stmt = (Stmt) _symbol_stmt.value;
201                                        ASTNode _node_ = new WhileStmt(exp, stmt);
202            _node_.setStart(Symbol.getLine(WHILE.getStart()), (short) Symbol.getColumn(WHILE.getStart()));
203            _node_.setEnd(Symbol.getLine(_symbol_stmt.getEnd()), (short) Symbol.getColumn(_symbol_stmt.getEnd()));
204            return new Symbol(_node_);
205                       }
206                       case 19: // use = IDENTIFIER.IDENTIFIER
207                       {
208                                       final Symbol IDENTIFIER = _symbols[offset + 1];
209                                        ASTNode _node_ = new Use(((String)IDENTIFIER.value));
210            _node_.setStart(Symbol.getLine(IDENTIFIER.getStart()), (short) Symbol.getColumn(IDENTIFIER.getStart()));
211            _node_.setEnd(Symbol.getLine(IDENTIFIER.getEnd()), (short) Symbol.getColumn(IDENTIFIER.getEnd()));
212            return new Symbol(_node_);
213                       }
214                       case 20: // name = IDENTIFIER.IDENTIFIER
215                       {
216                                       final Symbol IDENTIFIER = _symbols[offset + 1];
217                                        ASTNode _node_ = new Use(((String)IDENTIFIER.value));
218            _node_.setStart(Symbol.getLine(IDENTIFIER.getStart()), (short) Symbol.getColumn(IDENTIFIER.getStart()));
219            _node_.setEnd(Symbol.getLine(IDENTIFIER.getEnd()), (short) Symbol.getColumn(IDENTIFIER.getEnd()));
220            return new Symbol(_node_);
221                       }
222                       case 21: // name = name.name DOT.DOT use.use
223                       {
224                                       final Symbol _symbol_name = _symbols[offset + 1];
225                                       final Access name = (Access) _symbol_name.value;
226                                       final Symbol DOT = _symbols[offset + 2];
227                                       final Symbol _symbol_use = _symbols[offset + 3];
228                                       final Use use = (Use) _symbol_use.value;
229                                        ASTNode _node_ = new Dot(name, use);
230            _node_.setStart(Symbol.getLine(_symbol_name.getStart()), (short) Symbol.getColumn(_symbol_name.getStart()));
231            _node_.setEnd(Symbol.getLine(_symbol_use.getEnd()), (short) Symbol.getColumn(_symbol_use.getEnd()));
232            return new Symbol(_node_);
233                       }
234                       case 22: // boolean_literal = BOOLEAN_LITERAL.BOOLEAN_LITERAL
235                       {
236                                       final Symbol BOOLEAN_LITERAL = _symbols[offset + 1];
237                                        ASTNode _node_ = new BooleanLiteral(((String)BOOLEAN_LITERAL.value));
238            _node_.setStart(Symbol.getLine(BOOLEAN_LITERAL.getStart()), (short) Symbol.getColumn(BOOLEAN_LITERAL.getStart()));
239            _node_.setEnd(Symbol.getLine(BOOLEAN_LITERAL.getEnd()), (short) Symbol.getColumn(BOOLEAN_LITERAL.getEnd()));
240            return new Symbol(_node_);
241                       }
242                       case 24: // method_decl = name.name IDENTIFIER.IDENTIFIER LPAREN.LPAREN param_list_opt.param_list_opt RPAREN.RPAREN block.block
243                       {
244                                       final Symbol _symbol_name = _symbols[offset + 1];
245                                       final Access name = (Access) _symbol_name.value;
246                                       final Symbol IDENTIFIER = _symbols[offset + 2];
247                                       final Symbol LPAREN = _symbols[offset + 3];
248                                       final Symbol _symbol_param_list_opt = _symbols[offset + 4];
249                                       final List param_list_opt = (List) _symbol_param_list_opt.value;
250                                       final Symbol RPAREN = _symbols[offset + 5];
251                                       final Symbol _symbol_block = _symbols[offset + 6];
252                                       final Block block = (Block) _symbol_block.value;
253                                        ASTNode _node_ = new MethodDecl(((String)IDENTIFIER.value), name, param_list_opt, block);
254            _node_.setStart(Symbol.getLine(_symbol_name.getStart()), (short) Symbol.getColumn(_symbol_name.getStart()));
255            _node_.setEnd(Symbol.getLine(_symbol_block.getEnd()), (short) Symbol.getColumn(_symbol_block.getEnd()));
256            return new Symbol(_node_);
257                       }
258                       case 25: // param_list_opt = 
259                       {
260                                        return new Symbol(new List());
261                       }
262                       case 26: // param_list_opt = param_list.param_list
263                       {
264                                       final Symbol _symbol_param_list = _symbols[offset + 1];
265                                       final List param_list = (List) _symbol_param_list.value;
266                                        ASTNode _node_ = param_list;
267            _node_.setStart(Symbol.getLine(_symbol_param_list.getStart()), (short) Symbol.getColumn(_symbol_param_list.getStart()));
268            _node_.setEnd(Symbol.getLine(_symbol_param_list.getEnd()), (short) Symbol.getColumn(_symbol_param_list.getEnd()));
269            return new Symbol(_node_);
270                       }
271                       case 27: // param_list = param.param
272                       {
273                                       final Symbol _symbol_param = _symbols[offset + 1];
274                                       final ParamDecl param = (ParamDecl) _symbol_param.value;
275                                        ASTNode _node_ = new List().add(param);
276            _node_.setStart(Symbol.getLine(_symbol_param.getStart()), (short) Symbol.getColumn(_symbol_param.getStart()));
277            _node_.setEnd(Symbol.getLine(_symbol_param.getEnd()), (short) Symbol.getColumn(_symbol_param.getEnd()));
278            return new Symbol(_node_);
279                       }
280                       case 28: // param_list = param_list.param_list COMMA.COMMA param.param
281                       {
282                                       final Symbol _symbol_param_list = _symbols[offset + 1];
283                                       final List param_list = (List) _symbol_param_list.value;
284                                       final Symbol COMMA = _symbols[offset + 2];
285                                       final Symbol _symbol_param = _symbols[offset + 3];
286                                       final ParamDecl param = (ParamDecl) _symbol_param.value;
287                                        ASTNode _node_ = param_list.add(param);
288            _node_.setStart(Symbol.getLine(_symbol_param_list.getStart()), (short) Symbol.getColumn(_symbol_param_list.getStart()));
289            _node_.setEnd(Symbol.getLine(_symbol_param.getEnd()), (short) Symbol.getColumn(_symbol_param.getEnd()));
290            return new Symbol(_node_);
291                       }
292                       case 29: // param = name.name IDENTIFIER.IDENTIFIER
293                       {
294                                       final Symbol _symbol_name = _symbols[offset + 1];
295                                       final Access name = (Access) _symbol_name.value;
296                                       final Symbol IDENTIFIER = _symbols[offset + 2];
297                                        ASTNode _node_ = new ParamDecl(((String)IDENTIFIER.value), name);
298            _node_.setStart(Symbol.getLine(_symbol_name.getStart()), (short) Symbol.getColumn(_symbol_name.getStart()));
299            _node_.setEnd(Symbol.getLine(IDENTIFIER.getEnd()), (short) Symbol.getColumn(IDENTIFIER.getEnd()));
300            return new Symbol(_node_);
301                       }
302                       case 30: // name = IDENTIFIER.IDENTIFIER LPAREN.LPAREN arg_list_opt.arg_list_opt RPAREN.RPAREN
303                       {
304                                       final Symbol IDENTIFIER = _symbols[offset + 1];
305                                       final Symbol LPAREN = _symbols[offset + 2];
306                                       final Symbol _symbol_arg_list_opt = _symbols[offset + 3];
307                                       final List arg_list_opt = (List) _symbol_arg_list_opt.value;
308                                       final Symbol RPAREN = _symbols[offset + 4];
309                                        ASTNode _node_ = new MethodUse(((String)IDENTIFIER.value), arg_list_opt);
310            _node_.setStart(Symbol.getLine(IDENTIFIER.getStart()), (short) Symbol.getColumn(IDENTIFIER.getStart()));
311            _node_.setEnd(Symbol.getLine(RPAREN.getEnd()), (short) Symbol.getColumn(RPAREN.getEnd()));
312            return new Symbol(_node_);
313                       }
314                       case 31: // use = IDENTIFIER.IDENTIFIER LPAREN.LPAREN arg_list_opt.arg_list_opt RPAREN.RPAREN
315                       {
316                                       final Symbol IDENTIFIER = _symbols[offset + 1];
317                                       final Symbol LPAREN = _symbols[offset + 2];
318                                       final Symbol _symbol_arg_list_opt = _symbols[offset + 3];
319                                       final List arg_list_opt = (List) _symbol_arg_list_opt.value;
320                                       final Symbol RPAREN = _symbols[offset + 4];
321                                        ASTNode _node_ = new MethodUse(((String)IDENTIFIER.value), arg_list_opt);
322            _node_.setStart(Symbol.getLine(IDENTIFIER.getStart()), (short) Symbol.getColumn(IDENTIFIER.getStart()));
323            _node_.setEnd(Symbol.getLine(RPAREN.getEnd()), (short) Symbol.getColumn(RPAREN.getEnd()));
324            return new Symbol(_node_);
325                       }
326                       case 32: // arg_list_opt = 
327                       {
328                                        return new Symbol(new List());
329                       }
330                       case 33: // arg_list_opt = arg_list.arg_list
331                       {
332                                       final Symbol _symbol_arg_list = _symbols[offset + 1];
333                                       final List arg_list = (List) _symbol_arg_list.value;
334                                        ASTNode _node_ = arg_list;
335            _node_.setStart(Symbol.getLine(_symbol_arg_list.getStart()), (short) Symbol.getColumn(_symbol_arg_list.getStart()));
336            _node_.setEnd(Symbol.getLine(_symbol_arg_list.getEnd()), (short) Symbol.getColumn(_symbol_arg_list.getEnd()));
337            return new Symbol(_node_);
338                       }
339                       case 34: // arg_list = exp.exp
340                       {
341                                       final Symbol _symbol_exp = _symbols[offset + 1];
342                                       final Exp exp = (Exp) _symbol_exp.value;
343                                        ASTNode _node_ = new List().add(exp);
344            _node_.setStart(Symbol.getLine(_symbol_exp.getStart()), (short) Symbol.getColumn(_symbol_exp.getStart()));
345            _node_.setEnd(Symbol.getLine(_symbol_exp.getEnd()), (short) Symbol.getColumn(_symbol_exp.getEnd()));
346            return new Symbol(_node_);
347                       }
348                       case 35: // arg_list = arg_list.arg_list COMMA.COMMA exp.exp
349                       {
350                                       final Symbol _symbol_arg_list = _symbols[offset + 1];
351                                       final List arg_list = (List) _symbol_arg_list.value;
352                                       final Symbol COMMA = _symbols[offset + 2];
353                                       final Symbol _symbol_exp = _symbols[offset + 3];
354                                       final Exp exp = (Exp) _symbol_exp.value;
355                                        ASTNode _node_ = arg_list.add(exp);
356            _node_.setStart(Symbol.getLine(_symbol_arg_list.getStart()), (short) Symbol.getColumn(_symbol_arg_list.getStart()));
357            _node_.setEnd(Symbol.getLine(_symbol_exp.getEnd()), (short) Symbol.getColumn(_symbol_exp.getEnd()));
358            return new Symbol(_node_);
359                       }
360                       case 37: // return_stmt = RETURN.RETURN exp.exp SEMICOLON.SEMICOLON
361                       {
362                                       final Symbol RETURN = _symbols[offset + 1];
363                                       final Symbol _symbol_exp = _symbols[offset + 2];
364                                       final Exp exp = (Exp) _symbol_exp.value;
365                                       final Symbol SEMICOLON = _symbols[offset + 3];
366                                        ASTNode _node_ = new ReturnStmt(exp);
367            _node_.setStart(Symbol.getLine(RETURN.getStart()), (short) Symbol.getColumn(RETURN.getStart()));
368            _node_.setEnd(Symbol.getLine(SEMICOLON.getEnd()), (short) Symbol.getColumn(SEMICOLON.getEnd()));
369            return new Symbol(_node_);
370                       }
371                       case 6: // block_stmt = class_decl.class_decl
372                       case 7: // block_stmt = var_decl.var_decl
373                       case 8: // block_stmt = stmt.stmt
374                       case 9: // stmt = assign_stmt.assign_stmt
375                       case 10: // stmt = while_stmt.while_stmt
376                       case 17: // exp = name.name
377                       case 18: // exp = boolean_literal.boolean_literal
378                       case 23: // block_stmt = method_decl.method_decl
379                       case 36: // stmt = return_stmt.return_stmt
380                       {
381                               return _symbols[offset + 1];
382                       }
383                       default:
384                               throw new IllegalArgumentException("unknown production #" + rule_num);
385               }
386       }
387    }