1class CalcParser extends Parser;
2options {
3	buildAST = true;	// uses CommonAST by default
4}
5
6expr
7	:	mexpr (PLUS^ mexpr)* SEMI!
8	;
9
10mexpr
11	:	atom (STAR^ atom)*
12	;
13
14atom:	INT
15	;
16
17class CalcLexer extends Lexer;
18
19WS	:	(' '
20	|	'\t'
21	|	'\n'
22	|	'\r')
23		{ _ttype = Token.SKIP; }
24	;
25
26LPAREN:	'('
27	;
28
29RPAREN:	')'
30	;
31
32STAR:	'*'
33	;
34
35PLUS:	'+'
36	;
37
38SEMI:	';'
39	;
40
41protected
42DIGIT
43	:	'0'..'9'
44	;
45
46INT	:	(DIGIT)+
47	;
48
49class CalcTreeWalker extends TreeParser;
50
51expr returns [float r]
52{
53	float a,b;
54	r=0;
55}
56	:	#(PLUS a=expr b=expr)	{r = a+b;}
57	|	#(STAR a=expr b=expr)	{r = a*b;}
58	|	i:INT			{r = (float)Integer.parseInt(i.getText());}
59	;
60
61