Ast.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef AST_H
  2. #define AST_H
  3. #include "llvm/ADT/STLExtras.h"
  4. #include "llvm/IR/IRBuilder.h"
  5. #include "llvm/IR/LLVMContext.h"
  6. #include "llvm/IR/Module.h"
  7. #include "llvm/IR/Verifier.h"
  8. #include <cctype>
  9. #include <cstdio>
  10. #include <map>
  11. #include <string>
  12. #include <vector>
  13. using namespace llvm;
  14. //===----------------------------------------------------------------------===//
  15. // Abstract Syntax Tree (aka Parse Tree)
  16. //===----------------------------------------------------------------------===//
  17. namespace ast{
  18. // struct instantiated by the 'main' to access data structures if llvm IR.
  19. struct AstTree {
  20. public:
  21. static std::unique_ptr<llvm::Module> TheModule;
  22. static llvm::IRBuilder<> Builder;
  23. static std::map<std::string, llvm::Value *> NamedValues;
  24. static void InitializeModuleAndPassManager();
  25. };
  26. /// ExprAST - Base class for all expression nodes.
  27. class ExprAST {
  28. public:
  29. virtual ~ExprAST() {}
  30. virtual llvm::Value *codegen() = 0;
  31. };
  32. /// NumberExprAST - Expression class for numeric literals like "1.0".
  33. class NumberExprAST : public ExprAST {
  34. double Val;
  35. public:
  36. NumberExprAST(double Val) : Val(Val) {}
  37. Value *codegen() override;
  38. };
  39. /// VariableExprAST - Expression class for referencing a variable, like "a".
  40. class VariableExprAST : public ExprAST {
  41. std::string Name;
  42. public:
  43. VariableExprAST(const std::string &Name) : Name(Name) {}
  44. Value *codegen() override;
  45. };
  46. /// BinaryExprAST - Expression class for a binary operator.
  47. class BinaryExprAST : public ExprAST {
  48. char Op;
  49. std::unique_ptr<ExprAST> LHS, RHS;
  50. public:
  51. BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
  52. std::unique_ptr<ExprAST> RHS)
  53. : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
  54. Value *codegen() override;
  55. };
  56. /// CallExprAST - Expression class for function calls.
  57. class CallExprAST : public ExprAST {
  58. std::string Callee;
  59. std::vector<std::unique_ptr<ExprAST>> Args;
  60. public:
  61. CallExprAST(const std::string &Callee,
  62. std::vector<std::unique_ptr<ExprAST>> Args)
  63. : Callee(Callee), Args(std::move(Args)) {}
  64. Value *codegen() override;
  65. };
  66. /// PrototypeAST - This class represents the "prototype" for a function,
  67. /// which captures its name, and its argument names (thus implicitly the number
  68. /// of arguments the function takes).
  69. class PrototypeAST {
  70. std::string Name;
  71. std::vector<std::string> Args;
  72. public:
  73. PrototypeAST(const std::string &Name, std::vector<std::string> Args)
  74. : Name(Name), Args(std::move(Args)) {}
  75. Function *codegen();
  76. const std::string &getName() const { return Name; }
  77. };
  78. /// FunctionAST - This class represents a function definition itself.
  79. class FunctionAST {
  80. std::unique_ptr<PrototypeAST> Proto;
  81. std::unique_ptr<ExprAST> Body;
  82. public:
  83. FunctionAST(std::unique_ptr<PrototypeAST> Proto,
  84. std::unique_ptr<ExprAST> Body)
  85. : Proto(std::move(Proto)), Body(std::move(Body)) {}
  86. Function *codegen();
  87. };
  88. // method added from chapter 3 of the tutorial
  89. } // end anonymous namespace
  90. #endif