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