2013-06-01 03:33:38 +02:00
|
|
|
#include "AST/PrintVisitor.h"
|
2013-06-01 03:41:43 +02:00
|
|
|
#include <iostream>
|
|
|
|
|
#include <sstream>
|
2013-06-01 03:33:38 +02:00
|
|
|
|
2013-06-01 03:41:43 +02:00
|
|
|
PrintVisitor::PrintVisitor() : level_(0) {
|
2013-06-01 03:33:38 +02:00
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PrintVisitor::~PrintVisitor() {
|
|
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(AssignmentExpression* e) {
|
2013-06-01 12:23:18 +02:00
|
|
|
println("AssignmentExpression");
|
|
|
|
|
level_++;
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << e->getId() << " = ";
|
|
|
|
|
println(ss.str());
|
|
|
|
|
e->getExpr()->accept(this);
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(BinOpExpression* e) {
|
2013-06-01 12:32:31 +02:00
|
|
|
println("BinOpExpression");
|
|
|
|
|
level_++;
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << "Operator: " << e->getOp();
|
|
|
|
|
println(ss.str());
|
|
|
|
|
println("LHS:");
|
|
|
|
|
e->getLeftExp()->accept(this);
|
|
|
|
|
println("RHS:");
|
|
|
|
|
e->getRightExp()->accept(this);
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ConstantExpression* e) {
|
2013-06-01 12:32:31 +02:00
|
|
|
println("ConstantExpression");
|
|
|
|
|
level_++;
|
|
|
|
|
println(e->getValue());
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ExpressionStatement* e) {
|
2013-06-01 12:23:18 +02:00
|
|
|
println("ExpressionStatement");
|
|
|
|
|
level_++;
|
2013-06-01 12:32:31 +02:00
|
|
|
e->getExpr()->accept(this);
|
2013-06-01 12:23:18 +02:00
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ForStatement* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(FunctionCallExpression* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(FunctionDefinition* e) {
|
2013-06-01 03:41:43 +02:00
|
|
|
println("FunctionDefinition");
|
|
|
|
|
level_++;
|
|
|
|
|
std::stringstream ss;
|
2013-06-01 12:32:31 +02:00
|
|
|
ss << "Name: " << e->getName();
|
2013-06-01 03:41:43 +02:00
|
|
|
println(ss.str());
|
2013-06-01 12:32:31 +02:00
|
|
|
ss.clear();
|
|
|
|
|
ss << "Type: " << e->getType()->getName();
|
2013-06-01 03:41:43 +02:00
|
|
|
ParameterList* params = e->getParams();
|
|
|
|
|
if (params) {
|
|
|
|
|
params->accept(this);
|
|
|
|
|
}
|
|
|
|
|
e->getSl()->accept(this);
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(IfStatement* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ParameterList* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(RandomForStatement* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(RandomIfStatement* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ReturnStatement* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(Scope* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(StatementList* e) {
|
2013-06-01 03:41:43 +02:00
|
|
|
println("StatementList");
|
2013-06-01 12:23:18 +02:00
|
|
|
level_++;
|
|
|
|
|
auto statements = e->getStatements();
|
|
|
|
|
auto iter = statements.begin();
|
|
|
|
|
auto end = statements.end();
|
|
|
|
|
for (; iter != end; ++iter) {
|
|
|
|
|
(*iter)->accept(this);
|
|
|
|
|
}
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(ValueList* e) {
|
|
|
|
|
// TODO implement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::visit(VariableDefinition* e) {
|
2013-06-01 12:31:06 +02:00
|
|
|
println("VariableDefinition");
|
|
|
|
|
level_++;
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << e->getType()->getName() << "<-" << e->getName();
|
|
|
|
|
println(ss.str());
|
|
|
|
|
level_--;
|
2013-06-01 03:33:38 +02:00
|
|
|
}
|
2013-06-01 03:41:43 +02:00
|
|
|
|
|
|
|
|
void PrintVisitor::indent() {
|
|
|
|
|
for (int i = 0; i < level_; i++) {
|
|
|
|
|
std::cout << " ";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::print(const std::string& s) {
|
|
|
|
|
indent();
|
|
|
|
|
std::cout << s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintVisitor::println(const std::string& s) {
|
|
|
|
|
print(s);
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
}
|