blob: 7ead7c9a52ec4ef566c6be45ef59c67447d41e9f [file] [log] [blame]
#!/usr/bin/ruby
# encoding: utf-8
module ANTLR3
module Debug
=begin rdoc ANTLR3::Debug::TreeAdaptor
Adds debugging event hooks to TreeAdaptor objects
=end
module TreeAdaptor
def self.wrap( adaptor, debug_listener = nil )
adaptor.extend( self )
adaptor.debug_listener = debug_listener
return( adaptor )
end
attr_accessor :debug_listener
def create_with_payload( payload )
node = super
@debug_listener.create_node( node, payload )
return node
end
def create_from_token( token_type, from_token, text = nil )
node = super
@debug_listener.create_node( node )
return node
end
def create_from_type( token_type, text )
node = super
@debug_listener.create_node( node )
return node
end
def create_error_node( input, start, stop, exc )
node = super
node.nil? or @debug_listener.error_node( node )
return node
end
def copy_tree( tree )
t = super
simulate_tree_construction( t )
return t
end
def simulate_tree_construction( tree )
@debug_listener.create_node( tree )
child_count( tree ).times do |i|
child = self.child_of( tree, i )
simulate_tree_construction( child )
@debug_listener.add_child( tree, child )
end
end
def copy_node( tree_node )
duplicate = super
@debug_listener.create_node duplicate
return duplicate
end
def create_flat_list
node = super
@debug_listener.flat_node( node )
return node
end
def add_child( tree, child )
case child
when Token
node = create_with_payload( child )
add_child( tree, node )
else
tree.nil? || child.nil? and return
super( tree, child )
@debug_listener.add_child( tree, child )
end
end
def become_root( new_root, old_root )
case new_root
when Token
n = create_with_payload( new_root )
super( n, old_root )
else
n = super( new_root, old_root )
end
@debug_listener.become_root( new_root, old_root )
return n
end
def set_token_boundaries( tree, start_token, stop_token )
super( tree, start_token, stop_token )
return unless tree && start_token && stop_token
@debug_listener.set_token_boundaries( tree,
start_token.token_index, stop_token.token_index )
end
end
=begin rdoc ANTLR3::Debug::TreeNodeStream
A module that wraps token stream methods with debugging event code. A debuggable
parser will <tt>extend</tt> its input stream with this module if the stream is
not already a Debug::TreeNodeStream.
=end
class TreeNodeStream
def self.wrap( stream, debug_listener = nil )
stream.extend( self )
stream.debug_listener ||= debug_listener
end
attr_accessor :debug_listener
def consume
node = @input >> 1
super
@debug_listener.consume_node( node )
end
def look( i = 1 )
node = super
id = @adaptor.unique_id( node )
text = @adaptor.text_of( node )
type = @adaptor.type_of( node )
@debug_listener.look( i, node )
return( node )
end
def peek( i = 1 )
node = self >> 1
id = @adaptor.unique_id( node )
text = @adaptor.text_of( node )
type = @adaptor.type_of( node )
@debug_listener.look( i, node )
return( type )
end
def mark
@last_marker = super
@debug_listener.mark( @last_marker )
return( @last_marker )
end
def rewind( marker = nil )
@debug_listener.rewind( marker )
super( marker || @last_marker )
end
=begin This actually differs with reset in CommonTreeNodeStream -- why is this one blank?
def reset
# do nothing
end
=end
end
end
end