unsigned TypeComparer::next_tag = 1;
-TypeComparer::TypeComparer():
- first(0),
- second(0),
- first_tag(0),
- r_result(false)
-{ }
-
void TypeComparer::compare(Node &node1, Node &node2)
{
if(&node1==&node2)
}
}
+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);
+ }
+ }
+}
+
void TypeComparer::visit(BasicTypeDeclaration &basic)
{
if(BasicTypeDeclaration *basic1 = multi_visit(basic))
}
-LocationCounter::LocationCounter():
- r_count(0)
-{ }
-
void LocationCounter::visit(BasicTypeDeclaration &basic)
{
r_count = basic.kind==BasicTypeDeclaration::MATRIX ? basic.size>>16 : 1;
}
}
+
+set<VariableDeclaration *> AssignmentCollector::apply(Node &node)
+{
+ node.visit(*this);
+ return assigned_variables;
+}
+
+void AssignmentCollector::visit(Assignment &assign)
+{
+ if(VariableDeclaration *var = dynamic_cast<VariableDeclaration *>(assign.target.declaration))
+ assigned_variables.insert(var);
+}
+
} // namespace SL
} // namespace GL
} // namespace Msp