Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: opal/opal
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: bf3fa2c46482^
Choose a base ref
...
head repository: opal/opal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 08db40487a61
Choose a head ref
  • 2 commits
  • 6 files changed
  • 1 contributor

Commits on Nov 21, 2013

  1. Initial commit for parser tokens to store col, line info

    Conflicts:
    	spec/opal/rubyspec
    adambeynon committed Nov 21, 2013

    Verified

    This commit was signed with the committer’s verified signature.
    skmcgrail Sean McGrail
    Copy the full SHA
    bf3fa2c View commit details
  2. Verified

    This commit was signed with the committer’s verified signature.
    skmcgrail Sean McGrail
    Copy the full SHA
    08db404 View commit details
Showing with 2,130 additions and 2,103 deletions.
  1. +4 −0 .travis.yml
  2. +99 −35 lib/opal/parser.rb
  3. +1,982 −2,006 lib/opal/parser/grammar.rb
  4. +40 −61 lib/opal/parser/grammar.y
  5. +3 −1 lib/opal/parser/lexer.rb
  6. +2 −0 lib/opal/parser/sexp.rb
4 changes: 4 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -15,3 +15,7 @@ notifications:
matrix:
allow_failures:
- rvm: rbx-20mode

branches:
except:
- parser-tokens
134 changes: 99 additions & 35 deletions lib/opal/parser.rb
Original file line number Diff line number Diff line change
@@ -28,9 +28,9 @@ def next_token
@lexer.next_token
end

def s(*parts)
sexp = Sexp.new(parts)
sexp.line = @lexer.line
def s(type, children = [], source = [])
sexp = Sexp.new([type].concat(children))
sexp.loc = source
sexp
end

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

def value(tok)
tok[0]
end

def source(tok)
tok[1]
end

def new_nil(tok)
s(:nil, [], source(tok))
end

def new_self(tok)
s(:self, [], source(tok))
end

def new_true(tok)
s(:true, [], source(tok))
end

def new_false(tok)
s(:false, [], source(tok))
end

def new___FILE__(tok)
s(:str, [self.file], source(tok))
end

def new___LINE__(tok)
s(:int, [lexer.line], source(tok))
end

def new_ident(tok)
s(:identifier, [value(tok).to_sym], source(tok))
end

def new_int(tok)
s(:int, [value(tok)], source(tok))
end

def new_float(tok)
s(:float, [value(tok)], source(tok))
end

def new_ivar(tok)
s(:ivar, [value(tok).to_sym], source(tok))
end

def new_gvar(tok)
s(:gvar, [value(tok).to_sym], source(tok))
end

def new_cvar(tok)
s(:cvar, [value(tok).to_sym], source(tok))
end

def new_const(tok)
s(:const, [value(tok).to_sym], source(tok))
end

def new_sym(tok)
s(:sym, [value(tok).to_sym], source(tok))
end

def new_alias(kw, new, old)
s(:alias, [new, old], source(kw))
end

def new_block(stmt = nil)
s = s(:block)
s = s(:block, [], nil)
s << stmt if stmt
s
end
@@ -63,9 +131,9 @@ def new_compstmt(block)
elsif block.size == 2
block[1]
else
block.line = block[1].line
block
end
block
end

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

def new_class(path, sup, body)
s(:class, path, sup, body)
def new_class(start, path, sup, body, endt)
s(:class, [path, sup, body], source(start))
end

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

def new_if(expr, stmt, tail)
s = s(:if, expr, stmt, tail)
s.line = expr.line
s.end_line = @lexer.line
s
def new_if(if_tok, expr, stmt, tail)
s(:if, [expr, stmt, tail], source(if_tok))
end

def new_while(kw, test, body)
s(:while, [test, body], source(kw))
end

def new_until(kw, test, body)
s(:until, [test, body], source(kw))
end

def new_rescue_mod(kw, expr, resc)
s(:rescue_mod, [expr, resc], source(kw))
end

def new_array(start, args, finish)
args ||= []
s(:array, args, source(start))
end

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

def new_call(recv, meth, args = nil)
call = s(:call, recv, meth)
args = s(:arglist) unless args
args.type = :arglist if args.type == :array
call << args

if recv
call.line = recv.line
elsif args[1]
call.line = args[1].line
end

# fix arglist spilling over into next line if no args
if args.length == 1
args.line = call.line
else
args.line = args[1].line
end

call
def new_call(recv, meth, args = [])
s(:call, [recv, value(meth).to_sym, s(:arglist, args)], source(meth))
end

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

def new_assign(lhs, rhs)
def new_assign(lhs, tok, rhs)
case lhs.type
when :iasgn, :cdecl, :lasgn, :gasgn, :cvdecl, :nth_ref
lhs << rhs
@@ -312,9 +376,9 @@ def new_var_ref(ref)
ref
when :identifier
if scope.has_local? ref[1]
s(:lvar, ref[1])
s(:lvar, [ref[1]])
else
s(:call, nil, ref[1], s(:arglist))
s(:call, [nil, ref[1], s(:arglist)])
end
else
raise "Bad var_ref type: #{ref.type}"
Loading