This commit is contained in:
2013-06-01 17:00:39 +02:00
parent 6d2e40778c
commit c468356c57
7 changed files with 55 additions and 51 deletions

View File

@@ -85,6 +85,7 @@ SET(SCULLY_SOURCE
src/AST/VariableDefinition.cpp src/AST/VariableDefinition.cpp
src/AST/ValueList.cpp src/AST/ValueList.cpp
src/AST/LoadExpression.cpp src/AST/LoadExpression.cpp
src/AST/BinOp.cpp
${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp ${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp

View File

@@ -96,12 +96,12 @@ statements(A) ::= statements(B) statement(C). { B->addStatement(C); A = B; }
%type expr {Expression*} %type expr {Expression*}
expr(A) ::= T_IDENTIFIER(ID). { A = new LoadExpression(ID->getText()); } 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) ::= 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_EQUALS expr(C). { A = new BinOpExpression(B, BinOp::EQUALS, C); }
expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOpExpression(B, OP_LESS, 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, OP_PLUS, 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, OP_MINUS, 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, OP_TIMES, 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, OP_DIV, 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_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_FALSE. { A = new ConstantExpression("false"); }

17
inc/AST/BinOp.h Normal file
View File

@@ -0,0 +1,17 @@
#ifndef BINOP_H
#define BINOP_H
#include <string>
enum class BinOp {
EQUALS,
LESS,
PLUS,
MINUS,
TIMES,
DIV
};
std::string binOpToString(BinOp op);
#endif // BINOP_H

View File

@@ -1,16 +1,8 @@
#ifndef BINOP_H #ifndef BINOPEXPRESSION_H
#define BINOP_H #define BINOPEXPRESSION_H
#include "AST/Expression.h" #include "AST/Expression.h"
#include "AST/BinOp.h"
enum BinOp {
OP_EQUALS,
OP_LESS,
OP_PLUS,
OP_MINUS,
OP_TIMES,
OP_DIV
};
class BinOpExpression : public Expression { class BinOpExpression : public Expression {
public: public:
@@ -31,4 +23,4 @@ private:
}; };
#endif // BINOP_H #endif // BINOPEXPRESSION_H

20
src/AST/BinOp.cpp Normal file
View File

@@ -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";
}
}

View File

@@ -25,19 +25,19 @@ void CodeGenVisitor::visit(BinOpExpression* e) {
} }
switch (e->getOp()) { switch (e->getOp()) {
case OP_PLUS: case BinOp::PLUS:
value_ = builder_->CreateAdd(lhs, rhs, "addtmp"); value_ = builder_->CreateAdd(lhs, rhs, "addtmp");
break; break;
case OP_MINUS: case BinOp::MINUS:
value_ = builder_->CreateSub(lhs, rhs, "subtmp"); value_ = builder_->CreateSub(lhs, rhs, "subtmp");
break; break;
case OP_TIMES: case BinOp::TIMES:
value_ = builder_->CreateMul(lhs, rhs, "multmp"); value_ = builder_->CreateMul(lhs, rhs, "multmp");
break; break;
case OP_DIV: case BinOp::DIV:
value_ = builder_->CreateSDiv(lhs, rhs, "divtmp"); value_ = builder_->CreateSDiv(lhs, rhs, "divtmp");
break; break;
case OP_EQUALS: case BinOp::EQUALS:
value_ = builder_->CreateICmpEQ(lhs, rhs, "eqtmp"); value_ = builder_->CreateICmpEQ(lhs, rhs, "eqtmp");
break; break;
default: default:

View File

@@ -25,33 +25,7 @@ void PrintVisitor::visit(BinOpExpression* e) {
println("BinOpExpression"); println("BinOpExpression");
level_++; level_++;
std::stringstream ss; std::stringstream ss;
std::string opStr; ss << "Operator: " << binOpToString(e->getOp());
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;
println(ss.str()); println(ss.str());
println("LHS:"); println("LHS:");
e->getLeftExp()->accept(this); e->getLeftExp()->accept(this);