Home | History | Annotate | Download | only in debug
      1 #!/usr/bin/ruby
      2 # encoding: utf-8
      3 
      4 module ANTLR3
      5 module Debug
      6 =begin rdoc ANTLR3::Debug::EventListener
      7 
      8 A listener that simply records text representations of the events.
      9 Useful for debugging the debugging facility ;)
     10 Subclasses can override the record() method (which defaults to printing to
     11 stdout) to record the events in a different way.
     12 
     13 =end
     14 class 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
     90 end # class TraceEventListener
     91 end # module Debug
     92 end # module ANTLR3
     93