Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a65bfca

Browse files
committedNov 21, 2013
Initial commit for parser tokens to store col, line info
1 parent 8ebbaa2 commit a65bfca

File tree

6 files changed

+2130
-2103
lines changed

6 files changed

+2130
-2103
lines changed
 

Diff for: ‎.travis.yml

+4
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ notifications:
1515
matrix:
1616
allow_failures:
1717
- rvm: rbx-20mode
18+
19+
branches:
20+
except:
21+
- parser_tokens

Diff for: ‎lib/opal/parser.rb

+99-35
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ def next_token
2828
@lexer.next_token
2929
end
3030

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
3434
sexp
3535
end
3636

@@ -51,8 +51,76 @@ def on_error(t, val, vstack)
5151
raise "parse error on value #{val.inspect} (#{token_to_str(t) || '?'}) :#{@file}:#{lexer.line}"
5252
end
5353

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+
54122
def new_block(stmt = nil)
55-
s = s(:block)
123+
s = s(:block, [], nil)
56124
s << stmt if stmt
57125
s
58126
end
@@ -63,9 +131,9 @@ def new_compstmt(block)
63131
elsif block.size == 2
64132
block[1]
65133
else
66-
block.line = block[1].line
67134
block
68135
end
136+
block
69137
end
70138

71139
def new_body(compstmt, res, els, ens)
@@ -91,8 +159,8 @@ def new_def(line, recv, name, args, body)
91159
s
92160
end
93161

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))
96164
end
97165

98166
def new_sclass(expr, body)
@@ -110,11 +178,25 @@ def new_iter(args, body)
110178
s
111179
end
112180

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))
118200
end
119201

120202
def new_args(norm, opt, rest, block)
@@ -192,26 +274,8 @@ def new_block_args(norm, opt, rest, block)
192274
end
193275
end
194276

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))
215279
end
216280

217281
def add_block_pass(arglist, block)
@@ -237,7 +301,7 @@ def new_op_asgn(op, lhs, rhs)
237301
result
238302
end
239303

240-
def new_assign(lhs, rhs)
304+
def new_assign(lhs, tok, rhs)
241305
case lhs.type
242306
when :iasgn, :cdecl, :lasgn, :gasgn, :cvdecl, :nth_ref
243307
lhs << rhs
@@ -312,9 +376,9 @@ def new_var_ref(ref)
312376
ref
313377
when :identifier
314378
if scope.has_local? ref[1]
315-
s(:lvar, ref[1])
379+
s(:lvar, [ref[1]])
316380
else
317-
s(:call, nil, ref[1], s(:arglist))
381+
s(:call, [nil, ref[1], s(:arglist)])
318382
end
319383
else
320384
raise "Bad var_ref type: #{ref.type}"

0 commit comments

Comments
 (0)
Please sign in to comment.