diff options
Diffstat (limited to 'runtime/Ruby/lib/antlr3/tree/debug.rb')
-rw-r--r-- | runtime/Ruby/lib/antlr3/tree/debug.rb | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/runtime/Ruby/lib/antlr3/tree/debug.rb b/runtime/Ruby/lib/antlr3/tree/debug.rb new file mode 100644 index 0000000..7ead7c9 --- /dev/null +++ b/runtime/Ruby/lib/antlr3/tree/debug.rb @@ -0,0 +1,164 @@ +#!/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 |