1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ANTLR3
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Debug
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Debug::EventHub
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA special event listener that intercepts debug events and forwards them to other
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdebug event listners. As debug-mode recognizers are able to send event
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinformation to only one listener, EventHubs provide a simple solution in
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversituations where multiple event listners are desired.
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass EventHub
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include ANTLR3::Debug::EventListener
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_reader :listeners
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def initialize( *listeners )
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @listeners = [ listeners ].flatten!
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @listeners.compact!
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def add( *listeners )
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @listeners.push( *listeners )
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def add_child( root, child )
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.add_child( root, child )
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def backtrack( level )
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.backtrack( level )
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def become_root( new_root, old_root )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.become_root( new_root, old_root )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def begin_backtrack( level )
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.begin_backtrack( level )
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def begin_resync()
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.begin_resync()
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def commence()
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.commence()
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def consume_hidden_token( tree )
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.consume_hidden_token( tree )
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def consume_node( tree )
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.consume_node( tree )
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def consume_token( tree )
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.consume_token( tree )
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_node( node, token )
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.create_node( node, token )
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def end_backtrack( level, successful )
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.end_backtrack( level, successful )
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def end_resync()
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.end_resync()
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def enter_alternative( alt )
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.enter_alternative( alt )
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def enter_decision( decision_number )
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.enter_decision( decision_number )
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def enter_rule( grammar_file_name, rule_name )
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.enter_rule( grammar_file_name, rule_name )
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def enter_sub_rule( decision_number )
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.enter_sub_rule( decision_number )
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def error_node( tree )
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.error_node( tree )
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def exit_decision( decision_number )
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.exit_decision( decision_number )
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def exit_rule( grammar_file_name, rule_name )
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.exit_rule( grammar_file_name, rule_name )
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def exit_sub_rule( decision_number )
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.exit_sub_rule( decision_number )
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def flat_node( tree )
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.flat_node( tree )
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def location( line, position )
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.location( line, position )
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def look( i, tree )
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.look( i, tree )
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def mark( marker )
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.mark( marker )
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def recognition_exception( exception )
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.recognition_exception( exception )
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def resync()
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.resync()
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def rewind( marker )
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.rewind( marker )
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def semantic_predicate( result, predicate )
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.semantic_predicate( result, predicate )
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def set_token_boundaries( tree, token_start_index, token_stop_index )
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.set_token_boundaries( tree, token_start_index, token_stop_index )
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def terminate()
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for listener in @listeners
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      listener.terminate()
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
211