def exec_expr(expr_node, str, level)
token = expr_node.token
left = expr_node.left
right = expr_node.right
cond = expr_node.condition
str << ' ' * level
case token
when :string
str << left.inspect << "\n"
when :variable, :number
str << left << "\n"
when '[:]', '.'
str << token << "\n"
exec(left, str, level+1)
str << ' ' * (level+1) << right << "\n"
when :true, :false, :null
str << token.id2name << "\n"
when :function
str << left << "()\n"
exec(right, str, level+1) if right
else
str << (token.is_a?(Symbol) ? token.inspect : token)
str << "\n"
Kwartz::assert() unless !cond || cond.is_a?(ExprNode)
Kwartz::assert() unless !left || left.is_a?(ExprNode)
Kwartz::assert() unless !right || right.is_a?(ExprNode)
exec(cond, str, level+1) if cond
exec(left, str, level+1) if left
exec(right, str, level+1) if right
end
return str
end