Nicolas Winkler 6 vuotta sitten
vanhempi
commit
1d178a1e47
8 muutettua tiedostoa jossa 48 lisäystä ja 63 poistoa
  1. 1 0
      src/AstVisitor.cpp
  2. 0 29
      src/AstVisitor.h
  3. 1 1
      src/CodeGeneration.h
  4. 5 5
      src/CodegenVisitor.cpp
  5. 2 2
      src/CodegenVisitor.h
  6. 5 5
      src/Semantic.cpp
  7. 17 20
      src/Semantic.h
  8. 17 1
      src/Type.h

+ 1 - 0
src/AstVisitor.cpp

@@ -254,6 +254,7 @@ std::unique_ptr<sem::SemanticObject> StructureVisitor::visit(ast::UnaryOperation
     ret->op = ast.op;
     ret->side = ast.side;
     ret->arg = unique_dynamic_cast<sem::Expression>(ast.expr->accept(*this, scope));
+    ret->type = ret->arg->type; // TODO not a feasible assumption
     return ret;
 }
 

+ 0 - 29
src/AstVisitor.h

@@ -16,35 +16,6 @@ namespace qlow
     {
         template<typename T>
         using List = std::vector<std::unique_ptr<T>>;
-
-        // base class
-        struct AstObject;
-
-        struct Class;
-
-        struct FeatureDeclaration;
-
-        struct FieldDeclaration;
-        struct MethodDefinition;
-
-        struct VariableDeclaration;
-        struct ArgumentDeclaration;
-
-        struct DoEndBlock;
-
-        struct Statement;
-        struct Expression;
-
-        struct FeatureCall;
-        struct AssignmentStatement;
-        struct LocalVariableStatement;
-        struct IntConst;
-
-        struct Operation;
-        struct UnaryOperation;
-        struct BinaryOperation;
-        
-        struct NewArrayExpression;
     }
 }
 

+ 1 - 1
src/CodeGeneration.h

@@ -30,7 +30,7 @@ class qlow::gen::FunctionGenerator
 public:
 
     StatementVisitor statementVisitor;
-    ExpressionVisitor expressionVisitor;
+    ExpressionCodegenVisitor expressionVisitor;
 
     inline FunctionGenerator(const sem::Method& m, llvm::Module* module) :
         method{ m }, module{ module }

+ 5 - 5
src/CodegenVisitor.cpp

@@ -9,7 +9,7 @@
 
 using namespace qlow;
 
-std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::LocalVariableExpression& lve, llvm::IRBuilder<>& builder)
+std::pair<llvm::Value*, sem::Type*> ExpressionCodegenVisitor::visit(sem::LocalVariableExpression& lve, llvm::IRBuilder<>& builder)
 {
     assert(lve.var->allocaInst != nullptr);
     if (llvm::dyn_cast<llvm::AllocaInst>(lve.var->allocaInst)) {
@@ -22,7 +22,7 @@ std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::LocalVariableE
 }
 
 
-std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::BinaryOperation& binop, llvm::IRBuilder<>& builder)
+std::pair<llvm::Value*, sem::Type*> ExpressionCodegenVisitor::visit(sem::BinaryOperation& binop, llvm::IRBuilder<>& builder)
 {
     using llvm::Value;
     using sem::Type;
@@ -74,7 +74,7 @@ std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::BinaryOperatio
 }
 
 
-std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::UnaryOperation& unop, llvm::IRBuilder<>& builder)
+std::pair<llvm::Value*, sem::Type*> ExpressionCodegenVisitor::visit(sem::UnaryOperation& unop, llvm::IRBuilder<>& builder)
 {
     using llvm::Value;
     auto [value, type] = unop.arg->accept(*this, builder);
@@ -92,7 +92,7 @@ std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::UnaryOperation
     }
 }
 
-std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::FeatureCallExpression& call, llvm::IRBuilder<>& builder)
+std::pair<llvm::Value*, sem::Type*> ExpressionCodegenVisitor::visit(sem::FeatureCallExpression& call, llvm::IRBuilder<>& builder)
 {
     using llvm::Value;
     std::vector<Value*> arguments;
@@ -117,7 +117,7 @@ std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::FeatureCallExp
     //return { nullptr, sem::Type::NULL_TYPE };
 }
 
