From 6d2e40778c261e84c2de5d71ae676612935d13a6 Mon Sep 17 00:00:00 2001 From: Markus Hauschild Date: Sat, 1 Jun 2013 16:22:01 +0200 Subject: [PATCH] Make Type an enum class (C++11 ftw) --- grammar/grammar.y | 10 +++++----- inc/AST/FunctionDefinition.h | 6 +++--- inc/AST/ParameterList.h | 4 ++-- inc/AST/Type.h | 2 ++ inc/AST/VariableDefinition.h | 6 +++--- src/AST/FunctionDefinition.cpp | 4 ++-- src/AST/ParameterList.cpp | 2 +- src/AST/PrintVisitor.cpp | 6 +++--- src/AST/Type.cpp | 15 +++++++++++++++ src/AST/VariableDefinition.cpp | 4 ++-- 10 files changed, 38 insertions(+), 21 deletions(-) diff --git a/grammar/grammar.y b/grammar/grammar.y index bddb269..f36b954 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -63,11 +63,11 @@ program ::= expr(E). { PrintVisitor* pv = new PrintVisitor; E->accept(pv) fundef(A) ::= type(T) T_IDENTIFIER(ID) T_LPAREN params(P) T_RPAREN T_BEGIN statements(S) T_END. { A = new FunctionDefinition(T, ID->getText(), P, S); } -%type type {Type*} -type(A) ::= T_BOOL. { A = new Type("bool"); } -type(A) ::= T_INT. { A = new Type("int"); } -type(A) ::= T_STRING. { A = new Type("string"); } -type(A) ::= T_VOID. { A = new Type("void"); } +%type type {Type} +type(A) ::= T_BOOL. { A = Type::BOOL; } +type(A) ::= T_INT. { A = Type::INT; } +type(A) ::= T_STRING. { A = Type::STRING; } +type(A) ::= T_VOID. { A = Type::VOID; } %type params {ParameterList*} params(A) ::= . { A = new ParameterList(); } diff --git a/inc/AST/FunctionDefinition.h b/inc/AST/FunctionDefinition.h index bf99248..446d285 100644 --- a/inc/AST/FunctionDefinition.h +++ b/inc/AST/FunctionDefinition.h @@ -9,17 +9,17 @@ class FunctionDefinition : public ASTElement { public: - FunctionDefinition(Type *type, std::string name, ParameterList* params, StatementList* sl); + FunctionDefinition(Type type, std::string name, ParameterList* params, StatementList* sl); virtual ~FunctionDefinition(); virtual void accept(ASTVisitor* visitor); - Type* getType(); + Type getType(); std::string getName(); ParameterList* getParams(); StatementList* getSl(); private: - Type* type_; + Type type_; std::string name_; ParameterList* params_; StatementList* sl_; diff --git a/inc/AST/ParameterList.h b/inc/AST/ParameterList.h index 6209396..3cbbc63 100644 --- a/inc/AST/ParameterList.h +++ b/inc/AST/ParameterList.h @@ -5,7 +5,7 @@ #include "AST/Type.h" #include -typedef std::pair Parameter; +typedef std::pair Parameter; class ParameterList : public ASTElement { public: @@ -14,7 +14,7 @@ public: virtual void accept(ASTVisitor* visitor); - void addParameter(Type* type, std::string name); + void addParameter(Type type, std::string name); std::vector getParameters(); private: std::vector params_; diff --git a/inc/AST/Type.h b/inc/AST/Type.h index 19039ca..b0b33ee 100644 --- a/inc/AST/Type.h +++ b/inc/AST/Type.h @@ -5,4 +5,6 @@ enum class Type { BOOL, INT, STRING, VOID }; +std::string typeToString(Type type); + #endif // TYPE_H diff --git a/inc/AST/VariableDefinition.h b/inc/AST/VariableDefinition.h index 338428c..f588364 100644 --- a/inc/AST/VariableDefinition.h +++ b/inc/AST/VariableDefinition.h @@ -9,15 +9,15 @@ class VariableDefinition : public Statement { public: - VariableDefinition(Type *type, std::string name); + VariableDefinition(Type type, std::string name); virtual ~VariableDefinition(); virtual void accept(ASTVisitor* visitor); - Type* getType(); + Type getType(); std::string getName(); private: - Type* type_; + Type type_; std::string name_; }; diff --git a/src/AST/FunctionDefinition.cpp b/src/AST/FunctionDefinition.cpp index d275c2b..ff95dca 100644 --- a/src/AST/FunctionDefinition.cpp +++ b/src/AST/FunctionDefinition.cpp @@ -1,7 +1,7 @@ #include "AST/FunctionDefinition.h" #include "AST/ASTVisitor.h" -FunctionDefinition::FunctionDefinition(Type *type, std::string name, ParameterList *params, StatementList *sl) : type_(type), name_(name), params_(params), sl_(sl) { +FunctionDefinition::FunctionDefinition(Type type, std::string name, ParameterList *params, StatementList *sl) : type_(type), name_(name), params_(params), sl_(sl) { // } @@ -13,7 +13,7 @@ void FunctionDefinition::accept(ASTVisitor* visitor) { visitor->visit(this); } -Type* FunctionDefinition::getType() { +Type FunctionDefinition::getType() { return type_; } diff --git a/src/AST/ParameterList.cpp b/src/AST/ParameterList.cpp index 62aa225..5cac66d 100644 --- a/src/AST/ParameterList.cpp +++ b/src/AST/ParameterList.cpp @@ -13,7 +13,7 @@ void ParameterList::accept(ASTVisitor* visitor) { visitor->visit(this); } -void ParameterList::addParameter(Type* type, std::string name) { +void ParameterList::addParameter(Type type, std::string name) { params_.push_back(Parameter(type, name)); } diff --git a/src/AST/PrintVisitor.cpp b/src/AST/PrintVisitor.cpp index af7637d..a7ff4d2 100644 --- a/src/AST/PrintVisitor.cpp +++ b/src/AST/PrintVisitor.cpp @@ -107,7 +107,7 @@ void PrintVisitor::visit(FunctionDefinition* e) { println(ss.str()); ss.str(""); ss.clear(); - ss << "Type: " << e->getType(); + ss << "Type: " << typeToString(e->getType()); println(ss.str()); ParameterList* params = e->getParams(); if (params) { @@ -140,7 +140,7 @@ void PrintVisitor::visit(ParameterList* e) { println(ss.str()); ss.str(""); ss.clear(); - ss << "Type: " << p.first->getName(); + ss << "Type: " << typeToString(p.first); println(ss.str()); } level_--; @@ -216,7 +216,7 @@ void PrintVisitor::visit(VariableDefinition* e) { println(ss.str()); ss.str(""); ss.clear(); - ss << "Type: " << e->getType()->getName(); + ss << "Type: " << typeToString(e->getType()); println(ss.str()); level_--; } diff --git a/src/AST/Type.cpp b/src/AST/Type.cpp index ea5ff21..b62669d 100644 --- a/src/AST/Type.cpp +++ b/src/AST/Type.cpp @@ -1 +1,16 @@ #include "AST/Type.h" + +std::string typeToString(Type type) { + switch (type) { + case Type::BOOL: + return "bool"; + case Type::INT: + return "int"; + case Type::STRING: + return "string"; + case Type::VOID: + return "void"; + default: + return "ERROR"; + } +} diff --git a/src/AST/VariableDefinition.cpp b/src/AST/VariableDefinition.cpp index 281704b..36cfaa9 100644 --- a/src/AST/VariableDefinition.cpp +++ b/src/AST/VariableDefinition.cpp @@ -1,7 +1,7 @@ #include "AST/VariableDefinition.h" #include "AST/ASTVisitor.h" -VariableDefinition::VariableDefinition(Type* type, std::string name) : type_(type), name_(name) { +VariableDefinition::VariableDefinition(Type type, std::string name) : type_(type), name_(name) { // } @@ -13,7 +13,7 @@ void VariableDefinition::accept(ASTVisitor* visitor) { visitor->visit(this); } -Type* VariableDefinition::getType() { +Type VariableDefinition::getType() { return type_; }