1header {
2#include "MyAST.h"
3}
4
5options {
6	language="Cpp";
7}
8
9{
10#include <iostream>
11}
12
13class LangParser extends Parser;
14
15options {
16	codeGenMakeSwitchThreshold = 3;
17	codeGenBitsetTestThreshold = 4;
18	ASTLabelType = "RefMyAST";
19	buildAST = true;
20}
21
22block
23	:	LCURLY^ ( statement )* RCURLY!
24	;
25
26statement
27	:	expr SEMI!
28	|	"if"^ LPAREN! expr RPAREN! statement
29		( "else"! statement )?
30	|	"while"^ LPAREN! expr RPAREN! statement
31	|!	b:block { #statement = b_AST; }
32		// do some manual tree returning
33	;
34
35expr:	assignExpr
36	;
37
38assignExpr
39	:	aexpr (ASSIGN^ assignExpr)?
40	;
41
42aexpr
43	:	mexpr (PLUS^ mexpr)*
44	;
45
46mexpr
47	:	atom (STAR^ atom)*
48	;
49
50atom:	ID
51	|	INT
52	;
53
54{
55#include <iostream>
56
57void LangWalker::printAST( RefMyAST ast )
58{
59	ANTLR_USE_NAMESPACE(std)cout << "Found " << getTokenName(ast->getType())
60		<< " '" << ast->getText()
61		<< "' at line " << ast->getLine()
62		<< ANTLR_USE_NAMESPACE(std)endl;
63}
64
65}
66
67class LangWalker extends TreeParser;
68options {
69 	ASTLabelType = "RefMyAST";
70}
71{
72	void printAST( RefMyAST ast );
73}
74block
75	:	#( LCURLY ( stat )+ )
76	;
77
78stat:	#("if" expr stat (stat)?)
79	|	#("while" expr stat)
80	|	expr
81	|	block
82	;
83
84expr:	#(asgn:ASSIGN expr expr)			{ printAST(asgn); }
85	|	#(plus:PLUS expr expr)				{ printAST(plus); }
86	|	#(star:STAR expr expr)				{ printAST(star); }
87	|	a:ID										{ printAST(a); }
88	|	b:INT										{ printAST(b); }
89	;
90
91class LangLexer extends Lexer;
92
93WS_	:	(' '
94	|	'\t' { tab(); }
95	|	'\n' { newline(); }
96	|	'\r')
97		{ $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP); }
98	;
99
100LPAREN:	'('
101	;
102
103RPAREN:	')'
104	;
105
106LCURLY:	'{'
107	;
108
109RCURLY:	'}'
110	;
111
112STAR:	'*'
113	;
114
115PLUS:	'+'
116	;
117
118ASSIGN
119	:	'='
120	;
121
122SEMI:	';'
123	;
124
125COMMA
126	:	','
127	;
128
129protected
130ESC	:	'\\'
131		(	'n'
132		|	'r'
133		|	't'
134		|	'b'
135		|	'f'
136		|	'"'
137		|	'\''
138		|	'\\'
139		|	('0'..'3') ( DIGIT (DIGIT)? )?
140		|	('4'..'7') (DIGIT)?
141		)
142	;
143
144protected
145DIGIT
146	:	'0'..'9'
147	;
148
149INT	:	(DIGIT)+
150	;
151
152ID
153options {
154	testLiterals = true;
155}
156	:	('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
157	;
158