#!/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