def translate_expr(expr_node, code='', level=0)
node = expr_node
case tkn = node.token
when :variable
code << '$'
super(node, code, level)
when '.+'
code << '"'
code << _translate_strcat(node)
code << '"'
when '!='
if node.left.token == :null
translate_expr(node.right, code, level)
elsif node.right.token == :null
translate_expr(node.left, code, level)
else
super(node, code, level)
end
when '=='
if node.left.token == :null
node.token = '!'
node.left = node.right
node.right = nil
elsif node.right.token == :null
node.token = '!'
node.right = nil
end
super(node, code, level)
when :empty, :notempty
flag = (tkn == :empty)
str_node = ExprNode.new(:string, '', nil)
l_node = flag ? ExprNode.new('!', node.left, nil) : node.left
r_node = ExprNode.new(flag ? '==' : '!=', node.left, str_node)
node2 = ExprNode.new(flag ? '||' : '&&', l_node, r_node)
code << encode('(')
translate_expr(node2, code, level)
code << encode(')')
when :null
msg = "velocity cannot support keyword 'null'."
raise TranslationError.new(msg)
else
super(node, code, level)
end
return code
end