1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestASTConstructingParser < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  compile inline_grammar( <<-'END' )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar ASTBuilder;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      output = AST;
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens {
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        VARDEF;
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FLOAT;
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        EXPR;
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        BLOCK;
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        VARIABLE;
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIELD;
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CALL;
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INDEX;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIELDACCESS;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @init {
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @flag = false
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      attr_accessor :flag
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(e)
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r1
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT ('+'^ INT)*
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r2
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'assert'^ x=expression (':'! y=expression)? ';'!
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r3
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'if'^ expression s1=statement ('else'! s2=statement)?
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r4
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'while'^ expression statement
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r5
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'return'^ expression? ';'!
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r6
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (INT|ID)+
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r7
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT -> 
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r8
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'var' ID ':' type -> ^('var' type ID) 
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r9
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : type ID ';' -> ^(VARDEF type ID) 
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r10
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT -> { ANTLR3::AST::CommonTree.new(ANTLR3::CommonToken.create(:type => FLOAT, :text => ($INT.text + ".0")))}
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r11
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : expression -> ^(EXPR expression)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | -> EXPR
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r12
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID (',' ID)* -> ID+
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r13
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : type ID (',' ID)* ';' -> ^(type ID+)
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r14
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   expression? statement* type+
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^(EXPR expression? statement* type+)
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r15
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT -> INT INT
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r16
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'int' ID (',' ID)* -> ^('int' ID)+
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r17
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^('for' $start expression $next statement)
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r18
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> ^(BLOCK)
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r19
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> ^(BLOCK[$t])
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r20
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> ^(BLOCK[$t,"FOR"])
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r21
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> BLOCK
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r22
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> BLOCK[$t]
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r23
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t='for' -> BLOCK[$t,"FOR"]
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r24
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : r=statement expression -> ^($r expression)
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r25
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : r+=statement (',' r+=statement)+ expression -> ^($r expression)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r26
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r27
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : r=statement expression -> ^($r ^($r expression))
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r28
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ('foo28a'|'foo28b') ->
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r29
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (r+=statement)* -> ^(BLOCK $r+)
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r30
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : statement* -> ^(BLOCK statement?)
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r31
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : modifier type ID ('=' expression)? ';'
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> {@flag == 0}? ^(VARDEF ID modifier* type expression?)
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> {@flag == 1}? ^(VARIABLE ID modifier* type expression?)
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ->                   ^(FIELD ID modifier* type expression?)
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r32[which]
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      : ID INT -> {which==1}? ID
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               -> {which==2}? INT
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               -> // yield nothing as else-clause
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r33
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   modifiers! statement
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r34
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   modifiers! r34a[$modifiers.tree]
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //|   modifiers! r33b[$modifiers.tree]
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r34a[mod]
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   'class' ID ('extends' sup=type)?
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ( 'implements' i+=type (',' i+=type)*)?
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            '{' statement* '}'
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r35
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : '{' 'extends' (sup=type)? '}'
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ->  ^('extends' $sup)?
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r36
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'if' '(' expression ')' s1=statement
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |                     -> ^('if' ^(EXPR expression) $s1)
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r37
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* 
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r38
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT ('+'^ INT)*
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r39
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (primary->primary) // set return tree to just primary
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ( '(' arg=expression ')'
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                -> ^(CALL $r39 $arg)
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            | '[' ie=expression ']'
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                -> ^(INDEX $r39 $ie)
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            | '.' p=primary
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                -> ^(FIELDACCESS $r39 $p)
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )*
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r40
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r41
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r42
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=ID (','! ids+=ID)*
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r43 returns [res]
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=ID! (','! ids+=ID!)* {$res = $ids.map { |id| id.text }}
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r44
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=ID^ (','! ids+=ID^)*
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r45
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : primary^
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r46 returns [res]
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=primary! (','! ids+=primary!)* {$res = $ids.map { |id| id.text }}
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r47
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=primary (','! ids+=primary)*
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r48
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=. (','! ids+=.)*
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r49
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : .^ ID
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r50
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID 
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^({ANTLR3::AST::CommonTree.new(ANTLR3::CommonToken.create(:type => FLOAT, :text => "1.0"))} ID)
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenLabelPropertyRef_tree
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r51 returns [res]
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID t=ID ID
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $res = $t.tree }
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rulePropertyRef_tree
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r52 returns [res]
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @after {
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $res = $tree
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ruleLabelPropertyRef_tree
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r53 returns [res]
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t=primary
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $res = $t.tree }
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ruleSetPropertyRef_tree
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r54 returns [res]
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @after {
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $tree = $t.tree;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID t=expression ID
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** backtracking */
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r55
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options { backtrack=true; k=1; }
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (modifier+ INT)=> modifier+ expression
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | modifier+ statement
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewriteTokenRef with len(args)>0
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r56
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t=ID* -> ID[$t,'foo']
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewriteTokenRefRoot with len(args)>0
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r57
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : t=ID* -> ^(ID[$t,'foo'])
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ???
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r58
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ({CommonTree.new(CommonToken.create(:type => FLOAT, :text => "2.0"))})^
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** templates tested:
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewriteTokenListLabelRefRoot
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r59
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (t+=ID)+ statement -> ^($t statement)+
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    primary
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expression
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : r1
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    statement
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'fooze'
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 'fooze2'
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    modifiers
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : modifier+
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    modifier
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'public'
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 'private'
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'int'
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 'bool'
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z' + ;
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9' +;
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.ast_test( opts, &special_test )
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input = opts[ :input ]
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    rule  = opts[ :rule ]
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected_tree = opts[ :ast ]
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    flag = opts[ :flag ]
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    args = opts[ :arguments ] || []
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    message = opts[ :message ] || rule.to_s #"should parse %p with rule %s and make tree %s" % [input, rule, expected_tree]
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    example( message ) do
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer = ASTBuilder::Lexer.new( input )
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser = ASTBuilder::Parser.new( lexer )
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser.flag = flag unless flag.nil?
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      result = parser.send( rule, *args )
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if special_test then instance_exec( result, &special_test )
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elsif expected_tree then
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result.tree.inspect.should == expected_tree
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else result.tree.should be_nil
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1 + 2", :rule => :r1, :ast => "(+ 1 2)"
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "assert 2+3", :rule => :r2, :ast => "(assert (+ 2 3))"
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "assert 2+3 : 5", :rule => :r2, :ast => "(assert (+ 2 3) 5)"
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "if 1 fooze", :rule => :r3, :ast => "(if 1 fooze)"
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "if 1 fooze else fooze", :rule => :r3, :ast => "(if 1 fooze fooze)"
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "while 2 fooze", :rule => :r4, :ast => "(while 2 fooze)"
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "return;", :rule => :r5, :ast => "return"
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "return 2+3;", :rule => :r5, :ast => "(return (+ 2 3))"
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "3", :rule => :r6, :ast => "3"
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "3 a", :rule => :r6, :ast => "3 a"
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "3", :rule => :r7, :ast => nil
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "var foo:bool", :rule => :r8, :ast => "(var bool foo)"
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "int foo;", :rule => :r9, :ast => "(VARDEF int foo)"
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "10", :rule => :r10, :ast => "10.0"
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1+2", :rule => :r11, :ast => "(EXPR (+ 1 2))"
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "", :rule => :r11, :ast => "EXPR"
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "foo", :rule => :r12, :ast => "foo"
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "foo, bar, gnurz", :rule => :r12, :ast => "foo bar gnurz"
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "int foo;", :rule => :r13, :ast => "(int foo)"
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "bool foo, bar, gnurz;", :rule => :r13, :ast => "(bool foo bar gnurz)"
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1+2 int", :rule => :r14, :ast => "(EXPR (+ 1 2) int)"
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1+2 int bool", :rule => :r14, :ast => "(EXPR (+ 1 2) int bool)"
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "int bool", :rule => :r14, :ast => "(EXPR int bool)"
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "fooze fooze int bool", :rule => :r14, :ast => "(EXPR fooze fooze int bool)"
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "7+9 fooze fooze int bool", :rule => :r14, :ast => "(EXPR (+ 7 9) fooze fooze int bool)"
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "7", :rule => :r15, :ast => "7 7"
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "int foo", :rule => :r16, :ast => "(int foo)"
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "int foo, bar, gnurz", :rule => :r16, :ast => "(int foo) (int bar) (int gnurz)"
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for ( fooze ; 1 + 2 ; fooze ) fooze", :rule => :r17, :ast => "(for fooze (+ 1 2) fooze fooze)"
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r18, :ast => "BLOCK"
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r19, :ast => "for"
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r20, :ast => "FOR"
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r21, :ast => "BLOCK"
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r22, :ast => "for"
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "for", :rule => :r23, :ast => "FOR"
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "fooze 1 + 2", :rule => :r24, :ast => "(fooze (+ 1 2))"
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "fooze, fooze2 1 + 2", :rule => :r25, :ast => "(fooze (+ 1 2))"
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "fooze, fooze2", :rule => :r26, :ast => "(BLOCK fooze fooze2)"
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "fooze 1 + 2", :rule => :r27, :ast => "(fooze (fooze (+ 1 2)))"
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "foo28a", :rule => :r28, :ast => nil
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public int gnurz = 1 + 2;", :rule => :r31, :ast => "(VARDEF gnurz public int (+ 1 2))", :flag => 0
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public int gnurz = 1 + 2;", :rule => :r31, :ast => "(VARIABLE gnurz public int (+ 1 2))", :flag => 1
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public int gnurz = 1 + 2;", :rule => :r31, :ast => "(FIELD gnurz public int (+ 1 2))", :flag => 2
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz 32', :rule => :r32, :arguments => [ 1 ], :flag => 2, :ast => 'gnurz'
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz 32', :rule => :r32, :arguments => [ 2 ], :flag => 2, :ast => '32'
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz', :rule => :r32, :arguments => [ 3 ], :flag => 2, :ast => nil
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public private fooze", :rule => :r33, :ast => "fooze"
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public class gnurz { fooze fooze2 }", :rule => :r34, :ast => "(class gnurz public fooze fooze2)"
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "public class gnurz extends bool implements int, bool { fooze fooze2 }", :rule => :r34, :ast => "(class gnurz public (extends bool) (implements int bool) fooze fooze2)"
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "if ( 1 + 2 ) fooze", :rule => :r36, :ast => "(if (EXPR (+ 1 2)) fooze)"
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1 + 2 + 3", :rule => :r37, :ast => "(+ (+ 1 2) 3)"
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1 + 2 + 3", :rule => :r38, :ast => "(+ (+ 1 2) 3)"
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz[1]", :rule => :r39, :ast => "(INDEX gnurz 1)"
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz(2)", :rule => :r39, :ast => "(CALL gnurz 2)"
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz.gnarz", :rule => :r39, :ast => "(FIELDACCESS gnurz gnarz)"
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz.gnarz.gnorz", :rule => :r39, :ast => "(FIELDACCESS (FIELDACCESS gnurz gnarz) gnorz)"
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1 + 2 + 3;", :rule => :r40, :ast => "(+ 1 2 3)"
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "1 + 2 + 3;", :rule => :r41, :ast => "(3 (2 1))"
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz, gnarz, gnorz", :rule => :r42, :ast => "gnurz gnarz gnorz"
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => "gnurz, gnarz, gnorz", :rule => :r43 do |result|
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.tree.should be_nil
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.res.should == %w(gnurz gnarz gnorz)
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz, gnarz, gnorz', :rule => :r44, :ast => '(gnorz (gnarz gnurz))'
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz', :rule => :r45, :ast => 'gnurz'
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz, gnarz, gnorz', :rule => :r46 do |result|
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.tree.should be_nil
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.res.should == %w(gnurz gnarz gnorz)
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz, gnarz, gnorz', :rule => :r47, :ast => 'gnurz gnarz gnorz'
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz, gnarz, gnorz', :rule => :r48, :ast => 'gnurz gnarz gnorz'
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz gnorz', :rule => :r49, :ast => '(gnurz gnorz)'
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz', :rule => :r50, :ast => '(1.0 gnurz)'
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurza gnurzb gnurzc', :rule => :r51 do |result|
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.res.inspect.should == 'gnurzb'
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz', :rule => :r52, :ast => 'gnurz'
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurz', :rule => :r53, :ast => 'gnurz'
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'gnurza 1 + 2 gnurzb', :rule => :r54, :ast => '(+ 1 2)'
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'public private 1 + 2', :rule => :r55, :ast => 'public private (+ 1 2)'
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'public fooze', :rule => :r55, :ast => 'public fooze'
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'a b c d', :rule => :r56, :ast => 'foo'
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'a b c d', :rule => :r57, :ast => 'foo'
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ast_test :input => 'a b c fooze', :rule => :r59, :ast => '(a fooze) (b fooze) (c fooze)'
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
555