diff --git a/CMakeLists.txt b/CMakeLists.txt index bad19dd..26a1ad2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,7 @@ SET(SCULLY_SOURCE src/AST/BinOpExpression.cpp src/AST/CodeGenVisitor.cpp src/AST/ConstantExpression.cpp + src/AST/LoadExpression.cpp src/AST/Expression.cpp src/AST/ExpressionStatement.cpp src/AST/ForStatement.cpp @@ -83,6 +84,8 @@ SET(SCULLY_SOURCE src/AST/Type.cpp src/AST/VariableDefinition.cpp src/AST/ValueList.cpp + src/AST/LoadExpression.cpp + ${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp ) diff --git a/grammar/grammar.y b/grammar/grammar.y index b3bbc89..1a8401e 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -18,6 +18,7 @@ #include "AST/FunctionCallExpression.h" #include "AST/FunctionDefinition.h" #include "AST/IfStatement.h" +#include "AST/LoadExpression.h" #include "AST/ParameterList.h" #include "AST/PrintVisitor.h" #include "AST/RandomForStatement.h" @@ -93,6 +94,7 @@ statements(A) ::= . { A = new StatementList(); } 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, "==", C); } expr(A) ::= expr(B) T_LESS expr(C). { A = new BinOpExpression(B, "<", C); } diff --git a/inc/AST/ASTVisitor.h b/inc/AST/ASTVisitor.h index ca9acf9..4747142 100644 --- a/inc/AST/ASTVisitor.h +++ b/inc/AST/ASTVisitor.h @@ -17,6 +17,7 @@ #include "StatementList.h" #include "ValueList.h" #include "VariableDefinition.h" +#include "LoadExpression.h" class ASTVisitor { @@ -40,6 +41,7 @@ public: virtual void visit(StatementList* e) = 0; virtual void visit(ValueList* e) = 0; virtual void visit(VariableDefinition* e) = 0; + virtual void visit(LoadExpression* e) = 0; }; #endif // ASTVISITOR_H diff --git a/inc/AST/CodeGenVisitor.h b/inc/AST/CodeGenVisitor.h index 6b3ac65..be52f2b 100644 --- a/inc/AST/CodeGenVisitor.h +++ b/inc/AST/CodeGenVisitor.h @@ -29,11 +29,15 @@ public: virtual void visit(StatementList* e); virtual void visit(ValueList* e); virtual void visit(VariableDefinition* e); + virtual void visit(LoadExpression* e); + + void createAnonymousFunction(); private: llvm::IRBuilder<>* builder_; llvm::FunctionPassManager* fpm_; llvm::Module* module_; std::map namedValues_; + llvm::Value* value_; }; #endif // CODEGENVISITOR_H diff --git a/inc/AST/LoadExpression.h b/inc/AST/LoadExpression.h new file mode 100644 index 0000000..cb85a80 --- /dev/null +++ b/inc/AST/LoadExpression.h @@ -0,0 +1,19 @@ +#ifndef LOADEXPRESSION_H +#define LOADEXPRESSION_H + +#include +#include "AST/Expression.h" + +class LoadExpression : public Expression { +public: + LoadExpression(std::string id); + virtual ~LoadExpression(); + + virtual void accept(ASTVisitor *visitor); + + std::string getId(); +private: + std::string id_; +}; + +#endif // LOADEXPRESSION_H diff --git a/inc/AST/PrintVisitor.h b/inc/AST/PrintVisitor.h index 03f10e8..e8bba3b 100644 --- a/inc/AST/PrintVisitor.h +++ b/inc/AST/PrintVisitor.h @@ -25,6 +25,7 @@ public: virtual void visit(StatementList* e); virtual void visit(ValueList* e); virtual void visit(VariableDefinition* e); + virtual void visit(LoadExpression* e); private: int level_; void indent(); diff --git a/src/AST/CodeGenVisitor.cpp b/src/AST/CodeGenVisitor.cpp index 78454bb..1570e51 100644 --- a/src/AST/CodeGenVisitor.cpp +++ b/src/AST/CodeGenVisitor.cpp @@ -14,9 +14,42 @@ void CodeGenVisitor::visit(AssignmentExpression* e) { } void CodeGenVisitor::visit(BinOpExpression* e) { + e->getLeftExp()->accept(this); + llvm::Value* lhs = value_; + e->getRightExp()->accept(this); + llvm::Value* rhs = value_; + + if ((!lhs) || (!rhs)) { + // TODO error + return; + } + +// switch (e->getOp()) { +// case "+": + value_ = builder_->CreateAdd(lhs, rhs, "addtmp"); +// break; +// case "-": +// value_ = builder_->CreateSub(lhs, rhs, "subtmp"); +// break; +// case "*": +// value_ = builder_->CreateMul(lhs, rhs, "multmp"); +// break; +// case "/": +// value_ = builder_->CreateSDiv(lhs, rhs, "divtmp"); +// break; +// case "==": +// value_ = builder_->CreateICmpEQ(lhs, rhs, "eqtmp"); +// break; +// default: +// // TODO error +// break; +// } + + value_->dump(); } void CodeGenVisitor::visit(ConstantExpression* e) { + value_ = llvm::ConstantInt::get(llvm::getGlobalContext(), llvm::APInt(32, e->getValue(), 10)); } void CodeGenVisitor::visit(ExpressionStatement* e) { @@ -57,3 +90,13 @@ void CodeGenVisitor::visit(ValueList* e) { void CodeGenVisitor::visit(VariableDefinition* e) { } + +void CodeGenVisitor::visit(LoadExpression *e) { +} + +void CodeGenVisitor::createAnonymousFunction() { + if (value_) { + value_->dump(); + } + // TODO implement +} diff --git a/src/AST/LoadExpression.cpp b/src/AST/LoadExpression.cpp new file mode 100644 index 0000000..c05f17b --- /dev/null +++ b/src/AST/LoadExpression.cpp @@ -0,0 +1,19 @@ +#include "AST/LoadExpression.h" +#include "AST/ASTVisitor.h" + + +LoadExpression::LoadExpression(std::string id): id_(id) { + // +} + +LoadExpression::~LoadExpression() { + // +} + +void LoadExpression::accept(ASTVisitor *visitor) { + visitor->visit(this); +} + +std::string LoadExpression::getId() { + return id_; +} diff --git a/src/AST/PrintVisitor.cpp b/src/AST/PrintVisitor.cpp index 7ff7ae8..38adeaa 100644 --- a/src/AST/PrintVisitor.cpp +++ b/src/AST/PrintVisitor.cpp @@ -194,6 +194,15 @@ void PrintVisitor::visit(VariableDefinition* e) { level_--; } +void PrintVisitor::visit(LoadExpression *e) { + println("LoadExpression"); + level_++; + std::stringstream ss; + ss << "Name: " << e->getId(); + println(ss.str()); + level_--; +} + void PrintVisitor::indent() { for (int i = 0; i < level_; i++) { std::cout << " ";