From c8a1119ea6b5893f0a70f13e3bb61ebd59c2131e Mon Sep 17 00:00:00 2001 From: Markus Hauschild Date: Sat, 1 Jun 2013 02:10:29 +0200 Subject: [PATCH] ValueList and some cleanup --- CMakeLists.txt | 1 + grammar/grammar.y | 9 +++++---- inc/AST/ASTVisitor.h | 6 ++++-- inc/AST/AssignmentExpression.h | 17 ++++++++--------- inc/AST/ValueList.h | 21 +++++++++++++++++++++ src/AST/AssignmentExpression.cpp | 12 ++++++------ src/AST/ValueList.cpp | 22 ++++++++++++++++++++++ 7 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 inc/AST/ValueList.h create mode 100644 src/AST/ValueList.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e26a925..1dc5a73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ SET(SCULLY_SOURCE src/AST/ParameterList.cpp src/AST/Statement.cpp src/AST/Type.cpp + src/AST/ValueList.cpp src/AST/VariableDefinition.cpp ${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp diff --git a/grammar/grammar.y b/grammar/grammar.y index 64e70db..f44fa49 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -16,6 +16,7 @@ #include "AST/Statement.h" #include "AST/StatementList.h" #include "AST/Type.h" +#include "AST/ValueList.h" #include "AST/VariableDefinition.h" } @@ -95,8 +96,8 @@ expr(A) ::= T_IDENTIFIER(ID) T_LPAREN values(V) T_RPAREN. { A = 0; /* ID V */ %type vardef {VariableDefinition*} vardef(A) ::= type(T) T_IDENTIFIER(ID). { A = new VariableDefinition(T, ID->getText()); } -%type values {int} -values(A) ::= . { A = 0; } -values(A) ::= expr(E). { A = 1; /* E */ } -values(A) ::= values(B) T_COMMA expr(E). { A = B + 1; /* E */ } +%type values {ValueList*} +values(A) ::= . { A = new ValueList(); } +values(A) ::= expr(E). { A = new ValueList(); A->addValue(E); } +values(A) ::= values(B) T_COMMA expr(E). { B->addValue(E); A = B; } diff --git a/inc/AST/ASTVisitor.h b/inc/AST/ASTVisitor.h index c43ef93..2c733f3 100644 --- a/inc/AST/ASTVisitor.h +++ b/inc/AST/ASTVisitor.h @@ -5,8 +5,9 @@ #include "BinOp.h" #include "ConstantExpression.h" #include "IfStatement.h" -#include "VariableDefinition.h" #include "ParameterList.h" +#include "ValueList.h" +#include "VariableDefinition.h" class ASTVisitor { public: @@ -16,8 +17,9 @@ public: virtual void visit(AssignmentExpression* e) = 0; virtual void visit(BinOp* e) = 0; virtual void visit(ConstantExpression* e) = 0; - virtual void visit(IfStatement* e) = 0; + virtual void visit(IfStatement* e) = 0; virtual void visit(ParameterList* e) = 0; + virtual void visit(ValueList* e) = 0; virtual void visit(VariableDefinition* e) = 0; }; diff --git a/inc/AST/AssignmentExpression.h b/inc/AST/AssignmentExpression.h index a910824..a0d3d9f 100644 --- a/inc/AST/AssignmentExpression.h +++ b/inc/AST/AssignmentExpression.h @@ -4,19 +4,18 @@ #include "AST/Expression.h" #include -class AssignmentExpression : public Expression -{ +class AssignmentExpression : public Expression { public: - AssignmentExpression(std::string id, Expression* expr); - virtual ~AssignmentExpression(); + AssignmentExpression(std::string id, Expression* expr); + virtual ~AssignmentExpression(); - virtual void accept(ASTVisitor *visitor); + virtual void accept(ASTVisitor *visitor); - std::string getId(); - Expression* getExpr(); + std::string getId(); + Expression* getExpr(); private: - std::string id_; - Expression* expr_; + std::string id_; + Expression* expr_; }; #endif // ASSIGNMENTEXPRESSION_H diff --git a/inc/AST/ValueList.h b/inc/AST/ValueList.h new file mode 100644 index 0000000..e9a9b87 --- /dev/null +++ b/inc/AST/ValueList.h @@ -0,0 +1,21 @@ +#ifndef VALUELIST_H +#define VALUELIST_H + +#include "AST/ASTElement.h" +#include "AST/Expression.h" +#include + +class ValueList : public ASTElement { +public: + ValueList(); + ~ValueList(); + + virtual void accept(ASTVisitor* visitor); + + void addValue(Expression* expr); + std::vector getValues(); +private: + std::vector values_; +}; + +#endif // VALUELIST_H diff --git a/src/AST/AssignmentExpression.cpp b/src/AST/AssignmentExpression.cpp index 182859a..44bd3e7 100644 --- a/src/AST/AssignmentExpression.cpp +++ b/src/AST/AssignmentExpression.cpp @@ -1,22 +1,22 @@ #include "AST/AssignmentExpression.h" #include "AST/ASTVisitor.h" -AssignmentExpression::AssignmentExpression(std::string id, Expression *expr) : id_(id),expr_(expr) -{ - // +AssignmentExpression::AssignmentExpression(std::string id, Expression *expr) : id_(id), expr_(expr) { + // } AssignmentExpression::~AssignmentExpression() { + // } void AssignmentExpression::accept(ASTVisitor *visitor) { - visitor->visit(this); + visitor->visit(this); } std::string AssignmentExpression::getId() { - return id_; + return id_; } Expression* AssignmentExpression::getExpr() { - return expr_; + return expr_; } diff --git a/src/AST/ValueList.cpp b/src/AST/ValueList.cpp new file mode 100644 index 0000000..86cbe68 --- /dev/null +++ b/src/AST/ValueList.cpp @@ -0,0 +1,22 @@ +#include "AST/ValueList.h" +#include "AST/ASTVisitor.h" + +ValueList::ValueList() { + // +} + +ValueList::~ValueList() { + // +} + +void ValueList::accept(ASTVisitor* visitor) { + visitor->visit(this); +} + +void ValueList::addValue(Expression* expr) { + values_.push_back(expr); +} + +std::vector ValueList::getValues() { + return values_; +}