xref: /aosp_15_r20/external/apache-commons-bcel/src/examples/Mini/Mini.jj (revision 0c56280ab0842982c46a149f7b9eaa497e31e292)
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