#ifndef MODULE_BUILDER_H #define MODULE_BUILDER_H #include #include #include #include #include #include #include #include #include class Error; class ValueType; class Expression; class ExpressionGrouping; class ExpressionLiteral; class ExpressionArrayLiteral; class ExpressionVariable; class ExpressionCall; class ExpressionIfElse; class ExpressionBinary; enum class ExpressionBinaryOperation; class Statement; class StatementFunction; class StatementRawFunction; class StatementVariable; class StatementAssignment; class StatementReturn; class StatementExpression; class StatementRepeat; class StatementMetaExternFunction; class StatementBlock; using namespace std; typedef struct { map allocaMap; map funMap; map rawFunMap; } Scope; class ModuleBuilder { private: vector> errors; string moduleName; string sourceFileName; shared_ptr context; shared_ptr module; shared_ptr> builder; llvm::Type *typeVoid; llvm::Type *typeBool; llvm::IntegerType *typeSint32; llvm::Type *typeReal32; vector> statements; stack scopes; void buildStatement(shared_ptr statement); void buildFunction(shared_ptr statement); void buildRawFunction(shared_ptr statement); void buildVarDeclaration(shared_ptr statement); void buildAssignment(shared_ptr statement); void buildBlock(shared_ptr statement); void buildReturn(shared_ptr statement); void buildLoop(shared_ptr statement); void buildMetaExternFunction(shared_ptr statement); void buildExpression(shared_ptr statement); llvm::Value *valueForExpression(shared_ptr expression); vector valuesForExpression(shared_ptr expression); llvm::Value *valueForLiteral(shared_ptr expression); vector valuesForArrayLiteral(shared_ptr expression); llvm::Value *valueForGrouping(shared_ptr expression); llvm::Value *valueForBinary(shared_ptr expression); llvm::Value *valueForBinaryBool(ExpressionBinaryOperation operation, llvm::Value *leftValue, llvm::Value *rightValue); llvm::Value *valueForBinaryInteger(ExpressionBinaryOperation operation, llvm::Value *leftValue, llvm::Value *rightValue); llvm::Value *valueForBinaryReal(ExpressionBinaryOperation operation, llvm::Value *leftValue, llvm::Value *rightValue); llvm::Value *valueForIfElse(shared_ptr expression); llvm::Value *valueForVar(shared_ptr expression); llvm::Value *valueForCall(shared_ptr expression); bool setAlloca(string name, llvm::AllocaInst *alloca); llvm::AllocaInst *getAlloca(string name); bool setFun(string name, llvm::Function *fun); llvm::Function *getFun(string name); bool setRawFun(string name, llvm::InlineAsm *rawFun); llvm::InlineAsm *getRawFun(string name); llvm::Type *typeForValueType(shared_ptr valueType, int count = 0); void markError(int line, int column, string message); public: ModuleBuilder(string moduleName, string sourceFileName, vector> statements); shared_ptr getModule(); }; #endif