1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'fileutils'
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#require 'antlr3/test/diff'
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass ANTLRDebugger < Thread
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  self.abort_on_exception = true
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :events, :success, :port
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include Timeout
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( port )
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @events = []
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @success = false
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @port = port
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super do
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      timeout( 2 ) do
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @socket = TCPSocket.open( 'localhost', @port )
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          #Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          #@socket.connect( Socket.pack_sockaddr_in(@port, '127.0.0.1') )
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rescue Errno::ECONNREFUSED => error
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if $VERBOSE
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $stderr.printf( 
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "%s:%s received connection refuse error: %p\n",
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                __FILE__, __LINE__, error
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              )
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $stderr.puts( "sleeping for 0.1 seconds before retrying" )
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          sleep( 0.01 )
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          retry
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @socket.readline.strip.should == 'ANTLR 2'
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @socket.readline.strip.start_with?( 'grammar "' ).should == true
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ack
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      loop do
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        event = @socket.readline.strip
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @events << event.split( "\t" )
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ack
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        break if event == 'terminate'
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @socket.close
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @success = true
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def ack
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @socket.write( "ACK\n" )
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @socket.flush
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # ANTLRDebugger
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestDebugGrammars < ANTLR3::Test::Functional
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  compile_options :debug => true
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  #include ANTLR3::Test::Diff
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def parse( grammar, rule, input, options = {} )
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar = inline_grammar( grammar )
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar.compile( self.class.compile_options )
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @grammar_path = File.expand_path( @grammar.path )
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for output_file in @grammar.target_files
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      self.class.import( output_file )
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module = self.class.const_get( @grammar.name )
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    listener = options[ :listener ] or debugger = ANTLRDebugger.new( port = 49100 )
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      lexer = grammar_module::Lexer.new( input )
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tokens = ANTLR3::CommonTokenStream.new( lexer )
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options[ :debug_listener ] = listener
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser = grammar_module::Parser.new( tokens, options )
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      parser.send( rule )
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ensure
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if listener.nil?
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        debugger.join
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return( debugger )
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'basic debug-mode parser using a RecordEventListener' do
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar BasicParser;                      // line 1
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;}                  // line 2
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID EOF;                               // line 3
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;                          // line 4
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    listener = ANTLR3::Debug::RecordEventListener.new
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parse( grammar, :a, 'a', :listener => listener )
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lt_events, found = listener.events.partition { |event| event.start_with?( "(look): " ) }
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lt_events.should_not be_empty
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ "(enter_rule): rule=a",
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(location): line=3 position=1",
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(enter_alternative): number=1",
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(location): line=3 position=5",
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(location): line=3 position=8",
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(location): line=3 position=11",
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "(exit_rule): rule=a" ]
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    found.should == expected
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser using a socket proxy to transmit events' do
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SocketProxy;                   // line 1
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby;}               // line 2
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID EOF;                           // line 3
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;                       // line 4
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, 'a' )
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'enter_rule', @grammar_path, 'a' ],
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'location', '3', '1' ],
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'enter_alternative', '1' ],
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'location', '3', '5' ],
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'look', '1', '0', '4', 'default', '1', '0', '"a"' ],
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'look', '1', '0', '4', 'default', '1', '0', '"a"' ],
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'consume_token', '0', '4', 'default', '1', '0', '"a"' ],
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'location', '3', '8' ],
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'look', '1', '-1', '-1', 'default', '0', '-1', 'nil' ],
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'look', '1', '-1', '-1', 'default', '0', '-1', 'nil' ],
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'consume_token', '-1', '-1', 'default', '0', '-1', 'nil' ],
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'location', '3', '11' ],
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'exit_rule', @grammar_path, 'a' ],
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ 'terminate' ]
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by recognition errors' do
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RecognitionError;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID EOF;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a b" )
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "1", "5", "hidden", "1", "1", '" "' ],
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "4", "default", "1", "2", "\"b\"" ],
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "4", "default", "1", "2", "\"b\"" ],
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "2", "-1", "-1", "default", "0", "-1", "nil" ],
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "4", "default", "1", "2", "\"b\"" ],
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "begin_resync" ],
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "2", "4", "default", "1", "2", "\"b\"" ],
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "end_resync" ],
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "recognition_exception", "ANTLR3::Error::UnwantedToken", "2", "1", "2" ],
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "11" ],
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by semantic predicate evaluation' do
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SemPred;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : {true}? ID EOF;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a" )
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "semantic_predicate", "true", '"true"' ],
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "13" ],
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "16" ],
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "19" ],
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by recognizing a (...)+ block' do
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar PositiveClosureBlock;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ( ID | INT )+ EOF;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a 1 b c 3" )
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "1", "6", "hidden", "1", "1", '" "' ],
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "1" ],
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "2", "5", "default", "1", "2", "\"1\"" ],
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "3", "6", "hidden", "1", "3", '" "' ],
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "4", "4", "default", "1", "4", "\"b\"" ],
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "4", "4", "default", "1", "4", "\"b\"" ],
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "4", "4", "default", "1", "4", "\"b\"" ],
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "5", "6", "hidden", "1", "5", '" "' ],
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "6", "4", "default", "1", "6", "\"c\"" ],
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "6", "4", "default", "1", "6", "\"c\"" ],
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "6", "4", "default", "1", "6", "\"c\"" ],
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "7", "6", "hidden", "1", "7", '" "' ],
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "8", "5", "default", "1", "8", "\"3\"" ],
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "8", "5", "default", "1", "8", "\"3\"" ],
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "8", "5", "default", "1", "8", "\"3\"" ],
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "1" ],
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "22" ],
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "25" ],
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by recognizing a (...)* block' do
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ClosureBlock;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ( ID | INT )* EOF;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a 1 b c 3" )
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "1", "6", "hidden", "1", "1", '" "' ],
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "1" ],
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "2", "5", "default", "1", "2", "\"1\"" ],
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "3", "6", "hidden", "1", "3", '" "' ],
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "4", "4", "default", "1", "4", "\"b\"" ],
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "4", "4", "default", "1", "4", "\"b\"" ],
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "4", "4", "default", "1", "4", "\"b\"" ],
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "5", "6", "hidden", "1", "5", '" "' ],
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "6", "4", "default", "1", "6", "\"c\"" ],
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "6", "4", "default", "1", "6", "\"c\"" ],
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "6", "4", "default", "1", "6", "\"c\"" ],
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "7", "6", "hidden", "1", "7", '" "' ],
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "8", "5", "default", "1", "8", "\"3\"" ],
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "8", "5", "default", "1", "8", "\"3\"" ],
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "8", "5", "default", "1", "8", "\"3\"" ],
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "1" ],
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "22" ],
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "25" ],
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by a mismatched set error' do
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar MismatchedSetError;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ( ID | INT ) EOF;
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a" )
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "recognition_exception", "ANTLR3::Error::MismatchedSet", "1", "0", "-1" ],
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "recognition_exception", "ANTLR3::Error::MismatchedSet", "1", "0", "-1" ],
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "begin_resync" ],
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "end_resync" ],
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "24" ],
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser block-location events for subrules' do
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar Block;
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ( b | c ) EOF;
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID;
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT;
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a 1" )
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "1", "6", "hidden", "1", "1", '" "' ],
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "1" ],
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "2" ],
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "14" ],
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "c" ],
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "1" ],
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "5" ],
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "5", "default", "1", "2", "\"1\"" ],
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "2", "5", "default", "1", "2", "\"1\"" ],
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "8" ],
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "c" ],
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "1" ],
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "18" ],
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "21" ],
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser events triggered by a no viable alternative error' do
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NoViableAlt;
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID ( b | c ) EOF;
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID;
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT;
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      BANG : '!' ;
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a !" )
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_hidden_token", "1", "7", "hidden", "1", "1", '" "' ],
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "8" ],
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "1" ],
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "6", "default", "1", "2", "\"!\"" ],
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "6", "default", "1", "2", "\"!\"" ],
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "recognition_exception", "ANTLR3::Error::NoViableAlternative", "2", "1", "2" ],
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "1" ],
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "recognition_exception", "ANTLR3::Error::NoViableAlternative", "2", "1", "2" ],
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "begin_resync" ],
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "2", "6", "default", "1", "2", "\"!\"" ],
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "2", "6", "default", "1", "2", "\"!\"" ],
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "end_resync" ],
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "21" ],
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser block-location events triggered by rules' do
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RuleBlock;
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b | c;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID;
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : INT;
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "1" )
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "5", "default", "1", "0", "\"1\"" ],
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "2" ],
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "9" ],
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "c" ],
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "1" ],
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "5" ],
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "5", "default", "1", "0", "\"1\"" ],
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "5", "default", "1", "0", "\"1\"" ],
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "5", "default", "1", "0", "\"1\"" ],
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "8" ],
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "c" ],
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "10" ],
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser block-location events triggered by single-alternative rules' do
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar RuleBlockSingleAlt;
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b;
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a" )
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "b" ],
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "1" ],
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "5" ],
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "7" ],
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "b" ],
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "6" ],
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser block-location events triggered by single-alternative subrules' do
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar BlockSingleAlt;
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ( b );
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID;
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a" )
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "7" ],
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "b" ],
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "1" ],
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "5" ],
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "4", "7" ],
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "b" ],
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "10" ],
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode parser block-location events triggered by invoking a cyclic DFA for prediction' do
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q<
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar DFA;
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options { language=Ruby; }
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ( b | c ) EOF;
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID* INT;
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : ID+ BANG;
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      BANG : '!';
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    >
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger = parse( grammar, :a, "a!" )
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.success.should be_true
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected = [ 
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "a" ],
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "1" ],
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "5" ],
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "1" ],
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "1" ],
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "mark", "0" ],
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "1", "6", "default", "1", "1", "\"!\"" ],
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "1", "6", "default", "1", "1", "\"!\"" ],
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "rewind", "0" ],
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "1" ],
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "2" ],
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "11" ],
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_rule", @grammar_path, "c" ],
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "1" ],
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "5" ],
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_subrule", "3" ],
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "3" ],
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "3" ],
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_alternative", "1" ],
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "5" ],
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "0", "4", "default", "1", "0", "\"a\"" ],
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "0", "4", "default", "1", "0", "\"a\"" ],
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "enter_decision", "3" ],
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "1", "6", "default", "1", "1", "\"!\"" ],
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_decision", "3" ],
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "3" ],
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "9" ],
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "1", "6", "default", "1", "1", "\"!\"" ],
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "1", "6", "default", "1", "1", "\"!\"" ],
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "1", "6", "default", "1", "1", "\"!\"" ],
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "5", "13" ],
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "c" ],
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_subrule", "1" ],
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "15" ],
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "look", "1", "-1", "-1", "default", "0", "-1", "nil" ],
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "consume_token", "-1", "-1", "default", "0", "-1", "nil" ],
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "location", "3", "18" ],
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "exit_rule", @grammar_path, "a" ],
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      [ "terminate" ]
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    debugger.events.should == expected
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'debug-mode AST-building parser events' do
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar = %q/
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar BasicAST;
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ( b | c ) EOF!;
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID* INT -> ^(INT ID*);
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : ID+ BANG -> ^(BANG ID+);
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+ ;
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      BANG : '!';
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    listener = ANTLR3::Debug::RecordEventListener.new
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parse( grammar, :a, "a!", :listener => listener )
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
689