-std::pair<llvm::Value*, sem::Type*> ExpressionVisitor::visit(sem::IntConst& node, llvm::IRBuilder<>& builder)
+std::pair<llvm::Value*, sem::Type*> ExpressionCodegenVisitor::visit(sem::IntConst& node, llvm::IRBuilder<>& builder)
 {
     return {
         llvm::ConstantInt::get(builder.getContext(), llvm::APInt(32, std::to_string(node.value), 10)),

+ 2 - 2
src/CodegenVisitor.h

@@ -25,12 +25,12 @@ namespace qlow
 
 namespace qlow
 {
-    class ExpressionVisitor;
+    class ExpressionCodegenVisitor;
     class StatementVisitor;
 }
 
 
-class qlow::ExpressionVisitor :
+class qlow::ExpressionCodegenVisitor :
     public Visitor<
         std::pair<llvm::Value*, sem::Type*>,
         llvm::IRBuilder<>,

+ 5 - 5
src/Semantic.cpp

@@ -169,11 +169,11 @@ ReturnType ClassName::accept(Visitor& v, Arg arg) \
     return v.visit(*this, arg); \
 }
 
-ACCEPT_DEFINITION(LocalVariableExpression, ExpressionVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
-ACCEPT_DEFINITION(BinaryOperation, ExpressionVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
-ACCEPT_DEFINITION(UnaryOperation, ExpressionVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
-ACCEPT_DEFINITION(FeatureCallExpression, ExpressionVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
-ACCEPT_DEFINITION(IntConst, ExpressionVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
+ACCEPT_DEFINITION(LocalVariableExpression, ExpressionCodegenVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
+ACCEPT_DEFINITION(BinaryOperation, ExpressionCodegenVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
+ACCEPT_DEFINITION(UnaryOperation, ExpressionCodegenVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
+ACCEPT_DEFINITION(FeatureCallExpression, ExpressionCodegenVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
+ACCEPT_DEFINITION(IntConst, ExpressionCodegenVisitor, std::pair<llvm::Value* COMMA Type*>, llvm::IRBuilder<>&)
 
 ACCEPT_DEFINITION(AssignmentStatement, StatementVisitor, llvm::Value*, qlow::gen::FunctionGenerator&) 
 ACCEPT_DEFINITION(DoEndBlock, StatementVisitor, llvm::Value*, qlow::gen::FunctionGenerator&) 

+ 17 - 20
src/Semantic.h

@@ -8,6 +8,8 @@
 #include "Visitor.h"
 #include "Scope.h"
 
+#include "Type.h"
+
 #include <llvm/IR/Value.h>
 #include <llvm/IR/IRBuilder.h>
 #include <llvm/IR/BasicBlock.h>
@@ -19,7 +21,6 @@ namespace qlow
         std::unique_ptr<GlobalScope>
             createFromAst(const std::vector<std::unique_ptr<qlow::ast::AstObject>>& objects);
 
-        struct SemanticObject;
         struct Class;
 
         struct Variable;
@@ -52,7 +53,7 @@ namespace qlow
         class SemanticException;
     }
 
-    class ExpressionVisitor;
+    class ExpressionCodegenVisitor;
     class StatementVisitor;
 
     namespace gen
@@ -62,17 +63,6 @@ namespace qlow
 }
 
 
-struct qlow::sem::SemanticObject
-{
-    virtual ~SemanticObject(void);
-    
-    /**
-     * \brief converts the object to a readable string for debugging purposes. 
-     */
-    virtual std::string toString(void) const;
-};
-
-
 struct qlow::sem::Class : public SemanticObject
 {
     qlow::ast::Class* astNode;
@@ -233,8 +223,14 @@ struct qlow::sem::Expression :
     public SemanticObject,
     public Visitable<std::pair<llvm::Value*, sem::Type*>,
                      llvm::IRBuilder<>,
-                     qlow::ExpressionVisitor>
+                     qlow::ExpressionCodegenVisitor>
 {
+    std::unique_ptr<sem::Type> type;
+    
+    inline Expression(std::unique_ptr<Type> type) :
+        type{ std::move(type) }
+    {
+    }
 };
 
 
@@ -248,7 +244,7 @@ struct qlow::sem::LocalVariableExpression : public Expression
 {
     Variable* var;
 
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
     virtual std::string toString(void) const override;
 };
 
@@ -258,7 +254,7 @@ struct qlow::sem::BinaryOperation : public Operation
     std::unique_ptr<Expression> left;
     std::unique_ptr<Expression> right;
     
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
     
     virtual std::string toString(void) const override;
 };
@@ -269,7 +265,7 @@ struct qlow::sem::NewArrayExpression : public Expression
     std::unique_ptr<Type> arrayType;
     std::unique_ptr<Expression> length;
     
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
     virtual std::string toString(void) const override;
 };
 
@@ -278,7 +274,7 @@ struct qlow::sem::UnaryOperation : public Operation
 {
     qlow::ast::UnaryOperation::Side side;
     std::unique_ptr<Expression> arg;
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
     virtual std::string toString(void) const override;
 };
 
@@ -287,7 +283,7 @@ struct qlow::sem::FeatureCallExpression : public Expression
 {
     Method* callee;
     OwningList<Expression> arguments;
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
     
     virtual std::string toString(void) const override;
 };
@@ -298,11 +294,12 @@ struct qlow::sem::IntConst : public Expression
     unsigned long long value;
 
     inline IntConst(unsigned long long value) :
+        Expression{ std::make_unique<NativeType>(NativeType::INTEGER) },
         value{ value }
     {
     }
     
-    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
+    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 };
 
 

+ 17 - 1
src/Type.h

@@ -2,9 +2,9 @@
 #define QLOW_SEM_TYPE_H
 
 #include <memory>
-#include "Semantic.h"
 
 namespace llvm {
+    class Value;
     class Type;
     class LLVMContext;
 }
@@ -13,6 +13,8 @@ namespace qlow
 {
     namespace sem
     {
+        struct SemanticObject;
+        
         // forward declarations
         struct Class;
     }
@@ -29,6 +31,18 @@ namespace qlow
 }
 
 
+struct qlow::sem::SemanticObject
+{
+    virtual ~SemanticObject(void);
+    
+    /**
+     * \brief converts the object to a readable string for debugging purposes. 
+     */
+    virtual std::string toString(void) const;
+};
+
+
+
 class qlow::sem::Type : public SemanticObject
 {
 public:
@@ -38,6 +52,8 @@ public:
     virtual bool isNativeType(void) const = 0;
     virtual bool isArrayType(void) const = 0;
 
+    virtual Scope& getScope(void);
+    
     virtual llvm::Type* getLlvmType(llvm::LLVMContext& context) const = 0;
     
     virtual bool equals(const Type* other) const;