CodegenVisitor.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef QLOW_CODEGEN_VISITOR_H
  2. #define QLOW_CODEGEN_VISITOR_H
  3. #include <llvm/IR/Value.h>
  4. #include <llvm/IR/IRBuilder.h>
  5. #include <llvm/IR/BasicBlock.h>
  6. #include "Visitor.h"
  7. #include "Semantic.h"
  8. #include "Scope.h"
  9. #include "Type.h"
  10. #include <memory>
  11. namespace qlow
  12. {
  13. namespace gen
  14. {
  15. class FunctionGenerator;
  16. }
  17. }
  18. namespace qlow
  19. {
  20. class ExpressionVisitor;
  21. class StatementVisitor;
  22. }
  23. class qlow::ExpressionVisitor :
  24. public Visitor<
  25. std::pair<llvm::Value*, sem::Type>,
  26. llvm::IRBuilder<>,
  27. sem::LocalVariableExpression,
  28. sem::BinaryOperation,
  29. sem::UnaryOperation,
  30. sem::FeatureCallExpression,
  31. sem::IntConst
  32. >
  33. {
  34. public:
  35. std::pair<llvm::Value*, sem::Type> visit(sem::LocalVariableExpression& node, llvm::IRBuilder<>&) override;
  36. std::pair<llvm::Value*, sem::Type> visit(sem::BinaryOperation& node, llvm::IRBuilder<>&) override;
  37. std::pair<llvm::Value*, sem::Type> visit(sem::UnaryOperation& node, llvm::IRBuilder<>&) override;
  38. std::pair<llvm::Value*, sem::Type> visit(sem::FeatureCallExpression& node, llvm::IRBuilder<>&) override;
  39. std::pair<llvm::Value*, sem::Type> visit(sem::IntConst& node, llvm::IRBuilder<>&) override;
  40. };
  41. class qlow::StatementVisitor :
  42. public Visitor<
  43. llvm::Value*,
  44. gen::FunctionGenerator,
  45. sem::DoEndBlock,
  46. sem::IfElseBlock,
  47. sem::AssignmentStatement,
  48. sem::ReturnStatement,
  49. sem::FeatureCallStatement
  50. >
  51. {
  52. public:
  53. llvm::Value* visit(sem::DoEndBlock& node, gen::FunctionGenerator&) override;
  54. llvm::Value* visit(sem::IfElseBlock& node, gen::FunctionGenerator&) override;
  55. llvm::Value* visit(sem::AssignmentStatement& node, gen::FunctionGenerator&) override;
  56. llvm::Value* visit(sem::ReturnStatement& node, gen::FunctionGenerator&) override;
  57. llvm::Value* visit(sem::FeatureCallStatement& node, gen::FunctionGenerator&) override;
  58. };
  59. #endif // QLOW_CODEGEN_VISITOR_H