1#!/usr/bin/ruby 2# encoding: utf-8 3 4module ANTLR3 5module Debug 6=begin rdoc ANTLR3::Debug::EventListener 7 8A listener that simply records text representations of the events. 9Useful for debugging the debugging facility ;) 10Subclasses can override the record() method (which defaults to printing to 11stdout) to record the events in a different way. 12 13=end 14class TraceEventListener 15 include EventListener 16 17 def initialize( adaptor = nil, device = $stderr ) 18 super() 19 @device = device 20 @adaptor = adaptor ||= ANTLR3::AST::CommonTreeAdaptor.new 21 end 22 23 def record( event_message, *interpolation_arguments ) 24 event_message = event_message.to_s << "\n" 25 @device.printf( event_message, *interpolation_arguments ) 26 end 27 28 def enter_alternative( alt_number ) 29 record "(%s): number=%s", __method__, alt_number 30 end 31 32 def enter_rule( grammar_file_name, rule_name ) 33 record "(%s): rule=%s", __method__, rule_name 34 end 35 36 def exit_rule( grammar_file_name, rule_name ) 37 record "(%s): rule=%s", __method__, rule_name 38 end 39 40 def enter_subrule( decision_number ) 41 record "(%s): decision=%s", __method__, decision_number 42 end 43 44 def exit_subrule( decision_number ) 45 record "(%s): decision=%s", __method__, decision_number 46 end 47 48 def location( line, position ) 49 record '(%s): line=%s position=%s', __method__, line, position 50 end 51 52 def consume_node( tree ) 53 record '(%s) unique_id=%s text=%p type=%s[%s]', __method__, @adaptor.unique_id( tree ), 54 @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 55 end 56 57 def look( i, tree ) 58 record '(%s): k=%s unique_id=%s text=%p type=%s[%s]', __method__, i, @adaptor.unique_id( tree ), 59 @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 60 end 61 62 def flat_node( tree ) 63 record '(%s): unique_id=%s', __method__, @adaptor.unique_id( tree ) 64 end 65 66 def create_node( tree, token = nil ) 67 unless token 68 record '(%s): unique_id=%s text=%p type=%s[%s]', __method__, @adaptor.unique_id( tree ), 69 @adaptor.text_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 70 else 71 record '(%s): unique_id=%s type=%s[%s]', __method__, @adaptor.unique_id( tree ), 72 @adaptor.type_of( tree ), @adaptor.type_name( tree ), @adaptor.type_of( tree ) 73 end 74 end 75 76 def become_root( new_root, old_root ) 77 record '(%s): old_root_id=%s new_root_id=%s', __method__, @adaptor.unique_id( new_root ), 78 @adaptor.unique_id( old_root ) 79 end 80 81 def add_child( root, child ) 82 record '(%s): root_id=%s child_id=%s', __method__, @adaptor.unique_id( root ), 83 @adaptor.unique_id( child ) 84 end 85 86 def set_token_boundaries( tree, token_start_index, token_stop_index ) 87 record '(%s): unique_id=%s index_range=%s..%s', __method__, @adaptor.unique_id( tree ), 88 token_start_index, token_stop_index 89 end 90end # class TraceEventListener 91end # module Debug 92end # module ANTLR3 93