Files
scully/src/AST/PrintVisitor.cpp

173 lines
3.2 KiB
C++
Raw Normal View History

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) {
2013-06-01 12:40:13 +02:00
println("ForStatement");
level_++;
println("Init:");
e->getInit()->accept(this);
println("Cond:");
e->getCond()->accept(this);
println("Step:");
e->getStep()->accept(this);
println("Stmt:");
e->getStmt()->accept(this);
level_--;
2013-06-01 03:33:38 +02:00
}
void PrintVisitor::visit(FunctionCallExpression* e) {
2013-06-01 12:40:13 +02:00
println("FunctionCallExpression");
level_++;
std::stringstream ss;
ss << "Name: " << e->getId();
println(ss.str());
println("Values:");
e->getValues()->accept(this);
level_--;
2013-06-01 03:33:38 +02:00
}
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:40:13 +02:00
ss.str("");
2013-06-01 12:32:31 +02:00
ss.clear();
ss << "Type: " << e->getType()->getName();
2013-06-01 12:40:13 +02:00
println(ss.str());
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) {
2013-06-01 12:40:13 +02:00
println("IfStatement");
level_++;
println("Cond:");
e->getCond()->accept(this);
println("Stmt:");
e->getStmt()->accept(this);
level_--;
2013-06-01 03:33:38 +02:00
}
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) {
2013-06-01 12:40:13 +02:00
println("ReturnStatement");
level_++;
e->getExpr()->accept(this);
level_--;
2013-06-01 03:33:38 +02:00
}
void PrintVisitor::visit(Scope* e) {
2013-06-01 12:40:13 +02:00
println("Scope");
level_++;
e->getSl()->accept(this);
level_--;
2013-06-01 03:33:38 +02:00
}
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) {
println("VariableDefinition");
level_++;
std::stringstream ss;
2013-06-01 12:40:13 +02:00
ss << "Name: " << e->getName();
println(ss.str());
ss.str("");
ss.clear();
ss << "Type: " << e->getType()->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;
}