1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ANTLR3 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Debug 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Debug::EventListener 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA listener that simply records text representations of the events. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverUseful for debugging the debugging facility ;) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSubclasses can override the record() method (which defaults to printing to 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstdout) to record the events in a different way. 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TraceEventListener 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver include EventListener 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def initialize( adaptor = nil, device = $stderr ) 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super() 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @device = device 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor = adaptor ||= ANTLR3::AST::CommonTreeAdaptor.new 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def record( event_message, *interpolation_arguments ) 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver event_message = event_message.to_s << "\n" 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @device.printf( event_message, *interpolation_arguments ) 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def enter_alternative( alt_number ) 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record "(%s): number=%s", __method__, alt_number 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def enter_rule( grammar_file_name, rule_name ) 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record "(%s): rule=%s", __method__, rule_name 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def exit_rule( grammar_file_name, rule_name ) 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record "(%s): rule=%s", __method__, rule_name 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def enter_subrule( decision_number ) 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record "(%s): decision=%s", __method__, decision_number 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def exit_subrule( decision_number ) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record "(%s): decision=%s", __method__, decision_number 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def location( line, position ) 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): line=%s position=%s', __method__, line, position 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def consume_node( tree ) 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s) unique_id=%s text=%p type=%s[%s]', __method__, @adaptor.unique_id( tree ), 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def look( i, tree ) 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): k=%s unique_id=%s text=%p type=%s[%s]', __method__, i, @adaptor.unique_id( tree ), 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def flat_node( tree ) 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): unique_id=%s', __method__, @adaptor.unique_id( tree ) 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def create_node( tree, token = nil ) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unless token 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): unique_id=%s text=%p type=%s[%s]', __method__, @adaptor.unique_id( tree ), 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): unique_id=%s type=%s[%s]', __method__, @adaptor.unique_id( tree ), 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.type_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def become_root( new_root, old_root ) 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): old_root_id=%s new_root_id=%s', __method__, @adaptor.unique_id( new_root ), 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.unique_id( old_root ) 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def add_child( root, child ) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): root_id=%s child_id=%s', __method__, @adaptor.unique_id( root ), 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @adaptor.unique_id( child ) 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def set_token_boundaries( tree, token_start_index, token_stop_index ) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver record '(%s): unique_id=%s index_range=%s..%s', __method__, @adaptor.unique_id( tree ), 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token_start_index, token_stop_index 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # class TraceEventListener 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # module Debug 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # module ANTLR3 93