1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestEmptyAlternative < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar EmptyAlt;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      : NAME 
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ( WS+ NAME
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        )
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        EOF
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NUMBER: ('0'..'9')+;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' '+;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rule with empty alternative" do
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = EmptyAlt::Lexer.new( 'foo' )
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = EmptyAlt::Parser.new lexer
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    events = parser.r
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestSubrulePrediction < ANTLR3::Test::Functional
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar Subrule;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      language = Ruby;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @parser::members {
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def emit_error_message(msg)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # do nothing
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def report_error(error)
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise error
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a: 'BEGIN' b WS+ 'END';
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    b: ( WS+ 'A' )+;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' ';
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "make correct predictions involving subrules" do
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Subrule::Lexer.new( 'BEGIN A END' )
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = Subrule::Parser.new lexer
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    events = parser.a
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestSpecialStates < ANTLR3::Test::Functional
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar SpecialStates;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options { language = Ruby; }
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @init { @cond = true }
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      attr_accessor :cond
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def recover(re)
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise re
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      : ( { @cond }? NAME
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | {!@cond }? NAME WS+ NAME
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        )
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ( WS+ NAME )?
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        EOF
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NUMBER: ('0'..'9')+;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: ' '+;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "parsing 'foo'" do
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = SpecialStates::Lexer.new 'foo'
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = SpecialStates::Parser.new lexer
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.r
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "parsing 'foo name1'"  do
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = SpecialStates::Lexer.new 'foo name1'
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = SpecialStates::Parser.new lexer
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.r
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "parsing 'bar name1'"  do
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = SpecialStates::Lexer.new 'bar name1'
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = SpecialStates::Parser.new lexer
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.cond = false
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.r
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "parsing 'bar name1 name2'" do
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = SpecialStates::Lexer.new 'bar name1 name2'
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = SpecialStates::Parser.new lexer
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.cond = false
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.r
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestDFABug < ANTLR3::Test::Functional
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar DFABug;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language = Ruby;
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output = AST;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // this rule used to generate an infinite loop in DFA.predict
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options { backtrack=true; }
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : (modifier+ INT)=> modifier+ expression
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | modifier+ statement
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expression
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : INT '+' INT
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    statement
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'fooze'
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 'fooze2'
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    modifier
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : 'public'
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | 'private'
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z' + ;
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9' +;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "testing for DFA-based decision bug" do
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = DFABug::Lexer.new 'public fooze'
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = DFABug::Parser.new lexer
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser.r
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
165