aboutsummaryrefslogtreecommitdiff
path: root/runtime/Ruby/lib/antlr3/tree/debug.rb
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/Ruby/lib/antlr3/tree/debug.rb')
-rw-r--r--runtime/Ruby/lib/antlr3/tree/debug.rb164
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