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 << @newline
when :variable, :number
str << left << @newline
when '[:]', '.'
str << token << @newline
exec(left, str, level+1)
str << ' ' * (level+1) << right << @newline
when :true, :false, :null
str << token.id2name << @newline
when :function
str << left << "()" << @newline
exec(right, str, level+1) if right
else
str << (token.is_a?(Symbol) ? token.inspect : token)
str << @newline
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