You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.5 KiB
165 lines
3.5 KiB
#!/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
|