def exec_stmt(stmt_node, arg1=nil, arg2=nil)
case stmt_node.token
when :set
node = stmt_node.left
op = node.token
lhs_node = node.left
rhs_node = node.right
if lhs_node.token == :variable then
varname = lhs_node.left
if _debut?(varname) then
unless op == '=' then
msg = "#{varname}: uninitialized local var is used, or tryng to assign into global var."
@warnings << msg
end
_regist(varname, :local, false)
exec_expr(rhs_node, arg1, arg2)
_set_initialized(varname)
else
if _scope(varname) == :global then
msg = "#{varname}: trying to assign into global var."
@warnings << msg
end
exec_expr(rhs_node, arg1, arg2)
end
else
exec_expr(lhs_node, arg1, arg2)
exec_expr(rhs_node, arg1, arg2)
end
when :foreach
Kwartz::assert() unless stmt_node.left.token == '='
loopvar_node = stmt_node.left.left
listvar_node = stmt_node.left.right
nodelist = stmt_node.right
if loopvar_node.token == :variable then
varname = loopvar_node.left
if _debut?(varname) then
_regist(varname, :local, false)
exec_expr(listvar_node, arg1, arg2)
_set_initialized(varname)
else
if _scope(varname) == :global then
msg = "#{varname}: global var is used as loop var."
@warnings << msg
end
exec_expr(listvar_node, arg1, arg2)
end
else
exec_expr(loopvar_node, arg1, arg2)
exec_expr(listvar_node, arg1, arg2)
end
exec_nodelist(nodelist, arg1, arg2)
when :print
exec_expr(stmt_node.left, arg1, arg2)
when :while
cond_expr = stmt_node.condition
nodelist = stmt_node.left
exec_expr(cond_expr, arg1, arg2)
exec_nodelist(nodelist, arg1, arg2)
when :if
cond_expr = stmt_node.condition
then_nodelist = stmt_node.left
else_node = stmt_node.right
exec_expr(cond_expr, arg1, arg2)
exec_nodelist(then_nodelist, arg1, arg2)
else_node.execute(self, arg1, arg2) if else_node
when :rawcode
when :macro
macro_name = stmt_node.left
nodelist = stmt_node.right
@macros[macro_name] = nodelist
when :expand
macro_name = stmt_node.left
nodelist = @macros[macro_name]
unless nodelist
msg = "'#{macro_name}': no such macro."
raise AnalysisError.new(msg)
end
exec_nodelist(nodelist, arg1, arg2)
else
Kwartz::assert()
end
end