#ifndef QLOW_CODEGEN_VISITOR_H #define QLOW_CODEGEN_VISITOR_H #include #include #include #include "Visitor.h" #include "Semantic.h" #include "Scope.h" #include "Type.h" #include namespace qlow { namespace gen { class FunctionGenerator; } } namespace qlow { class ExpressionVisitor; class StatementVisitor; } class qlow::ExpressionVisitor : public Visitor< std::pair, llvm::IRBuilder<>, sem::LocalVariableExpression, sem::BinaryOperation, sem::UnaryOperation, sem::FeatureCallExpression, sem::IntConst > { public: std::pair visit(sem::LocalVariableExpression& node, llvm::IRBuilder<>&) override; std::pair visit(sem::BinaryOperation& node, llvm::IRBuilder<>&) override; std::pair visit(sem::UnaryOperation& node, llvm::IRBuilder<>&) override; std::pair visit(sem::FeatureCallExpression& node, llvm::IRBuilder<>&) override; std::pair visit(sem::IntConst& node, llvm::IRBuilder<>&) override; }; class qlow::StatementVisitor : public Visitor< llvm::Value*, gen::FunctionGenerator, sem::DoEndBlock, sem::IfElseBlock, sem::AssignmentStatement, sem::ReturnStatement, sem::FeatureCallStatement > { public: llvm::Value* visit(sem::DoEndBlock& node, gen::FunctionGenerator&) override; llvm::Value* visit(sem::IfElseBlock& node, gen::FunctionGenerator&) override; llvm::Value* visit(sem::AssignmentStatement& node, gen::FunctionGenerator&) override; llvm::Value* visit(sem::ReturnStatement& node, gen::FunctionGenerator&) override; llvm::Value* visit(sem::FeatureCallStatement& node, gen::FunctionGenerator&) override; }; #endif // QLOW_CODEGEN_VISITOR_H