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
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
|