Skip to content

Instantly share code, notes, and snippets.

@igaiga
Created November 26, 2019 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igaiga/49fd3f6c1cfe119bc5352b448cd25bc3 to your computer and use it in GitHub Desktop.
Save igaiga/49fd3f6c1cfe119bc5352b448cd25bc3 to your computer and use it in GitHub Desktop.
# $ ruby interp.rb test.rb
# test.rb
# plus_count=0
# x = 1+2+3
# p(plus_count) #=> 2
# x = 1+2+3
# p(plus_count) #=> 4
require "minruby"
def evaluate(tree, env)
# pp(tree)
case tree[0]
when "lit"
tree[1]
when "+"
evaluate(tree[1], env) + evaluate(tree[2], env)
env["plus_count"] = env["plus_count"] +1
when "-"
evaluate(tree[1], env) - evaluate(tree[2], env)
when "*"
evaluate(tree[1], env) * evaluate(tree[2], env)
when "/"
evaluate(tree[1], env) / evaluate(tree[2], env)
when "func_call"
p(evaluate(tree[2], env))
when "stmts"
i = 1
last = nil
while tree[i] != nil
last = evaluate(tree[i], env)
i = i+1
end
last
when "var_assign"
env[tree[1]] = evaluate(tree[2], env)
when "var_ref"
env[tree[1]]
end
end
str = minruby_load()
tree = minruby_parse(str)
env = {}
evaluate(tree, env)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment