BinOp
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
17
inc/AST/BinOp.h
Normal 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
|
||||||
@@ -1,20 +1,12 @@
|
|||||||
#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:
|
||||||
BinOpExpression(Expression* leftExp ,BinOp op, Expression* rightExp);
|
BinOpExpression(Expression* leftExp, BinOp op, Expression* rightExp);
|
||||||
virtual ~BinOpExpression();
|
virtual ~BinOpExpression();
|
||||||
|
|
||||||
BinOp getOp();
|
BinOp getOp();
|
||||||
@@ -31,4 +23,4 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BINOP_H
|
#endif // BINOPEXPRESSION_H
|
||||||
|
|||||||
20
src/AST/BinOp.cpp
Normal file
20
src/AST/BinOp.cpp
Normal 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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user