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