1*0c56280aSSorin Basca/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. Mini.jj */ 2*0c56280aSSorin Basca/*@egen*/ 3*0c56280aSSorin Basca 4*0c56280aSSorin BascaPARSER_BEGIN(MiniParser) 5*0c56280aSSorin Bascapackage Mini; 6*0c56280aSSorin Basca 7*0c56280aSSorin Bascapublic class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants/*@egen*/ {/*@bgen(jjtree)*/ 8*0c56280aSSorin Basca protected static JJTMiniParserState jjtree = new JJTMiniParserState(); 9*0c56280aSSorin Basca 10*0c56280aSSorin Basca/*@egen*/ 11*0c56280aSSorin Basca private static Token expr_token; 12*0c56280aSSorin Basca 13*0c56280aSSorin Basca final static void jjtreeOpenNodeScope(Node n) {} 14*0c56280aSSorin Basca final static void jjtreeCloseNodeScope(Node n) {((SimpleNode)n).closeNode();} 15*0c56280aSSorin Basca} 16*0c56280aSSorin Basca 17*0c56280aSSorin BascaPARSER_END(MiniParser) 18*0c56280aSSorin Basca 19*0c56280aSSorin BascaSKIP : /* WHITE SPACE */ 20*0c56280aSSorin Basca{ 21*0c56280aSSorin Basca " " 22*0c56280aSSorin Basca| "\t" 23*0c56280aSSorin Basca| "\n" 24*0c56280aSSorin Basca| "\r" 25*0c56280aSSorin Basca| "\f" 26*0c56280aSSorin Basca} 27*0c56280aSSorin Basca 28*0c56280aSSorin Basca/* Single-line Comments 29*0c56280aSSorin Basca */ 30*0c56280aSSorin BascaMORE : 31*0c56280aSSorin Basca{ 32*0c56280aSSorin Basca "--" : SINGLE_LINE_COMMENT_STATE 33*0c56280aSSorin Basca} 34*0c56280aSSorin Basca 35*0c56280aSSorin Basca<SINGLE_LINE_COMMENT_STATE> SPECIAL_TOKEN : 36*0c56280aSSorin Basca{ 37*0c56280aSSorin Basca <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT 38*0c56280aSSorin Basca} 39*0c56280aSSorin Basca 40*0c56280aSSorin Basca<SINGLE_LINE_COMMENT_STATE> MORE : 41*0c56280aSSorin Basca{ 42*0c56280aSSorin Basca < ~[] > 43*0c56280aSSorin Basca} 44*0c56280aSSorin Basca 45*0c56280aSSorin Basca/* A program consists of a number of function declarations with a 46*0c56280aSSorin Basca * distinguished function `main' that starts the program. 47*0c56280aSSorin Basca */ 48*0c56280aSSorin Bascavoid Program() : {/*@bgen(jjtree) Program */ 49*0c56280aSSorin Basca ASTProgram jjtn000 = new ASTProgram(JJTPROGRAM); 50*0c56280aSSorin Basca boolean jjtc000 = true; 51*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 52*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 53*0c56280aSSorin Basca/*@egen*/} 54*0c56280aSSorin Basca{/*@bgen(jjtree) Program */ 55*0c56280aSSorin Basca try { 56*0c56280aSSorin Basca/*@egen*/ 57*0c56280aSSorin Basca (FunDecl())* 58*0c56280aSSorin Basca <EOF>/*@bgen(jjtree)*/ 59*0c56280aSSorin Basca } catch (Throwable jjte000) { 60*0c56280aSSorin Basca if (jjtc000) { 61*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 62*0c56280aSSorin Basca jjtc000 = false; 63*0c56280aSSorin Basca } else { 64*0c56280aSSorin Basca jjtree.popNode(); 65*0c56280aSSorin Basca } 66*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 67*0c56280aSSorin Basca throw (ParseException)jjte000; 68*0c56280aSSorin Basca } 69*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 70*0c56280aSSorin Basca throw (RuntimeException)jjte000; 71*0c56280aSSorin Basca } 72*0c56280aSSorin Basca throw (Error)jjte000; 73*0c56280aSSorin Basca } finally { 74*0c56280aSSorin Basca if (jjtc000) { 75*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 76*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 77*0c56280aSSorin Basca } 78*0c56280aSSorin Basca } 79*0c56280aSSorin Basca/*@egen*/ 80*0c56280aSSorin Basca} 81*0c56280aSSorin Basca 82*0c56280aSSorin Basca/* "FUN" Ident() "(" NameList() ")" = Expr() 83*0c56280aSSorin Basca */ 84*0c56280aSSorin Bascavoid FunDecl() : 85*0c56280aSSorin Basca{/*@bgen(jjtree) FunDecl */ 86*0c56280aSSorin Basca ASTFunDecl jjtn000 = new ASTFunDecl(JJTFUNDECL); 87*0c56280aSSorin Basca boolean jjtc000 = true; 88*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 89*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 90*0c56280aSSorin Basca/*@egen*/ 91*0c56280aSSorin Basca String s; 92*0c56280aSSorin Basca Token t; 93*0c56280aSSorin Basca} 94*0c56280aSSorin Basca{/*@bgen(jjtree) FunDecl */ 95*0c56280aSSorin Basca try { 96*0c56280aSSorin Basca/*@egen*/ 97*0c56280aSSorin Basca t = "FUN" { jjtn000.setPosition(t.beginLine, t.beginColumn); } 98*0c56280aSSorin Basca 99*0c56280aSSorin Basca Ident() 100*0c56280aSSorin Basca 101*0c56280aSSorin Basca <LPAREN> 102*0c56280aSSorin Basca [ 103*0c56280aSSorin Basca Ident() (<COMMA> Ident())* 104*0c56280aSSorin Basca ] 105*0c56280aSSorin Basca <RPAREN> 106*0c56280aSSorin Basca 107*0c56280aSSorin Basca <ASSIGN> 108*0c56280aSSorin Basca 109*0c56280aSSorin Basca Expr()/*@bgen(jjtree)*/ 110*0c56280aSSorin Basca } catch (Throwable jjte000) { 111*0c56280aSSorin Basca if (jjtc000) { 112*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 113*0c56280aSSorin Basca jjtc000 = false; 114*0c56280aSSorin Basca } else { 115*0c56280aSSorin Basca jjtree.popNode(); 116*0c56280aSSorin Basca } 117*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 118*0c56280aSSorin Basca throw (ParseException)jjte000; 119*0c56280aSSorin Basca } 120*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 121*0c56280aSSorin Basca throw (RuntimeException)jjte000; 122*0c56280aSSorin Basca } 123*0c56280aSSorin Basca throw (Error)jjte000; 124*0c56280aSSorin Basca } finally { 125*0c56280aSSorin Basca if (jjtc000) { 126*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 127*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 128*0c56280aSSorin Basca } 129*0c56280aSSorin Basca } 130*0c56280aSSorin Basca/*@egen*/ /* Body expression */ 131*0c56280aSSorin Basca} 132*0c56280aSSorin Basca 133*0c56280aSSorin Bascavoid Expr() : 134*0c56280aSSorin Basca{/*@bgen(jjtree) Expr */ 135*0c56280aSSorin Basca ASTExpr jjtn000 = new ASTExpr(JJTEXPR); 136*0c56280aSSorin Basca boolean jjtc000 = true; 137*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 138*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 139*0c56280aSSorin Basca/*@egen*/ 140*0c56280aSSorin Basca int kind=-1; 141*0c56280aSSorin Basca int un_op=-1; 142*0c56280aSSorin Basca} 143*0c56280aSSorin Basca{/*@bgen(jjtree) Expr */ 144*0c56280aSSorin Basca try { 145*0c56280aSSorin Basca/*@egen*/ 146*0c56280aSSorin Basca IfExpr() 147*0c56280aSSorin Basca| 148*0c56280aSSorin Basca LetExpr() 149*0c56280aSSorin Basca| 150*0c56280aSSorin Basca Term() [kind = AddOp() Expr() { jjtn000.setKind(kind); }] 151*0c56280aSSorin Basca| 152*0c56280aSSorin Basca un_op = UnOp() { jjtn000.setUnOp(un_op); } Expr()/*@bgen(jjtree)*/ 153*0c56280aSSorin Basca } catch (Throwable jjte000) { 154*0c56280aSSorin Basca if (jjtc000) { 155*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 156*0c56280aSSorin Basca jjtc000 = false; 157*0c56280aSSorin Basca } else { 158*0c56280aSSorin Basca jjtree.popNode(); 159*0c56280aSSorin Basca } 160*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 161*0c56280aSSorin Basca throw (ParseException)jjte000; 162*0c56280aSSorin Basca } 163*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 164*0c56280aSSorin Basca throw (RuntimeException)jjte000; 165*0c56280aSSorin Basca } 166*0c56280aSSorin Basca throw (Error)jjte000; 167*0c56280aSSorin Basca } finally { 168*0c56280aSSorin Basca if (jjtc000) { 169*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 170*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 171*0c56280aSSorin Basca } 172*0c56280aSSorin Basca } 173*0c56280aSSorin Basca/*@egen*/ 174*0c56280aSSorin Basca} 175*0c56280aSSorin Basca 176*0c56280aSSorin Basca/* 177*0c56280aSSorin Basca * The disambiguating algorithm of JavaCC automatically binds dangling 178*0c56280aSSorin Basca * else's to the innermost if statement. The LOOKAHEAD specification 179*0c56280aSSorin Basca * is to tell JavaCC that we know what we are doing. 180*0c56280aSSorin Basca */ 181*0c56280aSSorin Bascavoid IfExpr() : 182*0c56280aSSorin Basca{/*@bgen(jjtree) IfExpr */ 183*0c56280aSSorin Basca ASTIfExpr jjtn000 = new ASTIfExpr(JJTIFEXPR); 184*0c56280aSSorin Basca boolean jjtc000 = true; 185*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 186*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 187*0c56280aSSorin Basca/*@egen*/ 188*0c56280aSSorin Basca Token t=null; 189*0c56280aSSorin Basca} 190*0c56280aSSorin Basca{/*@bgen(jjtree) IfExpr */ 191*0c56280aSSorin Basca try { 192*0c56280aSSorin Basca/*@egen*/ 193*0c56280aSSorin Basca t = "IF" { jjtn000.setPosition(t.beginLine, t.beginColumn); } 194*0c56280aSSorin Basca Expr() "THEN" Expr() [ LOOKAHEAD(1) "ELSE" Expr() ] "FI"/*@bgen(jjtree)*/ 195*0c56280aSSorin Basca } catch (Throwable jjte000) { 196*0c56280aSSorin Basca if (jjtc000) { 197*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 198*0c56280aSSorin Basca jjtc000 = false; 199*0c56280aSSorin Basca } else { 200*0c56280aSSorin Basca jjtree.popNode(); 201*0c56280aSSorin Basca } 202*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 203*0c56280aSSorin Basca throw (ParseException)jjte000; 204*0c56280aSSorin Basca } 205*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 206*0c56280aSSorin Basca throw (RuntimeException)jjte000; 207*0c56280aSSorin Basca } 208*0c56280aSSorin Basca throw (Error)jjte000; 209*0c56280aSSorin Basca } finally { 210*0c56280aSSorin Basca if (jjtc000) { 211*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 212*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 213*0c56280aSSorin Basca } 214*0c56280aSSorin Basca } 215*0c56280aSSorin Basca/*@egen*/ 216*0c56280aSSorin Basca} 217*0c56280aSSorin Basca 218*0c56280aSSorin Bascavoid LetExpr() : 219*0c56280aSSorin Basca{/*@bgen(jjtree) LetExpr */ 220*0c56280aSSorin Basca ASTLetExpr jjtn000 = new ASTLetExpr(JJTLETEXPR); 221*0c56280aSSorin Basca boolean jjtc000 = true; 222*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 223*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 224*0c56280aSSorin Basca/*@egen*/ 225*0c56280aSSorin Basca Token t=null; 226*0c56280aSSorin Basca} 227*0c56280aSSorin Basca{/*@bgen(jjtree) LetExpr */ 228*0c56280aSSorin Basca try { 229*0c56280aSSorin Basca/*@egen*/ 230*0c56280aSSorin Basca t = "LET" { jjtn000.setPosition(t.beginLine, t.beginColumn); } 231*0c56280aSSorin Basca (Ident() <ASSIGN> Expr())+ "IN" Expr()/*@bgen(jjtree)*/ 232*0c56280aSSorin Basca } catch (Throwable jjte000) { 233*0c56280aSSorin Basca if (jjtc000) { 234*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 235*0c56280aSSorin Basca jjtc000 = false; 236*0c56280aSSorin Basca } else { 237*0c56280aSSorin Basca jjtree.popNode(); 238*0c56280aSSorin Basca } 239*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 240*0c56280aSSorin Basca throw (ParseException)jjte000; 241*0c56280aSSorin Basca } 242*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 243*0c56280aSSorin Basca throw (RuntimeException)jjte000; 244*0c56280aSSorin Basca } 245*0c56280aSSorin Basca throw (Error)jjte000; 246*0c56280aSSorin Basca } finally { 247*0c56280aSSorin Basca if (jjtc000) { 248*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 249*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 250*0c56280aSSorin Basca } 251*0c56280aSSorin Basca } 252*0c56280aSSorin Basca/*@egen*/ 253*0c56280aSSorin Basca} 254*0c56280aSSorin Basca 255*0c56280aSSorin BascaToken FunAppl() : 256*0c56280aSSorin Basca{/*@bgen(jjtree) FunAppl */ 257*0c56280aSSorin Basca ASTFunAppl jjtn000 = new ASTFunAppl(JJTFUNAPPL); 258*0c56280aSSorin Basca boolean jjtc000 = true; 259*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 260*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 261*0c56280aSSorin Basca/*@egen*/ 262*0c56280aSSorin Basca Token t=null; 263*0c56280aSSorin Basca} 264*0c56280aSSorin Basca{/*@bgen(jjtree) FunAppl */ 265*0c56280aSSorin Basca try { 266*0c56280aSSorin Basca/*@egen*/ 267*0c56280aSSorin Basca t = Ident() { jjtn000.setPosition(t.beginLine, t.beginColumn); } 268*0c56280aSSorin Basca <LPAREN> 269*0c56280aSSorin Basca [Expr() (<COMMA> Expr())*] <RPAREN>/*@bgen(jjtree)*/ 270*0c56280aSSorin Basca { 271*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 272*0c56280aSSorin Basca jjtc000 = false; 273*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 274*0c56280aSSorin Basca } 275*0c56280aSSorin Basca/*@egen*/ 276*0c56280aSSorin Basca { return t; }/*@bgen(jjtree)*/ 277*0c56280aSSorin Basca } catch (Throwable jjte000) { 278*0c56280aSSorin Basca if (jjtc000) { 279*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 280*0c56280aSSorin Basca jjtc000 = false; 281*0c56280aSSorin Basca } else { 282*0c56280aSSorin Basca jjtree.popNode(); 283*0c56280aSSorin Basca } 284*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 285*0c56280aSSorin Basca throw (ParseException)jjte000; 286*0c56280aSSorin Basca } 287*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 288*0c56280aSSorin Basca throw (RuntimeException)jjte000; 289*0c56280aSSorin Basca } 290*0c56280aSSorin Basca throw (Error)jjte000; 291*0c56280aSSorin Basca } finally { 292*0c56280aSSorin Basca if (jjtc000) { 293*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 294*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 295*0c56280aSSorin Basca } 296*0c56280aSSorin Basca } 297*0c56280aSSorin Basca/*@egen*/ 298*0c56280aSSorin Basca 299*0c56280aSSorin Basca} 300*0c56280aSSorin Basca 301*0c56280aSSorin Bascavoid Term(): 302*0c56280aSSorin Basca{/*@bgen(jjtree) Term */ 303*0c56280aSSorin Basca ASTTerm jjtn000 = new ASTTerm(JJTTERM); 304*0c56280aSSorin Basca boolean jjtc000 = true; 305*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 306*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 307*0c56280aSSorin Basca/*@egen*/ 308*0c56280aSSorin Basca int kind=-1; 309*0c56280aSSorin Basca} 310*0c56280aSSorin Basca{/*@bgen(jjtree) Term */ 311*0c56280aSSorin Basca try { 312*0c56280aSSorin Basca/*@egen*/ 313*0c56280aSSorin Basca Factor() [kind = MultOp() { jjtn000.setKind(kind); } Term()]/*@bgen(jjtree)*/ 314*0c56280aSSorin Basca { 315*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 316*0c56280aSSorin Basca jjtc000 = false; 317*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 318*0c56280aSSorin Basca } 319*0c56280aSSorin Basca/*@egen*/ 320*0c56280aSSorin Basca { jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); }/*@bgen(jjtree)*/ 321*0c56280aSSorin Basca } catch (Throwable jjte000) { 322*0c56280aSSorin Basca if (jjtc000) { 323*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 324*0c56280aSSorin Basca jjtc000 = false; 325*0c56280aSSorin Basca } else { 326*0c56280aSSorin Basca jjtree.popNode(); 327*0c56280aSSorin Basca } 328*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 329*0c56280aSSorin Basca throw (ParseException)jjte000; 330*0c56280aSSorin Basca } 331*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 332*0c56280aSSorin Basca throw (RuntimeException)jjte000; 333*0c56280aSSorin Basca } 334*0c56280aSSorin Basca throw (Error)jjte000; 335*0c56280aSSorin Basca } finally { 336*0c56280aSSorin Basca if (jjtc000) { 337*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 338*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 339*0c56280aSSorin Basca } 340*0c56280aSSorin Basca } 341*0c56280aSSorin Basca/*@egen*/ 342*0c56280aSSorin Basca} 343*0c56280aSSorin Basca 344*0c56280aSSorin Bascavoid Factor() : 345*0c56280aSSorin Basca{/*@bgen(jjtree) Factor */ 346*0c56280aSSorin Basca ASTFactor jjtn000 = new ASTFactor(JJTFACTOR); 347*0c56280aSSorin Basca boolean jjtc000 = true; 348*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 349*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 350*0c56280aSSorin Basca/*@egen*/ 351*0c56280aSSorin Basca int kind=-1; 352*0c56280aSSorin Basca} 353*0c56280aSSorin Basca{/*@bgen(jjtree) Factor */ 354*0c56280aSSorin Basca try { 355*0c56280aSSorin Basca/*@egen*/ 356*0c56280aSSorin Basca Element() [kind = CmpOp() { jjtn000.setKind(kind); } Factor()]/*@bgen(jjtree)*/ 357*0c56280aSSorin Basca { 358*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 359*0c56280aSSorin Basca jjtc000 = false; 360*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 361*0c56280aSSorin Basca } 362*0c56280aSSorin Basca/*@egen*/ 363*0c56280aSSorin Basca { jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); }/*@bgen(jjtree)*/ 364*0c56280aSSorin Basca } catch (Throwable jjte000) { 365*0c56280aSSorin Basca if (jjtc000) { 366*0c56280aSSorin Basca jjtree.clearNodeScope(jjtn000); 367*0c56280aSSorin Basca jjtc000 = false; 368*0c56280aSSorin Basca } else { 369*0c56280aSSorin Basca jjtree.popNode(); 370*0c56280aSSorin Basca } 371*0c56280aSSorin Basca if (jjte000 instanceof ParseException) { 372*0c56280aSSorin Basca throw (ParseException)jjte000; 373*0c56280aSSorin Basca } 374*0c56280aSSorin Basca if (jjte000 instanceof RuntimeException) { 375*0c56280aSSorin Basca throw (RuntimeException)jjte000; 376*0c56280aSSorin Basca } 377*0c56280aSSorin Basca throw (Error)jjte000; 378*0c56280aSSorin Basca } finally { 379*0c56280aSSorin Basca if (jjtc000) { 380*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 381*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 382*0c56280aSSorin Basca } 383*0c56280aSSorin Basca } 384*0c56280aSSorin Basca/*@egen*/ 385*0c56280aSSorin Basca} 386*0c56280aSSorin Basca 387*0c56280aSSorin Bascavoid Element() : {} 388*0c56280aSSorin Basca{ 389*0c56280aSSorin Basca/* expr_token is a global variable used to remember the position of an Expr() node 390*0c56280aSSorin Basca*/ 391*0c56280aSSorin Basca LOOKAHEAD(2) 392*0c56280aSSorin Basca expr_token = FunAppl() 393*0c56280aSSorin Basca| 394*0c56280aSSorin Basca expr_token = Ident() 395*0c56280aSSorin Basca| 396*0c56280aSSorin Basca expr_token = Integer() 397*0c56280aSSorin Basca| 398*0c56280aSSorin Basca expr_token = <LPAREN> Expr() <RPAREN> 399*0c56280aSSorin Basca} 400*0c56280aSSorin Basca 401*0c56280aSSorin BascaToken Integer() : 402*0c56280aSSorin Basca{/*@bgen(jjtree) Integer */ 403*0c56280aSSorin Basca ASTInteger jjtn000 = new ASTInteger(JJTINTEGER); 404*0c56280aSSorin Basca boolean jjtc000 = true; 405*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 406*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 407*0c56280aSSorin Basca/*@egen*/ 408*0c56280aSSorin Basca int num; 409*0c56280aSSorin Basca Token t; // Contains lexem and line/column number 410*0c56280aSSorin Basca} 411*0c56280aSSorin Basca{/*@bgen(jjtree) Integer */ 412*0c56280aSSorin Basca try { 413*0c56280aSSorin Basca/*@egen*/ 414*0c56280aSSorin Basca t = <INTEGER>/*@bgen(jjtree)*/ 415*0c56280aSSorin Basca { 416*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 417*0c56280aSSorin Basca jjtc000 = false; 418*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 419*0c56280aSSorin Basca } 420*0c56280aSSorin Basca/*@egen*/ 421*0c56280aSSorin Basca { 422*0c56280aSSorin Basca jjtn000.setValue(Integer.parseInt(t.image)); 423*0c56280aSSorin Basca jjtn000.setPosition(t.beginLine, t.beginColumn); 424*0c56280aSSorin Basca return t; 425*0c56280aSSorin Basca }/*@bgen(jjtree)*/ 426*0c56280aSSorin Basca } finally { 427*0c56280aSSorin Basca if (jjtc000) { 428*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 429*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 430*0c56280aSSorin Basca } 431*0c56280aSSorin Basca } 432*0c56280aSSorin Basca/*@egen*/ 433*0c56280aSSorin Basca} 434*0c56280aSSorin Basca 435*0c56280aSSorin BascaToken Ident() : 436*0c56280aSSorin Basca{/*@bgen(jjtree) Ident */ 437*0c56280aSSorin Basca ASTIdent jjtn000 = new ASTIdent(JJTIDENT); 438*0c56280aSSorin Basca boolean jjtc000 = true; 439*0c56280aSSorin Basca jjtree.openNodeScope(jjtn000); 440*0c56280aSSorin Basca jjtreeOpenNodeScope(jjtn000); 441*0c56280aSSorin Basca/*@egen*/ 442*0c56280aSSorin Basca String name; 443*0c56280aSSorin Basca Token t; // Contains lexem and line/column number 444*0c56280aSSorin Basca} 445*0c56280aSSorin Basca{/*@bgen(jjtree) Ident */ 446*0c56280aSSorin Basca try { 447*0c56280aSSorin Basca/*@egen*/ 448*0c56280aSSorin Basca (t = <TRUE> | t = <FALSE> | t = <READ> | t = <WRITE> | 449*0c56280aSSorin Basca t = <IDENT>)/*@bgen(jjtree)*/ 450*0c56280aSSorin Basca { 451*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 452*0c56280aSSorin Basca jjtc000 = false; 453*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 454*0c56280aSSorin Basca } 455*0c56280aSSorin Basca/*@egen*/ 456*0c56280aSSorin Basca { 457*0c56280aSSorin Basca jjtn000.setName(t.image); 458*0c56280aSSorin Basca jjtn000.setPosition(t.beginLine, t.beginColumn); 459*0c56280aSSorin Basca return t; 460*0c56280aSSorin Basca }/*@bgen(jjtree)*/ 461*0c56280aSSorin Basca } finally { 462*0c56280aSSorin Basca if (jjtc000) { 463*0c56280aSSorin Basca jjtree.closeNodeScope(jjtn000, true); 464*0c56280aSSorin Basca jjtreeCloseNodeScope(jjtn000); 465*0c56280aSSorin Basca } 466*0c56280aSSorin Basca } 467*0c56280aSSorin Basca/*@egen*/ 468*0c56280aSSorin Basca} 469*0c56280aSSorin Basca 470*0c56280aSSorin Bascaint AddOp() : 471*0c56280aSSorin Basca{ 472*0c56280aSSorin Basca Token t=null; 473*0c56280aSSorin Basca} 474*0c56280aSSorin Basca{ 475*0c56280aSSorin Basca (t = <PLUS> | t = <MINUS> | t = <OR>) 476*0c56280aSSorin Basca { 477*0c56280aSSorin Basca return t.kind; 478*0c56280aSSorin Basca } 479*0c56280aSSorin Basca} 480*0c56280aSSorin Basca 481*0c56280aSSorin Bascaint MultOp() : 482*0c56280aSSorin Basca{ 483*0c56280aSSorin Basca Token t=null; 484*0c56280aSSorin Basca} 485*0c56280aSSorin Basca{ 486*0c56280aSSorin Basca (t = <MULT> | t = <DIV> | t = <MOD> | t = <AND>) 487*0c56280aSSorin Basca { 488*0c56280aSSorin Basca return t.kind; 489*0c56280aSSorin Basca } 490*0c56280aSSorin Basca} 491*0c56280aSSorin Basca 492*0c56280aSSorin Bascaint CmpOp() : 493*0c56280aSSorin Basca{ 494*0c56280aSSorin Basca Token t=null; 495*0c56280aSSorin Basca} 496*0c56280aSSorin Basca{ 497*0c56280aSSorin Basca (t = <EQ> | t = <NEQ> | t = <LEQ> | t = <GEQ> | t = <GT> | t = <LT>) 498*0c56280aSSorin Basca { 499*0c56280aSSorin Basca return t.kind; 500*0c56280aSSorin Basca } 501*0c56280aSSorin Basca} 502*0c56280aSSorin Basca 503*0c56280aSSorin Bascaint UnOp() : 504*0c56280aSSorin Basca{ 505*0c56280aSSorin Basca Token t=null; 506*0c56280aSSorin Basca} 507*0c56280aSSorin Basca{ 508*0c56280aSSorin Basca (t = <MINUS> | t = <NOT>) 509*0c56280aSSorin Basca { 510*0c56280aSSorin Basca return t.kind; 511*0c56280aSSorin Basca } 512*0c56280aSSorin Basca} 513*0c56280aSSorin Basca 514*0c56280aSSorin Basca 515*0c56280aSSorin BascaTOKEN : /* Boolean and arithmetic operands */ 516*0c56280aSSorin Basca{ 517*0c56280aSSorin Basca < GT : ">" > 518*0c56280aSSorin Basca| 519*0c56280aSSorin Basca < LT : "<" > 520*0c56280aSSorin Basca| 521*0c56280aSSorin Basca < GEQ : ">=" > 522*0c56280aSSorin Basca| 523*0c56280aSSorin Basca < LEQ : "<=" > 524*0c56280aSSorin Basca| 525*0c56280aSSorin Basca < EQ : "==" > 526*0c56280aSSorin Basca| 527*0c56280aSSorin Basca < NEQ : "!=" > 528*0c56280aSSorin Basca| 529*0c56280aSSorin Basca < NOT : "!" > 530*0c56280aSSorin Basca| 531*0c56280aSSorin Basca < FALSE : "FALSE" > 532*0c56280aSSorin Basca| 533*0c56280aSSorin Basca < TRUE : "TRUE" > 534*0c56280aSSorin Basca| 535*0c56280aSSorin Basca < AND : "AND" > 536*0c56280aSSorin Basca| 537*0c56280aSSorin Basca < OR : "OR" > 538*0c56280aSSorin Basca| 539*0c56280aSSorin Basca < PLUS : "+"> 540*0c56280aSSorin Basca| 541*0c56280aSSorin Basca < MINUS : "-"> 542*0c56280aSSorin Basca| 543*0c56280aSSorin Basca < MULT : "*"> 544*0c56280aSSorin Basca| 545*0c56280aSSorin Basca < MOD : "%"> 546*0c56280aSSorin Basca| 547*0c56280aSSorin Basca < DIV : "/"> 548*0c56280aSSorin Basca| 549*0c56280aSSorin Basca < LPAREN : "("> 550*0c56280aSSorin Basca| 551*0c56280aSSorin Basca < RPAREN : ")"> 552*0c56280aSSorin Basca| 553*0c56280aSSorin Basca < ASSIGN : "="> 554*0c56280aSSorin Basca| 555*0c56280aSSorin Basca < COMMA : ","> 556*0c56280aSSorin Basca| 557*0c56280aSSorin Basca < READ : "READ"> 558*0c56280aSSorin Basca| 559*0c56280aSSorin Basca < WRITE : "WRITE"> 560*0c56280aSSorin Basca} 561*0c56280aSSorin Basca 562*0c56280aSSorin Basca/* Has to be and the, otherwise every string wil become an <IDENT> token 563*0c56280aSSorin Basca * Who knows why ... 564*0c56280aSSorin Basca */ 565*0c56280aSSorin BascaTOKEN : /* LITERALS */ 566*0c56280aSSorin Basca{ 567*0c56280aSSorin Basca < #DIGIT: ["0"-"9"] > 568*0c56280aSSorin Basca| 569*0c56280aSSorin Basca < #LETTER: ["a"-"z", "A"-"Z"] > 570*0c56280aSSorin Basca| 571*0c56280aSSorin Basca < IDENT: <LETTER> (<LETTER> | <DIGIT> | "_")* > 572*0c56280aSSorin Basca| 573*0c56280aSSorin Basca < INTEGER: (<DIGIT>)+ > 574*0c56280aSSorin Basca| 575*0c56280aSSorin Basca < STRING: "\"" (~["\"", "\n", "\r"])* "\"" > 576*0c56280aSSorin Basca} 577