@@ -28,9 +28,9 @@ def next_token
28
28
@lexer . next_token
29
29
end
30
30
31
- def s ( * parts )
32
- sexp = Sexp . new ( parts )
33
- sexp . line = @lexer . line
31
+ def s ( type , children = [ ] , source = [ ] )
32
+ sexp = Sexp . new ( [ type ] . concat ( children ) )
33
+ sexp . loc = source
34
34
sexp
35
35
end
36
36
@@ -51,8 +51,76 @@ def on_error(t, val, vstack)
51
51
raise "parse error on value #{ val . inspect } (#{ token_to_str ( t ) || '?' } ) :#{ @file } :#{ lexer . line } "
52
52
end
53
53
54
+ def value ( tok )
55
+ tok [ 0 ]
56
+ end
57
+
58
+ def source ( tok )
59
+ tok [ 1 ]
60
+ end
61
+
62
+ def new_nil ( tok )
63
+ s ( :nil , [ ] , source ( tok ) )
64
+ end
65
+
66
+ def new_self ( tok )
67
+ s ( :self , [ ] , source ( tok ) )
68
+ end
69
+
70
+ def new_true ( tok )
71
+ s ( :true , [ ] , source ( tok ) )
72
+ end
73
+
74
+ def new_false ( tok )
75
+ s ( :false , [ ] , source ( tok ) )
76
+ end
77
+
78
+ def new___FILE__ ( tok )
79
+ s ( :str , [ self . file ] , source ( tok ) )
80
+ end
81
+
82
+ def new___LINE__ ( tok )
83
+ s ( :int , [ lexer . line ] , source ( tok ) )
84
+ end
85
+
86
+ def new_ident ( tok )
87
+ s ( :identifier , [ value ( tok ) . to_sym ] , source ( tok ) )
88
+ end
89
+
90
+ def new_int ( tok )
91
+ s ( :int , [ value ( tok ) ] , source ( tok ) )
92
+ end
93
+
94
+ def new_float ( tok )
95
+ s ( :float , [ value ( tok ) ] , source ( tok ) )
96
+ end
97
+
98
+ def new_ivar ( tok )
99
+ s ( :ivar , [ value ( tok ) . to_sym ] , source ( tok ) )
100
+ end
101
+
102
+ def new_gvar ( tok )
103
+ s ( :gvar , [ value ( tok ) . to_sym ] , source ( tok ) )
104
+ end
105
+
106
+ def new_cvar ( tok )
107
+ s ( :cvar , [ value ( tok ) . to_sym ] , source ( tok ) )
108
+ end
109
+
110
+ def new_const ( tok )
111
+ s ( :const , [ value ( tok ) . to_sym ] , source ( tok ) )
112
+ end
113
+
114
+ def new_sym ( tok )
115
+ s ( :sym , [ value ( tok ) . to_sym ] , source ( tok ) )
116
+ end
117
+
118
+ def new_alias ( kw , new , old )
119
+ s ( :alias , [ new , old ] , source ( kw ) )
120
+ end
121
+
54
122
def new_block ( stmt = nil )
55
- s = s ( :block )
123
+ s = s ( :block , [ ] , nil )
56
124
s << stmt if stmt
57
125
s
58
126
end
@@ -63,9 +131,9 @@ def new_compstmt(block)
63
131
elsif block . size == 2
64
132
block [ 1 ]
65
133
else
66
- block . line = block [ 1 ] . line
67
134
block
68
135
end
136
+ block
69
137
end
70
138
71
139
def new_body ( compstmt , res , els , ens )
@@ -91,8 +159,8 @@ def new_def(line, recv, name, args, body)
91
159
s
92
160
end
93
161
94
- def new_class ( path , sup , body )
95
- s ( :class , path , sup , body )
162
+ def new_class ( start , path , sup , body , endt )
163
+ s ( :class , [ path , sup , body ] , source ( start ) )
96
164
end
97
165
98
166
def new_sclass ( expr , body )
@@ -110,11 +178,25 @@ def new_iter(args, body)
110
178
s
111
179
end
112
180
113
- def new_if ( expr , stmt , tail )
114
- s = s ( :if , expr , stmt , tail )
115
- s . line = expr . line
116
- s . end_line = @lexer . line
117
- s
181
+ def new_if ( if_tok , expr , stmt , tail )
182
+ s ( :if , [ expr , stmt , tail ] , source ( if_tok ) )
183
+ end
184
+
185
+ def new_while ( kw , test , body )
186
+ s ( :while , [ test , body ] , source ( kw ) )
187
+ end
188
+
189
+ def new_until ( kw , test , body )
190
+ s ( :until , [ test , body ] , source ( kw ) )
191
+ end
192
+
193
+ def new_rescue_mod ( kw , expr , resc )
194
+ s ( :rescue_mod , [ expr , resc ] , source ( kw ) )
195
+ end
196
+
197
+ def new_array ( start , args , finish )
198
+ args ||= [ ]
199
+ s ( :array , args , source ( start ) )
118
200
end
119
201
120
202
def new_args ( norm , opt , rest , block )
@@ -192,26 +274,8 @@ def new_block_args(norm, opt, rest, block)
192
274
end
193
275
end
194
276
195
- def new_call ( recv , meth , args = nil )
196
- call = s ( :call , recv , meth )
197
- args = s ( :arglist ) unless args
198
- args . type = :arglist if args . type == :array
199
- call << args
200
-
201
- if recv
202
- call . line = recv . line
203
- elsif args [ 1 ]
204
- call . line = args [ 1 ] . line
205
- end
206
-
207
- # fix arglist spilling over into next line if no args
208
- if args . length == 1
209
- args . line = call . line
210
- else
211
- args . line = args [ 1 ] . line
212
- end
213
-
214
- call
277
+ def new_call ( recv , meth , args = [ ] )
278
+ s ( :call , [ recv , value ( meth ) . to_sym , s ( :arglist , args ) ] , source ( meth ) )
215
279
end
216
280
217
281
def add_block_pass ( arglist , block )
@@ -237,7 +301,7 @@ def new_op_asgn(op, lhs, rhs)
237
301
result
238
302
end
239
303
240
- def new_assign ( lhs , rhs )
304
+ def new_assign ( lhs , tok , rhs )
241
305
case lhs . type
242
306
when :iasgn , :cdecl , :lasgn , :gasgn , :cvdecl , :nth_ref
243
307
lhs << rhs
@@ -312,9 +376,9 @@ def new_var_ref(ref)
312
376
ref
313
377
when :identifier
314
378
if scope . has_local? ref [ 1 ]
315
- s ( :lvar , ref [ 1 ] )
379
+ s ( :lvar , [ ref [ 1 ] ] )
316
380
else
317
- s ( :call , nil , ref [ 1 ] , s ( :arglist ) )
381
+ s ( :call , [ nil , ref [ 1 ] , s ( :arglist ) ] )
318
382
end
319
383
else
320
384
raise "Bad var_ref type: #{ ref . type } "
0 commit comments