Home | History | Annotate | Download | only in lexer
      1 #!/usr/bin/ruby
      2 # encoding: utf-8
      3 
      4 require 'antlr3/test/functional'
      5 
      6 class TestLexerRuleReference < ANTLR3::Test::Functional
      7 
      8   inline_grammar( <<-'END' )
      9     lexer grammar RuleProperty;
     10     options {
     11       language = Ruby;
     12     }
     13     
     14     @lexer::init {
     15       @properties = []
     16     }
     17     @lexer::members {
     18       attr_reader :properties
     19     }
     20     
     21     IDENTIFIER: 
     22             ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
     23             {
     24               @properties << [$text, $type, $line, $pos, $index, $channel, $start, $stop]
     25             }
     26         ;
     27     WS: (' ' | '\n')+;
     28   END
     29 
     30   example "referencing lexer rule properties" do
     31     lexer = RuleProperty::Lexer.new( "foobar _ab98 \n A12sdf" )
     32     tokens = lexer.map { |tk| tk }
     33     
     34     lexer.properties.should have( 3 ).things
     35     text, type, line, pos, index, channel, start, stop = lexer.properties[ 0 ]
     36     text.should == 'foobar'
     37     type.should == RuleProperty::TokenData::IDENTIFIER
     38     line.should == 1
     39     pos.should == 0
     40     index.should == -1
     41     channel.should == ANTLR3::DEFAULT_CHANNEL
     42     start.should == 0
     43     stop.should == 5
     44     
     45     text, type, line, pos, index, channel, start, stop = lexer.properties[ 1 ]
     46     text.should == '_ab98'
     47     type.should == RuleProperty::TokenData::IDENTIFIER
     48     line.should == 1
     49     pos.should == 7
     50     index.should == -1
     51     channel.should == ANTLR3::DEFAULT_CHANNEL
     52     start.should == 7
     53     stop.should == 11
     54     
     55     lexer.properties.should have( 3 ).things
     56     text, type, line, pos, index, channel, start, stop = lexer.properties[ 2 ]
     57     text.should == 'A12sdf'
     58     type.should == RuleProperty::TokenData::IDENTIFIER
     59     line.should == 2
     60     pos.should == 1
     61     index.should == -1
     62     channel.should == ANTLR3::DEFAULT_CHANNEL
     63     start.should == 15
     64     stop.should == 20
     65   end
     66 
     67 
     68 end
     69 
     70 class TestLexerRuleLabel < ANTLR3::Test::Functional
     71   inline_grammar( <<-'END' )
     72     lexer grammar LexerRuleLabel;
     73     options {
     74       language = Ruby;
     75     }
     76     
     77     @members { attr_reader :token_text }
     78     
     79     A: 'a'..'z' WS '0'..'9'
     80             {
     81               @token_text = $WS.text
     82             }
     83         ;
     84     
     85     fragment WS  :
     86             (   ' '
     87             |   '\t'
     88             |  ( '\n'
     89                 |	'\r\n'
     90                 |	'\r'
     91                 )
     92             )+
     93             { $channel = HIDDEN }
     94         ;
     95   END
     96   
     97   example "referencing other token rule values with labels" do
     98     lexer = LexerRuleLabel::Lexer.new 'a  2'
     99     lexer.next_token
    100     lexer.token_text.should == '  '
    101   end
    102 
    103 end
    104