1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestLexerRuleReference < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer grammar RuleProperty;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::init {
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @properties = []
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @lexer::members {
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      attr_reader :properties
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    IDENTIFIER: 
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              @properties << [$text, $type, $line, $pos, $index, $channel, $start, $stop]
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: (' ' | '\n')+;
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "referencing lexer rule properties" do
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = RuleProperty::Lexer.new( "foobar _ab98 \n A12sdf" )
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = lexer.map { |tk| tk }
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.properties.should have( 3 ).things
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text, type, line, pos, index, channel, start, stop = lexer.properties[ 0 ]
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text.should == 'foobar'
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type.should == RuleProperty::TokenData::IDENTIFIER
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    line.should == 1
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pos.should == 0
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index.should == -1
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    channel.should == ANTLR3::DEFAULT_CHANNEL
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start.should == 0
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stop.should == 5
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text, type, line, pos, index, channel, start, stop = lexer.properties[ 1 ]
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text.should == '_ab98'
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type.should == RuleProperty::TokenData::IDENTIFIER
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    line.should == 1
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pos.should == 7
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index.should == -1
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    channel.should == ANTLR3::DEFAULT_CHANNEL
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start.should == 7
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stop.should == 11
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.properties.should have( 3 ).things
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text, type, line, pos, index, channel, start, stop = lexer.properties[ 2 ]
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text.should == 'A12sdf'
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type.should == RuleProperty::TokenData::IDENTIFIER
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    line.should == 2
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pos.should == 1
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index.should == -1
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    channel.should == ANTLR3::DEFAULT_CHANNEL
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start.should == 15
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stop.should == 20
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestLexerRuleLabel < ANTLR3::Test::Functional
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer grammar LexerRuleLabel;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members { attr_reader :token_text }
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    A: 'a'..'z' WS '0'..'9'
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              @token_text = $WS.text
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    fragment WS  :
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            (   ' '
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |   '\t'
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |  ( '\n'
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                |	'\r\n'
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                |	'\r'
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )+
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $channel = HIDDEN }
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "referencing other token rule values with labels" do
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = LexerRuleLabel::Lexer.new 'a  2'
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.next_token
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer.token_text.should == '  '
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
104