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