1#!/usr/bin/ruby
2# encoding: utf-8
3
4require 'antlr3/test/functional'
5
6class TestParameters < ANTLR3::Test::Functional
7
8  inline_grammar( <<-'END' )
9    grammar Parameters;
10    options {
11      language = Ruby;
12    }
13
14    @parser::members {
15      def emit_error_message(msg)
16        # do nothing
17      end
18      def report_error(error)
19        raise error
20      end
21    }
22
23    @lexer::members {
24      def emit_error_message(msg)
25        # do nothing
26      end
27      def report_error(error)
28        raise error
29      end
30    }
31
32    a[arg1, arg2] returns [l]
33        : A+ EOF
34            {
35                l = [$arg1, $arg2]
36                $arg1 = "gnarz"
37            }
38        ;
39
40    A: 'a'..'z';
41
42    WS: ' '+  { $channel = HIDDEN };
43  END
44
45  example "rules with method parameters" do
46    lexer = Parameters::Lexer.new( 'a a a' )
47    parser = Parameters::Parser.new lexer
48    r = parser.a( 'foo', 'bar' )
49    r.should == %w(foo bar)
50  end
51
52end
53
54
55class TestMultipleReturnValues < ANTLR3::Test::Functional
56
57  inline_grammar( <<-'END' )
58    grammar MultipleReturnValues;
59    options { language = Ruby; }
60    @parser::members {
61      def emit_error_message(msg)
62        # do nothing
63      end
64      def report_error(error)
65        raise error
66      end
67    }
68
69    @lexer::members {
70      def emit_error_message(msg)
71        # do nothing
72      end
73      def report_error(error)
74        raise error
75      end
76    }
77
78    a returns [foo, bar]: A
79            {
80                $foo = "foo";
81                $bar = "bar";
82            }
83        ;
84
85    A: 'a'..'z';
86
87    WS  :
88            (   ' '
89            |   '\t'
90            |  ( '\n'
91                |	'\r\n'
92                |	'\r'
93                )
94            )+
95            { $channel = HIDDEN }
96        ;
97  END
98
99  example "multi-valued rule return structures" do
100    lexer = MultipleReturnValues::Lexer.new( '   a' )
101    parser = MultipleReturnValues::Parser.new lexer
102    ret = parser.a
103
104    ret.foo.should == 'foo'
105    ret.bar.should == 'bar'
106  end
107
108end
109
110
111class TestRuleVisibility < ANTLR3::Test::Functional
112  inline_grammar( <<-'END' )
113    grammar RuleVisibility;
114    options { language=Ruby; }
115
116    public a: ID;
117    private b: DIGIT;
118    protected c: ID DIGIT;
119
120    DIGIT: ('0'..'9')+;
121    ID: ('a'..'z' | 'A'..'Z')+;
122    WS: (' ' | '\t' | '\n' | '\r' | '\f')+ { $channel=HIDDEN; };
123  END
124
125  example 'using visibility modifiers on rules' do
126    mname = RUBY_VERSION =~ /^1\.9/ ? proc { | n | n.to_sym } : proc { | n | n.to_s }
127
128    RuleVisibility::Parser.public_instance_methods.should include( mname[ 'a' ] )
129    RuleVisibility::Parser.protected_instance_methods.should include( mname[ 'c' ] )
130    RuleVisibility::Parser.private_instance_methods.should include( mname[ 'b' ] )
131  end
132
133end
134