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
|