- Expression =
Class.new(Statement)
- PyBoolizeError =
Exceptions possibly occurring when evaluating
Class.new(RuntimeError)
- PyNameError =
Class.new(RuntimeError)
- PyCallError =
Class.new(RuntimeError)
- StatementList =
AST-elements of Statements
stmt(:stmts) do |env|
@stmts.inject(nil) do |acc, stmt|
stmt.eval(env)
end
end
- AssignIdentifier =
stmt(:name, :exp) do |env|
env.set(@name, @exp.eval(env))
nil
end
- AssignAttr =
stmt(:receiver, :attrname, :exp) do |env|
@receiver.eval(env).set_attr(@attrname, @exp.eval(env))
nil
end
- Def =
stmt(:name, :stat, :fix_param_names, [:rest_param_name]) do |env|
entity = {:fix_param_names => @fix_param_names,
:rest_param_name => @rest_param_name,
:stat => @stat,
:env => env.getlink}
env.set(@name, Builtins::Func.make_instance(entity))
nil
end
- ClassDef =
stmt(:name, :stat, :base_exps) do |env|
bases = @base_exps.map{|e| e.eval(env)}
klassenv = ClassEnvironment.new(:parent => env)
stat.eval(klassenv)
klass = PyObject.new(klassenv.merge(:class => Builtins::Type, :bases => bases))
env.set(@name, klass)
nil
end
- Return =
stmt([:exp]) do |env|
res = if @exp then @exp.eval(env) else Builtins::None end
throw :return, res
end
- Apply =
AST-elements of Expressions
exp(:callee_exp, :arg_exps) do |env|
@callee_exp.eval(env).call(*@arg_exps.map{|e| e.eval(env)})
end
- AttrRef =
exp(:receiver, :attrname) do |env|
@receiver.eval(env).get_attr(@attrname)
end
- RefIdentifier =
exp(:name) do |env|
if res = env.resolve(@name)
res
else
raise PyNameError.new("Unbound variable: #{@name}")
end
end
- Conditional =
exp(:cond_exp, :true_exp, :false_exp) do |env|
if Syntax.pytrue?(@cond_exp.eval(env))
@true_exp.eval(env)
else
@false_exp.eval(env)
end
end
- UnaryOp =
exp(:op_name, :exp) do |env|
@exp.eval(env).call_special_method(@op_name)
end
- BinaryOp =
exp(:op_name, :left_exp, :right_exp) do |env|
left = @left_exp.eval(env)
right = @right_exp.eval(env)
left.call_special_method(@op_name, right)
end
- And =
exp(:left_exp, :right_exp) do |env|
left = @left_exp.eval(env)
if !Syntax.pytrue?(left)
left
else
@right_exp.eval(env)
end
end
- Or =
exp(:left_exp, :right_exp) do |env|
left = @left_exp.eval(env)
if Syntax.pytrue?(left)
left
else
@right_exp.eval(env)
end
end
- Not =
exp(:cond_exp) do |env|
if Syntax.pytrue?(@cond_exp.eval(env))
Builtins::False
else
Builtins::True
end
end
- LiteralObject =
exp(:object) do |env|
@object
end