Nicolas Winkler 6 yıl önce
ebeveyn
işleme
c4b763b228
5 değiştirilmiş dosya ile 68 ekleme ve 12 silme
  1. 29 2
      src/CodegenVisitor.cpp
  2. 9 3
      src/CodegenVisitor.h
  3. 17 0
      src/Semantic.cpp
  4. 13 1
      src/Semantic.h
  5. 0 6
      src/Visitor.h

+ 29 - 2
src/CodegenVisitor.cpp

@@ -1,14 +1,41 @@
 #include "CodegenVisitor.h"
 
 #include <llvm/IR/Constants.h>
+#include <llvm/IR/IRBuilder.h>
 
 
 using namespace qlow;
 
-llvm::Value* CodegenVisitor::visit(sem::IntConst& node, llvm::LLVMContext& context)
+llvm::Value* CodegenVisitor::visit(sem::BinaryOperation& binop, llvm::IRBuilder<>& builder)
 {
-    return llvm::ConstantInt::get(context, llvm::APInt(32, std::to_string(node.value), 10));
+    using llvm::Value;
+    Value* left = binop.left->accept(*this, builder);
+    Value* right = binop.right->accept(*this, builder);
+    switch (binop.op) {
+        case ast::Operation::Operator::PLUS:
+            return builder.CreateAdd(left, right, "add");
+        case ast::Operation::Operator::MINUS:
+            return builder.CreateSub(left, right, "sub");
+        case ast::Operation::Operator::ASTERISK:
+            return builder.CreateMul(left, right, "mul");
+        case ast::Operation::Operator::SLASH:
+            return builder.CreateSDiv(left, right, "add");
+    }
 }
 
 
+llvm::Value* CodegenVisitor::visit(sem::UnaryOperation& unop, llvm::IRBuilder<>& builder)
+{
+    using llvm::Value;
+}
+
+llvm::Value* CodegenVisitor::visit(sem::FeatureCallExpression& binop, llvm::IRBuilder<>& builder)
+{
+    using llvm::Value;
+}
+
+llvm::Value* CodegenVisitor::visit(sem::IntConst& node, llvm::IRBuilder<>& builder)
+{
+    return llvm::ConstantInt::get(builder.getContext(), llvm::APInt(32, std::to_string(node.value), 10));
+}
 

+ 9 - 3
src/CodegenVisitor.h

@@ -2,7 +2,7 @@
 #define QLOW_CODEGEN_VISITOR_H
 
 #include <llvm/IR/Value.h>
-#include <llvm/IR/LLVMContext.h>
+#include <llvm/IR/IRBuilder.h>
 
 #include "Visitor.h"
 #include "Semantic.h"
@@ -30,13 +30,19 @@ namespace qlow
 class qlow::CodegenVisitor :
     public Visitor<
         llvm::Value*,
-        llvm::LLVMContext,
+        llvm::IRBuilder<>,
 
+        sem::BinaryOperation,
+        sem::UnaryOperation,
+        sem::FeatureCallExpression,
         sem::IntConst
     >
 {
 public:
-    llvm::Value* visit(sem::IntConst& node, llvm::LLVMContext&) override;
+    llvm::Value* visit(sem::BinaryOperation& node, llvm::IRBuilder<>&) override;
+    llvm::Value* visit(sem::UnaryOperation& node, llvm::IRBuilder<>&) override;
+    llvm::Value* visit(sem::FeatureCallExpression& node, llvm::IRBuilder<>&) override;
+    llvm::Value* visit(sem::IntConst& node, llvm::IRBuilder<>&) override;
 };
 
 

+ 17 - 0
src/Semantic.cpp

@@ -1,6 +1,8 @@
 #include "Semantic.h"
 #include "AstVisitor.h"
 
+#include "CodegenVisitor.h"
+
 #include "Util.h"
 
 using namespace qlow::sem;
@@ -123,6 +125,19 @@ std::string Method::toString(void) const
 }
 
 
+
+#define ACCEPT_DEFINITION(ClassName, Visitor) \
+llvm::Value* ClassName::accept(Visitor& v, llvm::IRBuilder<>& context) \
+{ \
+    return v.visit(*this, context); \
+}
+
+ACCEPT_DEFINITION(BinaryOperation, CodegenVisitor)
+ACCEPT_DEFINITION(UnaryOperation, CodegenVisitor)
+ACCEPT_DEFINITION(FeatureCallExpression, CodegenVisitor)
+ACCEPT_DEFINITION(IntConst, CodegenVisitor)
+
+
 std::string SemanticException::getMessage(void) const
 {
     std::map<ErrorCode, std::string> error = {
@@ -137,3 +152,5 @@ std::string SemanticException::getMessage(void) const
 
 
 
+
+

+ 13 - 1
src/Semantic.h

@@ -5,6 +5,10 @@
 #include <map>
 #include "Util.h"
 #include "Ast.h"
+#include "Visitor.h"
+
+#include <llvm/IR/Value.h>
+#include <llvm/IR/IRBuilder.h>
 
 namespace qlow
 {
@@ -46,6 +50,8 @@ namespace qlow
 
         class SemanticException;
     }
+    
+    class CodegenVisitor;
 }
 
 
@@ -134,7 +140,7 @@ struct qlow::sem::AssignmentStatement : public Statement
 };
 
 
-struct qlow::sem::Expression : public SemanticObject
+struct qlow::sem::Expression : public SemanticObject, public Visitable<llvm::Value*, llvm::IRBuilder<>, qlow::CodegenVisitor>
 {
 };
 
@@ -149,6 +155,8 @@ struct qlow::sem::BinaryOperation : public Operation
 {
     std::unique_ptr<Expression> left;
     std::unique_ptr<Expression> right;
+    
+    virtual llvm::Value* accept(CodegenVisitor& visitor, llvm::IRBuilder<>& arg2);
 };
 
 
@@ -156,12 +164,14 @@ struct qlow::sem::UnaryOperation : public Operation
 {
     qlow::ast::UnaryOperation::Side side;
     std::unique_ptr<Expression> arg;
+    virtual llvm::Value* accept(CodegenVisitor& visitor, llvm::IRBuilder<>& arg2);
 };
 
 struct qlow::sem::FeatureCallExpression : public Expression
 {
     Method* callee;
     OwningList<Expression> arguments;
+    virtual llvm::Value* accept(CodegenVisitor& visitor, llvm::IRBuilder<>& arg2);
 };
 
 
@@ -173,6 +183,8 @@ struct qlow::sem::IntConst : public Expression
         value{ value }
     {
     }
+    
+    virtual llvm::Value* accept(CodegenVisitor& visitor, llvm::IRBuilder<>& arg2);
 };
 
 

+ 0 - 6
src/Visitor.h

@@ -21,9 +21,6 @@ namespace qlow
     public:
         using ReturnType = R;
         virtual R visit(T& arg, A& arg2) = 0;
-        inline R invokeVisit(T& arg, A& arg2) {
-            arg.accept(*this, arg2);
-        }
     };
 
 
@@ -35,9 +32,6 @@ namespace qlow
         using Visitor<R, A, V...>::visit;
         using ReturnType = R;
         virtual R visit(T& arg, A& arg2) = 0;
-        inline R invokeVisit(T& arg, A& arg2) {
-            arg.accept(*this, arg2);
-        }
     };