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