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