1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestRulePropertyReference < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RuleProperties;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options { language = Ruby; }
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @parser::members {
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::members {
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a returns [bla]
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @after { $bla = [$start, $stop, $text] }
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : A+
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A: 'a'..'z';
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' '+  { $channel = HIDDEN };
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "accessing rule properties" do
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = RuleProperties::Lexer.new( '   a a a a  ' )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = RuleProperties::Parser.new lexer
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start, stop, text = parser.a.bla
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start.index.should == 1
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stop.index.should == 7
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text.should == 'a a a a'
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestLabels < ANTLR3::Test::Functional
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar Labels;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options { language = Ruby; }
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @parser::members {
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def recover(e)
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise e
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::members {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def recover(e)
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise e
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a returns [l]
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $l = [$ids, $w] }
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A: 'a'..'z';
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    B: '0'..'9';
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    C: a='A' { $a };
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    D: a='FOOBAR' { $a };
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    E: 'GNU' a=. { $a };
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    F: 'BLARZ' a=EOF { $a };
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' '+  { $channel = HIDDEN };
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "parsing 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'" do
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Labels::Lexer.new 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Labels::Parser.new lexer
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids, w = parser.a
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids.should have( 6 ).things
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 0 ].text.should == 'a'
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 1 ].text.should == 'b'
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 2 ].text.should == 'c'
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 3 ].text.should == '1'
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 4 ].text.should == '2'
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ids[ 5 ].text.should == 'A'
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    w.text.should == 'GNU1'
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTokenLabelReference < ANTLR3::Test::Functional
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenLabels;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @parser::members {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::members {
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a returns [$tk]
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      : t=A
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $tk = [
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.text,
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.type,
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.name,
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.line,
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.pos,
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.index,
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              $t.channel
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ]
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A: 'a'..'z';
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS  :
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            (   ' '
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |   '\t'
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |  ( '\n'
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                |	'\r\n'
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                |	'\r'
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )+
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $channel = HIDDEN }
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "accessing tokens with labels" do
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = TokenLabels::Lexer.new( '   a' )
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = TokenLabels::Parser.new lexer
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tk = parser.a
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tk.should == [ 
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      'a', TokenLabels::TokenData::A, 'A',
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      1, 3, 1, :default
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestRuleLabelReference < ANTLR3::Test::Functional
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RuleLabelReference;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {language = Ruby;}
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @parser::members {
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::members {
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a returns [bla]: t=b
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $bla = [$t.start, $t.stop, $t.text]
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    b: A+;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A: 'a'..'z';
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' '+  { $channel = HIDDEN };
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "referencing rule properties using rule labels" do
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = RuleLabelReference::Lexer.new( '   a a a a  ' )
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = RuleLabelReference::Parser.new lexer
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start, stop, text = parser.a
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start.index.should == 1
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stop.index.should == 7
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text.should == 'a a a a'
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestReferenceDoesntSetChannel < ANTLR3::Test::Functional
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar ReferenceSetChannel;
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {language=Ruby;}
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a returns [foo]: A EOF { $foo = '\%s, channel=\%p' \% [$A.text, $A.channel]; } ;
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A : '-' WS I ;
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    I : '0'..'9'+ ;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' ' | '\t';
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'verifying that a token reference does not set its channel' do
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = ReferenceSetChannel::Lexer.new( "- 34" )
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = ReferenceSetChannel::Parser.new lexer
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.a.should == "- 34, channel=:default"
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
243