1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestASTViaRewriteRules < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def parse( grammar, rule, input, expect_errors = false )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar = inline_grammar( grammar )
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load @grammar
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module = self.class.const_get( @grammar.name )
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Lexer.send( :include, ANTLR3::Test::CollectErrors )
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Lexer.send( :include, ANTLR3::Test::CaptureOutput )
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Parser.send( :include, ANTLR3::Test::CollectErrors )
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Parser.send( :include, ANTLR3::Test::CaptureOutput )
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = grammar_module::Lexer.new( input )
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = grammar_module::Parser.new( lexer )
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = parser.send( rule )
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.reported_errors.should be_empty unless expect_errors
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = ''
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unless r.nil?
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      result += r.result if r.respond_to?( :result )
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      result += r.tree.inspect if r.tree
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( expect_errors ? [ result, parser.reported_errors ] : result )
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def tree_parse( grammar, tree_grammar, rule, tree_rule, input )
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar = inline_grammar( grammar )
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @tree_grammar = inline_grammar( tree_grammar )
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load @grammar
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load @tree_grammar
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module = self.class.const_get( @grammar.name )
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_grammar_module = self.class.const_get( @tree_grammar.name )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Lexer.send( :include, ANTLR3::Test::CollectErrors )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Lexer.send( :include, ANTLR3::Test::CaptureOutput )
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Parser.send( :include, ANTLR3::Test::CollectErrors )
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module::Parser.send( :include, ANTLR3::Test::CaptureOutput )
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_grammar_module::TreeParser.send( :include, ANTLR3::Test::CollectErrors )
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_grammar_module::TreeParser.send( :include, ANTLR3::Test::CaptureOutput )
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = grammar_module::Lexer.new( input )
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = grammar.module::Parser.new( lexer )
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = parser.send( rule )
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::CommonTreeNodeStream( r.tree )
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = parser.input
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = tree_grammar_module::TreeParser.new( nodes )
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = walker.send( tree_rule )
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( r ? r.tree.inspect : '' )
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delete" do
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Delete;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> ;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == ''
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single token" do
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleToken;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ID;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc'
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single token to new node" do
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleTokenToNewNode;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ID["x"];
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'x'
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single token to new node root" do
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleTokenToNewNodeRoot;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ^(ID["x"] INT);
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(x INT)'
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single token to new node2" do
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleTokenToNewNode2;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ID[ ];
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ID'
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single char literal" do
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'c' )
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleCharLiteral;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'c' -> 'c';
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'c'
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single string literal" do
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'ick' )
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleStringLiteral;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'ick' -> 'ick';
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ick'
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single rule" do
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SingleRule;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b -> b;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc'
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "reorder tokens" do
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ReorderTokens;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> INT ID;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '34 abc'
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "reorder token and rule" do
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ReorderTokenAndRule;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b INT -> INT b;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '34 abc'
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token tree" do
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar TokenTree;
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> ^(INT ID);
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(34 abc)'
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token tree after other stuff" do
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'void abc 34' )
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar TokenTreeAfterOtherStuff;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'void' ID INT -> 'void' ^(INT ID);
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'void (34 abc)'
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nested token tree with outer loop" do
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a 1 b 2' )
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NestedTokenTreeWithOuterLoop;
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {DUH;}
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT ID INT -> ^( DUH ID ^( DUH INT) )+ ;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(DUH a (DUH 1)) (DUH b (DUH 2))'
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional single token" do
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar OptionalSingleToken;
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ID? ;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc'
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "closure single token" do
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ClosureSingleToken;
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ID -> ID* ;
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "positive closure single token" do
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar PositiveClosureSingleToken;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ID -> ID+ ;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional single rule" do
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar OptionalSingleRule;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b -> b?;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc'
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "closure single rule" do
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ClosureSingleRule;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b -> b*;
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "closure of label" do
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ClosureOfLabel;
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x+=b x+=b -> $x*;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional label no list label" do
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar OptionalLabelNoListLabel;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : (x=ID)? -> $x?;
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a'
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "positive closure single rule" do
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar PositiveClosureSingleRule;
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b -> b+;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single predicate t" do
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SinglePredicateT;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> {true}? ID -> ;
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc'
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "single predicate f" do
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc' )
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SinglePredicateF;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> {false}? ID -> ;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == ''
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "multiple predicate" do
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a 2' )
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MultiplePredicate;
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> {false}? ID
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                 -> {true}? INT
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                 -> 
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '2'
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "multiple predicate trees" do
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a 2' )
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MultiplePredicateTrees;
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> {false}? ^(ID INT)
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                 -> {true}? ^(INT ID)
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                 -> ID
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(2 a)'
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "simple tree" do
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '-34' )
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SimpleTree;
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : op INT -> ^(op INT);
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(- 34)'
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "simple tree2" do
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '+ 34' )
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SimpleTree2;
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : op INT -> ^(INT op);
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(34 +)'
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nested trees" do
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'var a:int; b:float;' )
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NestedTrees;
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'var' (ID ':' type ';')+ -> ^('var' ^(':' ID type)+) ;
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(var (: a int) (: b float))'
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "imaginary token copy" do
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a,b,c' )
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ImaginaryTokenCopy;
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {VAR;}
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID (',' ID)*-> ^(VAR ID)+ ;
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(VAR a) (VAR b) (VAR c)'
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token unreferenced on left but defined" do
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar TokenUnreferencedOnLeftButDefined;
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {VAR;}
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b -> ID ;
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ID'
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "imaginary token copy set text" do
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a,b,c' )
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ImaginaryTokenCopySetText;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {VAR;}
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID (',' ID)*-> ^(VAR["var"] ID)+ ;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(var a) (var b) (var c)'
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "imaginary token no copy from token" do
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '{a b c}' )
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ImaginaryTokenNoCopyFromToken;
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '({ a b c)'
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "imaginary token no copy from token set text" do
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '{a b c}' )
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ImaginaryTokenNoCopyFromTokenSetText;
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : lc='{' ID+ '}' -> ^(BLOCK[$lc,"block"] ID+) ;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(block a b c)'
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "mixed rewrite and auto ast" do
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a 1 2' )
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MixedRewriteAndAutoAST;
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b^ ; // 2nd b matches only an INT; can make it root
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID INT -> INT ID
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | INT
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(2 1 a)'
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "subrule with rewrite" do
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a 1 2 3' )
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SubruleWithRewrite;
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b ;
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : (ID INT -> INT ID | INT INT -> INT+ )
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '1 a 2 3'
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "subrule with rewrite2" do
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a; int b=3;' )
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SubruleWithRewrite2;
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {TYPE;}
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b ;
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : 'int'
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ( ID -> ^(TYPE 'int' ID)
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          | ID '=' INT -> ^(TYPE 'int' ID INT)
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          )
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ';'
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(TYPE int a) (TYPE int b 3)'
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nested rewrite shuts off auto ast" do
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b c d; 42' )
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NestedRewriteShutsOffAutoAST;
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b ;
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ( ID (last=ID -> $last)+ ) ';' // get last ID
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | INT // should still get auto AST construction
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'd 42'
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite actions" do
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '3' )
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RewriteActions;
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : atom -> ^({ @adaptor.create( INT, "9" ) } atom) ;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      atom : INT ;
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(9 3)'
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite actions2" do
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '3' )
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RewriteActions2;
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : atom -> { @adaptor.create( INT, "9" ) } atom ;
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      atom : INT ;
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') { $channel = HIDDEN } ;
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '9 3'
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "ref to old value" do
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '3+4+5' )
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RefToOldValue;
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : (atom -> atom) (op='+' r=atom -> ^($op $a $r) )* ;
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      atom : INT ;
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(+ (+ 3 4) 5)'
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics for rules" do
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '3' )
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsForRules;
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : atom -> ^(atom atom) ; // NOT CYCLE! (dup atom)
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      atom : INT ;
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(3 3)'
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics for rules2" do
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a,b,c;' )
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsForRules2;
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : type ID (',' ID)* ';' -> ^(type ID)+ ;
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' ;
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int a) (int b) (int c)'
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics for rules3" do
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'public int a,b,c;' )
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsForRules3;
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ;
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' ;
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      modifier : 'public' ;
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int public a) (int public b) (int public c)'
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics for rules3 double" do
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'public int a,b,c;' )
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsForRules3Double;
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ^(type modifier? ID)+ ;
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' ;
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      modifier : 'public' ;
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int public a) (int public b) (int public c) (int public a) (int public b) (int public c)'
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics for rules4" do
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'public int a,b,c;' )
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsForRules4;
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {MOD;}
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : modifier? type ID (',' ID)* ';' -> ^(type ^(MOD modifier)? ID)+ ;
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' ;
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      modifier : 'public' ;
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int (MOD public) a) (int (MOD public) b) (int (MOD public) c)'
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics lists" do
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a,b,c;' )
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopySemanticsLists;
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {MOD;}
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID (',' ID)* ';' -> ID+ ID+ ;
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b c a b c'
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy rule label" do
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopyRuleLabel;
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=b -> $x $x;
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a a'
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy rule label2" do
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopyRuleLabel2;
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=b -> ^($x $x);
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(a a)'
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "queueing of tokens" do
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a,b,c;' )
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar QueueingOfTokens;
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'int' ID (',' ID)* ';' -> ^('int' ID+) ;
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int a b c)'
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy of tokens" do
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a;' )
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CopyOfTokens;
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'int' ID ';' -> 'int' ID 'int' ID ;
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'int a int a'
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token copy in loop" do
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a,b,c;' )
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar TokenCopyInLoop;
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'int' ID (',' ID)* ';' -> ^('int' ID)+ ;
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int a) (int b) (int c)'
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token copy in loop against two others" do
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'int a:1,b:2,c:3;' )
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar TokenCopyInLoopAgainstTwoOthers;
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : 'int' ID ':' INT (',' ID ':' INT)* ';' -> ^('int' ID INT)+ ;
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int a 1) (int b 2) (int c 3)'
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "list refd one at a time" do
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b c' )
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ListRefdOneAtATime;
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID+ -> ID ID ID ; // works if 3 input IDs
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b c'
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "split list with labels" do
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b c' )
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SplitListWithLabels;
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {VAR;}
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : first=ID others+=ID* -> $first VAR $others+ ;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      op : '+'|'-' ;
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a VAR b c'
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "complicated melange" do
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a a b b b c c c d' )
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ComplicatedMelange;
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : A A b=B B b=B c+=C C c+=C D {s=$D.text} -> A+ B+ C+ D ;
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      A : 'a' ;
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ;
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      C : 'c' ;
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      D : 'd' ;
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a a b b b c c c d'
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rule label" do
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RuleLabel;
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=b -> $x;
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a'
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "ambiguous rule" do
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar AmbiguousRule;
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID a -> a | INT ;
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT: '0'..'9'+ ;
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '34'
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rule list label" do
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RuleListLabel;
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x+=b x+=b -> $x+;
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rule list label2" do
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RuleListLabel2;
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x+=b x+=b -> $x $x*;
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional" do
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Optional;
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=b (y=b)? -> $x $y?;
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a'
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional2" do
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Optional2;
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=ID (y=b)? -> $x $y?;
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional3" do
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Optional3;
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=ID (y=b)? -> ($x $y)?;
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional4" do
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Optional4;
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x+=ID (y=b)? -> ($x $y)?;
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a b'
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional5" do
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a' )
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Optional5;
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID -> ID? ; // match an ID to optional ID
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a'
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "arbitrary expr type" do
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'a b' )
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ArbitraryExprType;
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {BLOCK;}
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x+=b x+=b -> {ANTLR3::CommonTree.new(nil)};
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID ;
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == ''
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "set" do
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '2 a 34 de' )
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SetT;
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;} 
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a: (INT|ID)+ -> INT+ ID+ ;
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT: '0'..'9'+;
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+;
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '2 34 a de'
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "set2" do
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, '2' )
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Set2;
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;} 
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a: (INT|ID) -> INT? ID? ;
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT: '0'..'9'+;
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+;
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '2'
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "set with label" do
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    warn( 'test SetWithLabel officially broken' )
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #result = parse(<<-'END', :a, '2')
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  grammar SetWithLabel;
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  options {language=Ruby;output=AST;} 
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  a : x=(INT|ID) -> $x ;
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  INT: '0'..'9'+;
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  ID : 'a'..'z'+;
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #  WS : (' '|'\n') {$channel=HIDDEN;} ;
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #END
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #result.should == '2'
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite action" do
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :r, '25' )
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RewriteAction; 
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens { FLOAT; }
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      r
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          : INT -> { ANTLR3::CommonTree.new( create_token( FLOAT, nil, "#{$INT.text}.0" ) ) }
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ; 
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+; 
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '25.0'
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "optional subrule without real elements" do
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :modulo, 'modulo abc (x y #)' )
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar OptionalSubruleWithoutRealElements;
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;} 
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {PARMS;} 
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      modulo 
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       : 'modulo' ID ('(' parms+ ')')? -> ^('modulo' ID ^(PARMS parms+)?) 
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       ; 
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parms : '#'|ID; 
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : ('a'..'z' | 'A'..'Z')+;
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(modulo abc (PARMS x y #))'
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "wildcard" do
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( <<-'END', :a, 'abc 34' )
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Wildcard;
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID c=. -> $c;
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '34'
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "extra token in simple decl" do
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :decl, 'int 34 x=1;', true )
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ExtraTokenInSimpleDecl;
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {EXPR;}
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:4 extraneous input "34" expecting ID' ]
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(EXPR int x 1)'
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "missing id in simple decl" do
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :decl, 'int =1;', true )
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MissingIDInSimpleDecl;
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {EXPR;}
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:4 missing ID at "="' ]
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(EXPR int <missing ID> 1)'
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "missing set in simple decl" do
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :decl, 'x=1;', true )
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MissingSetInSimpleDecl;
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens {EXPR;}
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      type : 'int' | 'float' ;
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:0 mismatched input "x" expecting set nil' ]
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(EXPR <error: x> x 1)'
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "missing token gives error node" do
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :a, 'abc', true )
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MissingTokenGivesErrorNode;
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> ID INT ;
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ "line 0:-1 missing INT at \"<EOF>\"" ]
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc <missing INT>'
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #end
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "extra token gives error node" do
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :a, 'abc ick 34', true )
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ExtraTokenGivesErrorNode;
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b c -> b c;
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID -> ID ;
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT -> INT ;
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:4 extraneous input "ick" expecting INT' ]
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc 34'
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "missing first token gives error node" do
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :a, '34', true )
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MissingFirstTokenGivesErrorNode;
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> ID INT ;
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:0 missing ID at "34"' ]
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '<missing ID> 34'
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "missing first token gives error node2" do
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :a, '34', true )
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MissingFirstTokenGivesErrorNode2;
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b c -> b c;
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID -> ID ;
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT -> INT ;
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:0 missing ID at "34"' ]
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '<missing ID> 34'
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "no viable alt gives error node" do
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result, errors = parse( <<-'END', :a, '*', true )
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NoViableAltGivesErrorNode;
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;output=AST;}
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b -> b | c -> c;
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID -> ID ;
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT -> INT ;
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      S : '*' ;
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    errors.should == [ 'line 1:0 no viable alternative at input "*"' ]
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '<unexpected: 0 S["*"] @ line 1 col 0 (0..0), resync = *>'
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "cardinality" do
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lambda do
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parse( <<-'END', :a, "a b 3 4 5" )
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar Cardinality;
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {language=Ruby;output=AST;}
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens {BLOCK;}
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID ID INT INT INT -> (ID INT)+;
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+; 
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end.should raise_error( ANTLR3::Error::RewriteCardinalityError )
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "cardinality2" do
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lambda do
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parse( <<-'END', :a, "a b" )
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar Cardinality2;
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {language=Ruby;output=AST;}
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens {BLOCK;}
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID+ -> ID ID ID ; // only 2 input IDs
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        op : '+'|'-' ;
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end.should raise_error( ANTLR3::Error::RewriteCardinalityError )
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "cardinality3" do
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lambda do
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parse( <<-'END', :a, "3" )
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar Cardinality3;
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {language=Ruby;output=AST;}
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens {BLOCK;}
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID? INT -> ID INT ;
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        op : '+'|'-' ;
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end.should raise_error( ANTLR3::Error::RewriteEmptyStream )
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "loop cardinality" do
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lambda do
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parse( <<-'END', :a, "3" )
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar LoopCardinality;
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {language=Ruby;output=AST;}
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID? INT -> ID+ INT ;
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        op : '+'|'-' ;
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end.should raise_error( ANTLR3::Error::RewriteEarlyExit )
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
1327