def exec_expr(expr_node, arg1=nil, arg2=nil)
case tkn = expr_node.token
when :variable
varname = expr_node.left
if _debut?(varname)
_register(varname)
elsif _scope(varname) == :local && ! _initialized?(varname)
msg = "#{varname}: uninitialized local var is used, or tryng to assign into global var."
@warnings << msg
end
when '[]', '{}'
exec_expr(expr_node.right)
exec_expr(expr_node.left)
when '[:]', '.'
exec_expr(expr_node.left)
when :string, :number, :true, :false, :null
when :function
exec_expr(expr_node.right) if expr_node.right
when '+', '-'
exec_expr(expr_node.left, arg1, arg2)
exec_expr(expr_node.right, arg1, arg2) if expr_node.right
when '*', '/', '%'
exec_expr(expr_node.left, arg1, arg2)
exec_expr(expr_node.right, arg1, arg2)
when '!'
exec_expr(expr_node.left)
when '==', '!=', '<', '<=', '>', '>=', '&&', '||'
exec_expr(expr_node.left)
exec_expr(expr_node.right)
when '.+', ','
exec_expr(expr_node.left)
exec_expr(expr_node.right)
when '.==', '.!=', '.<', '.<=', '.>', '.>='
exec_expr(expr_node.left)
exec_expr(expr_node.right)
when :empty, :notempty
exec_expr(expr_node.left)
when '?'
exec_expr(expr_node.condition)
exec_expr(expr_node.left)
exec_expr(expr_node.right)
else
Kwartz::assert("tknn=#{tkn.inspect}")
end
end