aboutsummaryrefslogtreecommitdiff
path: root/runtime/Ruby/lib/antlr3/tree/debug.rb
blob: 7ead7c9a52ec4ef566c6be45ef59c67447d41e9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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