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