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