Skip to content

Instantly share code, notes, and snippets.

@igaiga
Created January 7, 2020 06:56
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/9a6013222e7858831de312e7d03a218d to your computer and use it in GitHub Desktop.
Save igaiga/9a6013222e7858831de312e7d03a218d to your computer and use it in GitHub Desktop.
require "minruby"
def evaluate(tree, genv, lenv)
# pp(tree)
case tree[0]
when "func_def"
genv[tree[1]] = ["user_defind", tree[2], tree[3]]
when "lit"
tree[1]
when "+"
evaluate(tree[1], genv, lenv) + evaluate(tree[2], genv, lenv)
when "-"
evaluate(tree[1], genv, lenv) - evaluate(tree[2], genv, lenv)
when "*"
evaluate(tree[1], genv, lenv) * evaluate(tree[2], genv, lenv)
when "/"
evaluate(tree[1], genv, lenv) / evaluate(tree[2], genv, lenv)
when "<"
evaluate(tree[1], genv, lenv) < evaluate(tree[2], genv, lenv)
when ">"
evaluate(tree[1], genv, lenv) > evaluate(tree[2], genv, lenv)
when "=="
evaluate(tree[1], genv, lenv) == evaluate(tree[2], genv, lenv)
when "func_call"
args = []
i = 0
while tree[i+2]
args[i] = evaluate(tree[i+2], genv, lenv)
i = i + 1
end
mhd = genv[tree[1]]
if mhd[0] == "builtin"
minruby_call(mhd[1], args)
else
new_lenv = {}
params = mhd[1]
i = 0
while params[i]
new_lenv[params[i]] = args[i]
# lenv[params[i]] = args[i]
i = i + 1
end
# evaluate(mhd[2], genv, lenv)
evaluate(mhd[2], genv, new_lenv)
end
when "stmts"
i = 1
last = nil
while tree[i] != nil
last = evaluate(tree[i], genv, lenv)
i = i+1
end
last
when "var_assign"
lenv[tree[1]] = evaluate(tree[2], genv, lenv)
when "var_ref"
lenv[tree[1]]
when "if"
if evaluate(tree[1], genv, lenv)
evaluate(tree[2], genv, lenv)
else
evaluate(tree[3], genv, lenv)
end
when "while"
while evaluate(tree[1], genv, lenv)
evaluate(tree[2], genv, lenv)
end
when "while2"
evaluate(tree[2], genv, lenv)
while evaluate(tree[1], genv, lenv)
evaluate(tree[2], genv, lenv)
end
end
end
str = minruby_load()
tree = minruby_parse(str)
def add(x,y)
x + y
end
genv = { "p" => ["builtin", "p"], "add" => ["builtin", "add"] }
lenv = {}
evaluate(tree, genv, lenv)
# $ ruby interp.rb program1.rb
# program1.rb
# def foo(x,y)
# x + y
# end
#
# x = 1
#
# p(foo(2,4))
# p(x)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment