LoadExpression + more CodeGen

This commit is contained in:
Markus Hauschild
2013-06-01 15:48:28 +02:00
parent c4e0c2f298
commit 96731379b4
9 changed files with 102 additions and 0 deletions

View File

@@ -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
)

View File

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

View File

@@ -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

View File

@@ -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<std::string, llvm::Value*> namedValues_;
llvm::Value* value_;
};
#endif // CODEGENVISITOR_H

19
inc/AST/LoadExpression.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef LOADEXPRESSION_H
#define LOADEXPRESSION_H
#include <string>
#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

View File

@@ -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();

View File

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

View File

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

View File

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