+void TypeComparer::visit(Literal &literal)
+{
+ if(Literal *lit1 = multi_visit(literal))
+ {
+ if(!lit1->type || !literal.type)
+ r_result = false;
+ else
+ {
+ compare(*lit1->type, *literal.type);
+ if(r_result)
+ r_result = (literal.value.check_type<int>() && lit1->value.value<int>()==literal.value.value<int>());
+ }
+ }
+}
+
+void TypeComparer::visit(VariableReference &var)
+{
+ if(VariableReference *var1 = multi_visit(var))
+ {
+ if(!var1->declaration || !var.declaration)
+ r_result = false;
+ else if(!var1->declaration->constant || !var.declaration->constant)
+ r_result = false;
+ else if(!var1->declaration->init_expression || !var.declaration->init_expression)
+ r_result = false;
+ else
+ compare(*var1->declaration->init_expression, *var.declaration->init_expression);
+ }
+}
+
+void TypeComparer::visit(UnaryExpression &unary)
+{
+ if(UnaryExpression *unary1 = multi_visit(unary))
+ {
+ if(unary1->oper!=unary.oper)
+ r_result = false;
+ else
+ compare(*unary1->expression, *unary.expression);
+ }
+}
+
+void TypeComparer::visit(BinaryExpression &binary)
+{
+ if(BinaryExpression *binary1 = multi_visit(binary))
+ {
+ if(binary1->oper!=binary.oper)
+ r_result = false;
+ else
+ {
+ compare(*binary1->left, *binary.left);
+ if(r_result)
+ compare(*binary1->right, *binary.right);
+ }
+ }
+}
+
+void TypeComparer::visit(TernaryExpression &ternary)
+{
+ if(TernaryExpression *ternary1 = multi_visit(ternary))
+ {
+ if(ternary1->oper!=ternary.oper)
+ r_result = false;
+ else
+ {
+ compare(*ternary1->condition, *ternary.condition);
+ if(r_result)
+ compare(*ternary1->true_expr, *ternary.true_expr);
+ if(r_result)
+ compare(*ternary1->false_expr, *ternary.false_expr);
+ }
+ }
+}
+