| #!/usr/bin/ruby |
| # encoding: utf-8 |
| |
| require 'antlr3/test/functional' |
| |
| class TestParameters < ANTLR3::Test::Functional |
| |
| inline_grammar( <<-'END' ) |
| grammar Parameters; |
| 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[arg1, arg2] returns [l] |
| : A+ EOF |
| { |
| l = [$arg1, $arg2] |
| $arg1 = "gnarz" |
| } |
| ; |
| |
| A: 'a'..'z'; |
| |
| WS: ' '+ { $channel = HIDDEN }; |
| END |
| |
| example "rules with method parameters" do |
| lexer = Parameters::Lexer.new( 'a a a' ) |
| parser = Parameters::Parser.new lexer |
| r = parser.a( 'foo', 'bar' ) |
| r.should == %w(foo bar) |
| end |
| |
| end |
| |
| |
| class TestMultipleReturnValues < ANTLR3::Test::Functional |
| |
| inline_grammar( <<-'END' ) |
| grammar MultipleReturnValues; |
| 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 [foo, bar]: A |
| { |
| $foo = "foo"; |
| $bar = "bar"; |
| } |
| ; |
| |
| A: 'a'..'z'; |
| |
| WS : |
| ( ' ' |
| | '\t' |
| | ( '\n' |
| | '\r\n' |
| | '\r' |
| ) |
| )+ |
| { $channel = HIDDEN } |
| ; |
| END |
| |
| example "multi-valued rule return structures" do |
| lexer = MultipleReturnValues::Lexer.new( ' a' ) |
| parser = MultipleReturnValues::Parser.new lexer |
| ret = parser.a |
| |
| ret.foo.should == 'foo' |
| ret.bar.should == 'bar' |
| end |
| |
| end |
| |
| |
| class TestRuleVisibility < ANTLR3::Test::Functional |
| inline_grammar( <<-'END' ) |
| grammar RuleVisibility; |
| options { language=Ruby; } |
| |
| public a: ID; |
| private b: DIGIT; |
| protected c: ID DIGIT; |
| |
| DIGIT: ('0'..'9')+; |
| ID: ('a'..'z' | 'A'..'Z')+; |
| WS: (' ' | '\t' | '\n' | '\r' | '\f')+ { $channel=HIDDEN; }; |
| END |
| |
| example 'using visibility modifiers on rules' do |
| mname = RUBY_VERSION =~ /^1\.9/ ? proc { | n | n.to_sym } : proc { | n | n.to_s } |
| |
| RuleVisibility::Parser.public_instance_methods.should include( mname[ 'a' ] ) |
| RuleVisibility::Parser.protected_instance_methods.should include( mname[ 'c' ] ) |
| RuleVisibility::Parser.private_instance_methods.should include( mname[ 'b' ] ) |
| end |
| |
| end |