aboutsummaryrefslogtreecommitdiff
path: root/runtime/Ruby/test/functional/parser/properties.rb
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/Ruby/test/functional/parser/properties.rb')
-rw-r--r--runtime/Ruby/test/functional/parser/properties.rb242
1 files changed, 242 insertions, 0 deletions
diff --git a/runtime/Ruby/test/functional/parser/properties.rb b/runtime/Ruby/test/functional/parser/properties.rb
new file mode 100644
index 0000000..3dbb75a
--- /dev/null
+++ b/runtime/Ruby/test/functional/parser/properties.rb
@@ -0,0 +1,242 @@
+#!/usr/bin/ruby
+# encoding: utf-8
+
+require 'antlr3/test/functional'
+
+class TestRulePropertyReference < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar RuleProperties;
+ options { language = Ruby; }
+
+ @parser::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ @lexer::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ a returns [bla]
+ @after { $bla = [$start, $stop, $text] }
+ : A+
+ ;
+
+ A: 'a'..'z';
+
+ WS: ' '+ { $channel = HIDDEN };
+ END
+
+ example "accessing rule properties" do
+ lexer = RuleProperties::Lexer.new( ' a a a a ' )
+ parser = RuleProperties::Parser.new lexer
+ start, stop, text = parser.a.bla
+
+ start.index.should == 1
+ stop.index.should == 7
+ text.should == 'a a a a'
+ end
+
+
+end
+
+class TestLabels < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar Labels;
+ options { language = Ruby; }
+
+ @parser::members {
+ def recover(e)
+ raise e
+ end
+ }
+
+ @lexer::members {
+ def recover(e)
+ raise e
+ end
+ }
+
+ a returns [l]
+ : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF
+ { $l = [$ids, $w] }
+ ;
+
+ A: 'a'..'z';
+ B: '0'..'9';
+ C: a='A' { $a };
+ D: a='FOOBAR' { $a };
+ E: 'GNU' a=. { $a };
+ F: 'BLARZ' a=EOF { $a };
+
+ WS: ' '+ { $channel = HIDDEN };
+ END
+
+ example "parsing 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'" do
+ lexer = Labels::Lexer.new 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'
+ parser = Labels::Parser.new lexer
+ ids, w = parser.a
+
+ ids.should have( 6 ).things
+ ids[ 0 ].text.should == 'a'
+ ids[ 1 ].text.should == 'b'
+ ids[ 2 ].text.should == 'c'
+ ids[ 3 ].text.should == '1'
+ ids[ 4 ].text.should == '2'
+ ids[ 5 ].text.should == 'A'
+
+ w.text.should == 'GNU1'
+ end
+
+
+end
+
+
+class TestTokenLabelReference < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar TokenLabels;
+ options {
+ language = Ruby;
+ }
+
+ @parser::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ @lexer::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ a returns [$tk]
+ : t=A
+ {
+ $tk = [
+ $t.text,
+ $t.type,
+ $t.name,
+ $t.line,
+ $t.pos,
+ $t.index,
+ $t.channel
+ ]
+ }
+ ;
+
+ A: 'a'..'z';
+
+ WS :
+ ( ' '
+ | '\t'
+ | ( '\n'
+ | '\r\n'
+ | '\r'
+ )
+ )+
+ { $channel = HIDDEN }
+ ;
+ END
+
+ example "accessing tokens with labels" do
+ lexer = TokenLabels::Lexer.new( ' a' )
+ parser = TokenLabels::Parser.new lexer
+ tk = parser.a
+ tk.should == [
+ 'a', TokenLabels::TokenData::A, 'A',
+ 1, 3, 1, :default
+ ]
+ end
+
+
+end
+
+class TestRuleLabelReference < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar RuleLabelReference;
+ options {language = Ruby;}
+
+ @parser::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ @lexer::members {
+ def emit_error_message(msg)
+ # do nothing
+ end
+ def report_error(error)
+ raise error
+ end
+ }
+
+ a returns [bla]: t=b
+ {
+ $bla = [$t.start, $t.stop, $t.text]
+ }
+ ;
+
+ b: A+;
+
+ A: 'a'..'z';
+
+ WS: ' '+ { $channel = HIDDEN };
+ END
+
+ example "referencing rule properties using rule labels" do
+ lexer = RuleLabelReference::Lexer.new( ' a a a a ' )
+ parser = RuleLabelReference::Parser.new lexer
+ start, stop, text = parser.a
+
+ start.index.should == 1
+ stop.index.should == 7
+ text.should == 'a a a a'
+ end
+
+end
+
+
+
+class TestReferenceDoesntSetChannel < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar ReferenceSetChannel;
+ options {language=Ruby;}
+ a returns [foo]: A EOF { $foo = '\%s, channel=\%p' \% [$A.text, $A.channel]; } ;
+ A : '-' WS I ;
+ I : '0'..'9'+ ;
+ WS: ' ' | '\t';
+ END
+
+ example 'verifying that a token reference does not set its channel' do
+ lexer = ReferenceSetChannel::Lexer.new( "- 34" )
+ parser = ReferenceSetChannel::Parser.new lexer
+ parser.a.should == "- 34, channel=:default"
+ end
+
+end