Skip to content

Instantly share code, notes, and snippets.

@igaiga
Created December 3, 2019 06:31
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/1d47c8ce42d24ef1b35449d470526728 to your computer and use it in GitHub Desktop.
Save igaiga/1d47c8ce42d24ef1b35449d470526728 to your computer and use it in GitHub Desktop.
require "minruby"
def evaluate(tree, env)
# pp(tree)
case tree[0]
when "lit"
tree[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 "/"
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 "=="
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]]
when "if"
if evaluate(tree[1], env)
evaluate(tree[2], env)
else
evaluate(tree[3], env)
end
when "while"
while evaluate(tree[1], env)
evaluate(tree[2], env)
end
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