return label;
}
+string DumpTree::format_type(TypeDeclaration *type)
+{
+ return (type ? type->name : "?");
+}
+
template<typename T>
typename T::const_iterator DumpTree::increment(typename T::const_iterator &iter, const T &container)
{
void DumpTree::visit(Literal &literal)
{
- append(format("Literal: %s", literal.token));
+ append(format("Literal: %s -> %s", literal.token, format_type(literal.type)));
}
void DumpTree::visit(ParenthesizedExpression &parexpr)
{
- annotated_branch("(expr)", *parexpr.expression);
+ annotated_branch(format("(expr) -> %s", format_type(parexpr.type)), *parexpr.expression);
}
void DumpTree::visit(VariableReference &var)
string text;
if(var.declaration)
text += format("%%%d ", get_label(*var.declaration));
- text += format("%s (var)", var.name);
+ text += format("%s (var) -> %s", var.name, format_type(var.type));
append(text);
}
string text = "Member access:";
if(memacc.declaration)
text += format(" %%%d", get_label(*memacc.declaration));
- text += format(" .%s", memacc.member);
+ text += format(" .%s -> %s", memacc.member, format_type(memacc.type));
annotated_branch(text, *memacc.left);
}
void DumpTree::visit(UnaryExpression &unary)
{
- string text = format("Unary: %s, %sfix", unary.oper->token, (unary.oper->type==Operator::PREFIX ? "pre" : "post"));
+ string text = format("Unary: %s, %sfix -> %s", unary.oper->token, (unary.oper->type==Operator::PREFIX ? "pre" : "post"), format_type(unary.type));
annotated_branch(text, *unary.expression);
}
void DumpTree::visit(BinaryExpression &binary)
{
- append(format("Binary: %s", (binary.oper->token[0]=='[' ? "[]" : binary.oper->token)));
+ append(format("Binary: %s -> %s", (binary.oper->token[0]=='[' ? "[]" : binary.oper->token), format_type(binary.type)));
begin_sub();
binary.left->visit(*this);
last_branch();
head += call.name;
if(call.constructor)
head += " (constructor)";
+ head += format(" -> %s", format_type(call.type));
append(head);
begin_sub();