Ast.h 2.7 KB

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