From d88b3b5ba06eac711716f10b2713c515c0d62611 Mon Sep 17 00:00:00 2001 From: Florian Sattler Date: Sat, 1 Jun 2013 02:06:24 +0200 Subject: [PATCH 1/3] fix assignment and adding IfStatement --- CMakeLists.txt | 1 + inc/AST/ASTVisitor.h | 2 ++ inc/AST/IfStatement.h | 23 +++++++++++++++++++++++ src/AST/AssignmentExpression.cpp | 2 +- src/AST/IfStatement.cpp | 23 +++++++++++++++++++++++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 inc/AST/IfStatement.h create mode 100644 src/AST/IfStatement.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2414da0..e26a925 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ SET(SCULLY_SOURCE src/AST/BinOp.cpp src/AST/ConstantExpression.cpp src/AST/Expression.cpp + src/AST/IfStatement.cpp src/AST/ParameterList.cpp src/AST/Statement.cpp src/AST/Type.cpp diff --git a/inc/AST/ASTVisitor.h b/inc/AST/ASTVisitor.h index a90d8e4..c43ef93 100644 --- a/inc/AST/ASTVisitor.h +++ b/inc/AST/ASTVisitor.h @@ -4,6 +4,7 @@ #include "AssignmentExpression.h" #include "BinOp.h" #include "ConstantExpression.h" +#include "IfStatement.h" #include "VariableDefinition.h" #include "ParameterList.h" @@ -15,6 +16,7 @@ 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(ParameterList* e) = 0; virtual void visit(VariableDefinition* e) = 0; }; diff --git a/inc/AST/IfStatement.h b/inc/AST/IfStatement.h new file mode 100644 index 0000000..d8f74b3 --- /dev/null +++ b/inc/AST/IfStatement.h @@ -0,0 +1,23 @@ +#ifndef IFSTATEMENT_H +#define IFSTATEMENT_H + +#include "AST/Expression.h" +#include "AST/Statement.h" + +class IfStatement : public Statement +{ +public: + IfStatement(Expression* cond, Statement* stmt); + virtual ~IfStatement(); + + virtual void accept(ASTVisitor *visitor); + + Expression* getCond(); + Statement* getStmt(); +private: + Expression* cond_; + Statement* stmt_; + +}; + +#endif // IFSTATEMENT_H diff --git a/src/AST/AssignmentExpression.cpp b/src/AST/AssignmentExpression.cpp index 4f5f2b8..182859a 100644 --- a/src/AST/AssignmentExpression.cpp +++ b/src/AST/AssignmentExpression.cpp @@ -1,7 +1,7 @@ #include "AST/AssignmentExpression.h" #include "AST/ASTVisitor.h" -AssignmentExpression::AssignmentExpression(std::string id, Expression *expr) +AssignmentExpression::AssignmentExpression(std::string id, Expression *expr) : id_(id),expr_(expr) { // } diff --git a/src/AST/IfStatement.cpp b/src/AST/IfStatement.cpp new file mode 100644 index 0000000..52097a0 --- /dev/null +++ b/src/AST/IfStatement.cpp @@ -0,0 +1,23 @@ +#include "AST/IfStatement.h" +#include "AST/ASTVisitor.h" + +IfStatement::IfStatement(Expression *cond, Statement *stmt) : cond_(cond),stmt_(stmt) +{ + // +} + +IfStatement::~IfStatement(){ + // +} + +void IfStatement::accept(ASTVisitor *visitor) { + visitor->visit(this); +} + +Expression* IfStatement::getCond() { + return cond_; +} + +Statement* IfStatement::getStmt() { + return stmt_; +} From c8a1119ea6b5893f0a70f13e3bb61ebd59c2131e Mon Sep 17 00:00:00 2001 From: Markus Hauschild Date: Sat, 1 Jun 2013 02:10:29 +0200 Subject: [PATCH 2/3] 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_; +} From ecc038f96b2b8c98274a64324a3ca83800e1ab33 Mon Sep 17 00:00:00 2001 From: Markus Hauschild Date: Sat, 1 Jun 2013 02:12:49 +0200 Subject: [PATCH 3/3] Reformat grammar.y (tabwidth 4) --- grammar/grammar.y | 71 +++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/grammar/grammar.y b/grammar/grammar.y index f44fa49..9f3f831 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -43,61 +43,66 @@ } %type program {int} -program ::= fundefs(F). { std::cout << F << std::endl; } -program ::= expr(E). { std::cout << E << std::endl; } +program ::= fundefs(F). { std::cout << F << std::endl; } +program ::= expr(E). { std::cout << E << std::endl; } %type fundefs {int} -fundefs(A) ::= . { A = 0; } -fundefs(A) ::= fundefs fundef(B). { A = A + B; } +fundefs(A) ::= . { A = 0; } +fundefs(A) ::= fundefs fundef(B). { A = A + B; } %type fundef {int} -fundef(A) ::= type(T) T_IDENTIFIER(ID) T_LPAREN params(P) T_RPAREN T_BEGIN statements(S) T_END. { A = 1 + 1 + 1 + S; /* T P ID */ } +fundef(A) ::= type(T) T_IDENTIFIER(ID) T_LPAREN params(P) T_RPAREN T_BEGIN statements(S) T_END. + { A = 1 + 1 + 1 + S; /* T P ID */ } %type type {Type*} -type(A) ::= T_BOOL. { A = new Type("bool"); } -type(A) ::= T_INT. { A = new Type("int"); } +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(A) ::= T_VOID. { A = new Type("void"); } %type params {ParameterList*} -params(A) ::= . { A = new ParameterList(); } -params(A) ::= type(T) T_IDENTIFIER(ID). { A = new ParameterList(); A->addParameter(T, ID->getText()); } -params(A) ::= params(B) T_COMMA type(T) T_IDENTIFIER(ID). { B->addParameter(T, ID->getText()); A = B; } +params(A) ::= . { A = new ParameterList(); } +params(A) ::= type(T) T_IDENTIFIER(ID). { A = new ParameterList(); A->addParameter(T, ID->getText()); } +params(A) ::= params(B) T_COMMA type(T) T_IDENTIFIER(ID). + { B->addParameter(T, ID->getText()); A = B; } %type statement {int} -statement(A) ::= T_IF T_LPAREN expr(E) T_RPAREN statement(S). { A = 1 + S; /* E */ } -statement(A) ::= T_RIF T_LPAREN T_CINT(P) T_RPAREN statement(S). { A = 1 + S; /* P */ } +statement(A) ::= T_IF T_LPAREN expr(E) T_RPAREN statement(S). + { A = 1 + S; /* E */ } +statement(A) ::= T_RIF T_LPAREN T_CINT(P) T_RPAREN statement(S). + { A = 1 + S; /* P */ } statement(A) ::= T_FOR T_LPAREN expr(INIT) T_SEMICOLON expr(COND) T_SEMICOLON expr(STEP) T_RPAREN statement(S). - { A = 1 + 1 + 1 + S; /* INIT COND STEP */ } + { A = 1 + 1 + 1 + S; /* INIT COND STEP */ } statement(A) ::= T_RFOR T_LPAREN expr(INIT) T_SEMICOLON T_CINT(P) T_SEMICOLON expr(STEP) T_RPAREN statement(S). - { A = 1 + 1 + 1 + S; /* INIT P STEP */ } -statement(A) ::= T_RETURN expr(E) T_SEMICOLON. { A = 1; /* E */ } -statement(A) ::= T_BEGIN statements(S) T_END. { A = S; } -statement(A) ::= vardef(V) T_SEMICOLON. { A = 1; /* V */ } -statement(A) ::= expr(E) T_SEMICOLON. { A = 1; /* E */ } + { A = 1 + 1 + 1 + S; /* INIT P STEP */ } +statement(A) ::= T_RETURN expr(E) T_SEMICOLON. { A = 1; /* E */ } +statement(A) ::= T_BEGIN statements(S) T_END. { A = S; } +statement(A) ::= vardef(V) T_SEMICOLON. { A = 1; /* V */ } +statement(A) ::= expr(E) T_SEMICOLON. { A = 1; /* E */ } %type statements {StatementList*} -statements(A) ::= . { A = new StatementList(); } -statements(A) ::= statements(B) statement(C). { B->addStatement(C); A = B; } +statements(A) ::= . { A = new StatementList(); } +statements(A) ::= statements(B) statement(C). { B->addStatement(C); A = B; } %type expr {Expression*} -expr(A) ::= T_IDENTIFIER(ID) T_ASSIGN expr(E). { A = new AssignmentExpression(ID->getText(), E); } -expr(A) ::= expr(B) T_EQUALS expr(C). { A = new BinOp(B, "==", C); } -expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOp(B, "<", C); } -expr(A) ::= expr(B) T_PLUS expr(C). { A = new BinOp(B, "+", C); } -expr(A) ::= expr(B) T_MINUS expr(C). { A = new BinOp(B, "-", C); } -expr(A) ::= expr(B) T_TIMES expr(C). { A = new BinOp(B, "*", C); } -expr(A) ::= expr(B) T_DIV expr(C). { A = new BinOp(B, "/", C); } +expr(A) ::= T_IDENTIFIER(ID) T_ASSIGN expr(E). { A = new AssignmentExpression(ID->getText(), E); } +expr(A) ::= expr(B) T_EQUALS expr(C). { A = new BinOp(B, "==", C); } +expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOp(B, "<", C); } +expr(A) ::= expr(B) T_PLUS expr(C). { A = new BinOp(B, "+", C); } +expr(A) ::= expr(B) T_MINUS expr(C). { A = new BinOp(B, "-", C); } +expr(A) ::= expr(B) T_TIMES expr(C). { A = new BinOp(B, "*", C); } +expr(A) ::= expr(B) T_DIV expr(C). { A = new BinOp(B, "/", C); } expr(A) ::= T_CINT(I). { A = new ConstantExpression(I->getText()); } -expr(A) ::= T_TRUE. { A = new ConstantExpression("true"); } +expr(A) ::= T_TRUE. { A = new ConstantExpression("true"); } expr(A) ::= T_FALSE. { A = new ConstantExpression("false"); } -expr(A) ::= T_IDENTIFIER(ID) T_LPAREN values(V) T_RPAREN. { A = 0; /* ID V */ } +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()); } +vardef(A) ::= type(T) T_IDENTIFIER(ID). { A = new VariableDefinition(T, ID->getText()); } %type values {ValueList*} -values(A) ::= . { A = new 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; } +values(A) ::= values(B) T_COMMA expr(E). { B->addValue(E); A = B; }