#include #include #include namespace LX { // Wrapper over the LLVM variables for easier passing around // struct InfoLLVM { // Constructor to initalize them correctly (only constructor available) // InfoLLVM(std::string name); llvm::LLVMContext context; llvm::Module module; llvm::IRBuilder<> builder; }; // Function to turn a AST node into string // std::string ToString(std::unique_ptr& node); } namespace LX::AST { // Node to represent any number within the AST // class NumberLiteral : public Node { public: // Constructor to set values and automatically set type // NumberLiteral(std::string num); // Function for generating LLVN IR (Intermediate representation) // llvm::Value* GenIR(InfoLLVM& LLVM) override; private: // The number it stores // // Yes the number is stored as a string, It's horrible I know // std::string m_Number; }; // Node to represent any 2-sided mathematical or logical operation within the AST // class Operation : public Node { public: // Constructor to set values and automatically set type // Operation(std::unique_ptr lhs, Token::TokenType op, std::unique_ptr rhs); // Function for generating LLVN IR (Intermediate representation) // llvm::Value* GenIR(InfoLLVM& LLVM) override; private: // The sides of the operation // // Unary operations are handled by a different class // std::unique_ptr m_Lhs, m_Rhs; // The operation to be applied to the two sides // Token::TokenType m_Operand; }; // Node to represent any return statement within the AST // class ReturnStatement : public Node { public: // Constructor to set values and automatically set type ReturnStatement(std::unique_ptr val); // Function for generating LLVN IR (Intermediate representation) // llvm::Value* GenIR(InfoLLVM& LLVM) override; private: // What it is returning (can be null) // std::unique_ptr m_Val; }; }