#!/usr/bin/ruby # encoding: utf-8 require 'antlr3/test/functional' class TestLexerRuleReference < ANTLR3::Test::Functional inline_grammar( <<-'END' ) lexer grammar RuleProperty; options { language = Ruby; } @lexer::init { @properties = [] } @lexer::members { attr_reader :properties } IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* { @properties << [$text, $type, $line, $pos, $index, $channel, $start, $stop] } ; WS: (' ' | '\n')+; END example "referencing lexer rule properties" do lexer = RuleProperty::Lexer.new( "foobar _ab98 \n A12sdf" ) tokens = lexer.map { |tk| tk } lexer.properties.should have( 3 ).things text, type, line, pos, index, channel, start, stop = lexer.properties[ 0 ] text.should == 'foobar' type.should == RuleProperty::TokenData::IDENTIFIER line.should == 1 pos.should == 0 index.should == -1 channel.should == ANTLR3::DEFAULT_CHANNEL start.should == 0 stop.should == 5 text, type, line, pos, index, channel, start, stop = lexer.properties[ 1 ] text.should == '_ab98' type.should == RuleProperty::TokenData::IDENTIFIER line.should == 1 pos.should == 7 index.should == -1 channel.should == ANTLR3::DEFAULT_CHANNEL start.should == 7 stop.should == 11 lexer.properties.should have( 3 ).things text, type, line, pos, index, channel, start, stop = lexer.properties[ 2 ] text.should == 'A12sdf' type.should == RuleProperty::TokenData::IDENTIFIER line.should == 2 pos.should == 1 index.should == -1 channel.should == ANTLR3::DEFAULT_CHANNEL start.should == 15 stop.should == 20 end end class TestLexerRuleLabel < ANTLR3::Test::Functional inline_grammar( <<-'END' ) lexer grammar LexerRuleLabel; options { language = Ruby; } @members { attr_reader :token_text } A: 'a'..'z' WS '0'..'9' { @token_text = $WS.text } ; fragment WS : ( ' ' | '\t' | ( '\n' | '\r\n' | '\r' ) )+ { $channel = HIDDEN } ; END example "referencing other token rule values with labels" do lexer = LexerRuleLabel::Lexer.new 'a 2' lexer.next_token lexer.token_text.should == ' ' end end