You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.5 KiB

#!/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