1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestImportedGrammars < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def load( grammar )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar.compile
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $:.unshift( grammar.output_directory ) unless $:.include?( grammar.output_directory )
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for file in grammar.target_files( false )
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      require File.basename( file, '.rb' )
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'delegator invokes delegate rule' do
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar DIDRSlave;
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @didr_master.capture(t)
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : B { capture("S.a") } ;
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar DIDRMaster;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import DIDRSlave;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      s : a ;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') { skip() } ;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = DIDRMaster::Lexer.new( 'b' )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = DIDRMaster::Parser.new( tokens )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.s
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'S.a'
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'delegator invokes delegate rule with args' do
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave2;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_2.capture(t)
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a[x] returns [y] : B {capture("S.a"); $y="1000";} ;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master2;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;}
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave2;
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      s : label=a[3] {capture($label.y)} ;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Master2::Lexer.new( 'b' )
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master2::Parser.new( tokens )
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.s
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'S.a1000'
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delegator accesses delegate members" do
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave3;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_3.capture(t)
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def whatevs
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          capture("whatevs")
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : B ;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master3;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave3;
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      s : 'b' {@slave_3.whatevs} ;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip()} ;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master3::Parser.new( Master3::Lexer.new( 'b' ) )
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.s
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'whatevs'
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delegator invokes first version of delegate rule" do
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave4A;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_4.capture(t)
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b {capture("S.a")} ;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : B ;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave4B;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_4.capture(t)
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : B {capture("T.a")} ;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master4;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave4A, Slave4B;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      s : a ;
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master4::Parser.new( Master4::Lexer.new( 'b' ) )
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.s
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'S.a'
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delegates see same token type" do
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave5A; // A, B, C token type order
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens { A; B; C; }
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_5.capture(t)
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      x : A {capture("S.x ")} ;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave5B;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens { C; B; A; } /// reverse order
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_5.capture(t)
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      y : A {capture("T.y")} ;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master5;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave5A, Slave5B;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      s : x y ; // matches AA, which should be "aa"
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ; // another order: B, A, C
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      A : 'a' ;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      C : 'c' ;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Master5::Lexer.new( 'aa' )
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master5::Parser.new( tokens )
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.s
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'S.x T.y'
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delegator rule overrides delegate" do
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave6;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_6.capture(t)
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b {capture("S.a")} ;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : B ;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master6;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave6;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : 'b'|'c' ;
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master6::Parser.new( Master6::Lexer.new( 'c' ) )
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.a
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == 'S.a'
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "lexer delegator invokes delegate rule" do
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar Slave7;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }                                                                       
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_7.capture(t)
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      A : 'a' {capture("S.A ")} ;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      C : 'c' ;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar Master7;
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave7;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      B : 'b' ;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Master7::Lexer.new( 'abc' )
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.map { |tk| lexer.capture( tk.text ) }
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.output.should == 'S.A abc'
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "lexer delegator rule overrides delegate" do
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar Slave8;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;}
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_8.capture(t)
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      A : 'a' {capture("S.A")} ;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar Master8;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;}
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave8;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      A : 'a' {capture("M.A ")} ;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Master8::Lexer.new( 'a' )
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.map { |tk| lexer.capture( tk.text ) }
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.output.should == 'M.A a'
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "delegator rule with syntactic predicates" do
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser grammar Slave9;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members {
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def capture(t)
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @master_9.capture(t)
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b c;
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : ('c' 'b')=> 'c' 'b' { capture("(cb)") }
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ('c' 'c')=> 'c'
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Master9;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import Slave9;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ('b' 'b')=> 'b' 'b'
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ('b' 'c')=> 'b' {capture("(bc)")}
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {skip} ;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Master9::Parser.new( Master9::Lexer.new( 'bcb' ) )
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.a
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.output.should == '(bc)(cb)'
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "lots of imported lexers" do
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar SlaveOfSlaves;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INTEGER: ('+'|'-')? DIGITS;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FLOAT: INTEGER '.' DIGITS (('e'|'E') INTEGER)?;
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      fragment DIGITS: ('0'..'9')+;
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar FirstSlave;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import SlaveOfSlaves;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID: ('A'..'Z')+;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      OPS: '+' | '-' | '*' | '/';
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inline_grammar( <<-'END' )
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar SecondSlave;
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT: ('0'..'9')+;
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID: ('a'..'z'|'A'..'Z'|'_')+;
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    load inline_grammar( <<-'END' )
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer grammar MasterOfAll;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      import FirstSlave, SecondSlave;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID: ('a'..'z'|'A'..'Z'|'_')+;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS: ' '+ { $channel=HIDDEN };
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::Lexer.master_grammars.should == []
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::Lexer.imported_grammars.should == Set[ :FirstSlave, :SecondSlave ]
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::Lexer.master.should be_nil
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave.master_grammars.should == [ :MasterOfAll ]
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave.imported_grammars.should == Set[ :SlaveOfSlaves ]
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave.master.should == :MasterOfAll
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::SecondSlave.master_grammars.should == [ :MasterOfAll ]
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::SecondSlave.imported_grammars.should == Set[ ]
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::SecondSlave.master.should == :MasterOfAll
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave::SlaveOfSlaves.master_grammars.should == [ :MasterOfAll, :FirstSlave ]
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave::SlaveOfSlaves.imported_grammars.should == Set[ ]
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MasterOfAll::FirstSlave::SlaveOfSlaves.master.should == :FirstSlave
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master = MasterOfAll::Lexer.new( 'blah de blah' )
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.should respond_to :first_slave
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.should respond_to :second_slave
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.first_slave.should respond_to :slave_of_slaves
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.first_slave.should respond_to :master_of_all
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.first_slave.slave_of_slaves.should respond_to :first_slave
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    master.first_slave.slave_of_slaves.should respond_to :master_of_all
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dels = master.each_delegate.map { |d| d }
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dels.should have( 2 ).things
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dels.should include master.first_slave
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dels.should include master.second_slave
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
380