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