diff --git a/CMakeLists.txt b/CMakeLists.txt index 26a1ad2..0ce7658 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ SET(SCULLY_SOURCE src/AST/VariableDefinition.cpp src/AST/ValueList.cpp src/AST/LoadExpression.cpp + src/AST/BinOp.cpp ${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp diff --git a/grammar/grammar.y b/grammar/grammar.y index f36b954..0f6d787 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -96,12 +96,12 @@ statements(A) ::= statements(B) statement(C). { B->addStatement(C); A = B; } %type expr {Expression*} expr(A) ::= T_IDENTIFIER(ID). { A = new LoadExpression(ID->getText()); } 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 BinOpExpression(B, OP_EQUALS, C); } -expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOpExpression(B, OP_LESS, C); } -expr(A) ::= expr(B) T_PLUS expr(C). { A = new BinOpExpression(B, OP_PLUS, C); } -expr(A) ::= expr(B) T_MINUS expr(C). { A = new BinOpExpression(B, OP_MINUS, C); } -expr(A) ::= expr(B) T_TIMES expr(C). { A = new BinOpExpression(B, OP_TIMES, C); } -expr(A) ::= expr(B) T_DIV expr(C). { A = new BinOpExpression(B, OP_DIV, C); } +expr(A) ::= expr(B) T_EQUALS expr(C). { A = new BinOpExpression(B, BinOp::EQUALS, C); } +expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOpExpression(B, BinOp::LESS, C); } +expr(A) ::= expr(B) T_PLUS expr(C). { A = new BinOpExpression(B, BinOp::PLUS, C); } +expr(A) ::= expr(B) T_MINUS expr(C). { A = new BinOpExpression(B, BinOp::MINUS, C); } +expr(A) ::= expr(B) T_TIMES expr(C). { A = new BinOpExpression(B, BinOp::TIMES, C); } +expr(A) ::= expr(B) T_DIV expr(C). { A = new BinOpExpression(B, BinOp::DIV, C); } expr(A) ::= T_CINT(I). { A = new ConstantExpression(I->getText()); } expr(A) ::= T_TRUE. { A = new ConstantExpression("true"); } expr(A) ::= T_FALSE. { A = new ConstantExpression("false"); } diff --git a/inc/AST/BinOp.h b/inc/AST/BinOp.h new file mode 100644 index 0000000..80b9974 --- /dev/null +++ b/inc/AST/BinOp.h @@ -0,0 +1,17 @@ +#ifndef BINOP_H +#define BINOP_H + +#include + +enum class BinOp { + EQUALS, + LESS, + PLUS, + MINUS, + TIMES, + DIV +}; + +std::string binOpToString(BinOp op); + +#endif // BINOP_H diff --git a/inc/AST/BinOpExpression.h b/inc/AST/BinOpExpression.h index 779c030..c480e93 100644 --- a/inc/AST/BinOpExpression.h +++ b/inc/AST/BinOpExpression.h @@ -1,20 +1,12 @@ -#ifndef BINOP_H -#define BINOP_H +#ifndef BINOPEXPRESSION_H +#define BINOPEXPRESSION_H #include "AST/Expression.h" - -enum BinOp { - OP_EQUALS, - OP_LESS, - OP_PLUS, - OP_MINUS, - OP_TIMES, - OP_DIV -}; +#include "AST/BinOp.h" class BinOpExpression : public Expression { public: - BinOpExpression(Expression* leftExp ,BinOp op, Expression* rightExp); + BinOpExpression(Expression* leftExp, BinOp op, Expression* rightExp); virtual ~BinOpExpression(); BinOp getOp(); @@ -31,4 +23,4 @@ private: }; -#endif // BINOP_H +#endif // BINOPEXPRESSION_H diff --git a/src/AST/BinOp.cpp b/src/AST/BinOp.cpp new file mode 100644 index 0000000..522ac5b --- /dev/null +++ b/src/AST/BinOp.cpp @@ -0,0 +1,20 @@ +#include "AST/BinOp.h" + +std::string binOpToString(BinOp op) { + switch (op) { + case BinOp::DIV: + return "/"; + case BinOp::EQUALS: + return "=="; + case BinOp::LESS: + return "<"; + case BinOp::MINUS: + return "-"; + case BinOp::PLUS: + return "+"; + case BinOp::TIMES: + return "*"; + default: + return "Unknown Op"; + } +} diff --git a/src/AST/CodeGenVisitor.cpp b/src/AST/CodeGenVisitor.cpp index 3dffdce..bcfc3b0 100644 --- a/src/AST/CodeGenVisitor.cpp +++ b/src/AST/CodeGenVisitor.cpp @@ -25,19 +25,19 @@ void CodeGenVisitor::visit(BinOpExpression* e) { } switch (e->getOp()) { - case OP_PLUS: + case BinOp::PLUS: value_ = builder_->CreateAdd(lhs, rhs, "addtmp"); break; - case OP_MINUS: + case BinOp::MINUS: value_ = builder_->CreateSub(lhs, rhs, "subtmp"); break; - case OP_TIMES: + case BinOp::TIMES: value_ = builder_->CreateMul(lhs, rhs, "multmp"); break; - case OP_DIV: + case BinOp::DIV: value_ = builder_->CreateSDiv(lhs, rhs, "divtmp"); break; - case OP_EQUALS: + case BinOp::EQUALS: value_ = builder_->CreateICmpEQ(lhs, rhs, "eqtmp"); break; default: diff --git a/src/AST/PrintVisitor.cpp b/src/AST/PrintVisitor.cpp index a7ff4d2..be6bd01 100644 --- a/src/AST/PrintVisitor.cpp +++ b/src/AST/PrintVisitor.cpp @@ -25,33 +25,7 @@ void PrintVisitor::visit(BinOpExpression* e) { println("BinOpExpression"); level_++; std::stringstream ss; - std::string opStr; - switch (e->getOp()) { - case OP_DIV: - opStr = "/"; - break; - case OP_EQUALS: - opStr = "=="; - break; - case OP_LESS: - opStr = "<"; - break; - case OP_MINUS: - opStr = "-"; - break; - case OP_PLUS: - opStr = "+"; - break; - case OP_TIMES: - opStr = "*"; - break; - default: - opStr = "Unknown Op"; - break; - } - - - ss << "Operator: " << opStr; + ss << "Operator: " << binOpToString(e->getOp()); println(ss.str()); println("LHS:"); e->getLeftExp()->accept(this);