Ast.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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, AllocaInst*> 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. const std::string &getName() const { return Name; }
  39. Value *codegen() override;
  40. };
  41. /// UnaryExprAST - Expression class for a unary operator.
  42. class UnaryExprAST : public ExprAST {
  43. char Opcode;
  44. std::unique_ptr<ExprAST> Operand;
  45. public:
  46. UnaryExprAST(char Opcode, std::unique_ptr<ExprAST> Operand)
  47. : Opcode(Opcode), Operand(std::move(Operand)) {}
  48. Value *codegen() override;
  49. };
  50. /// BinaryExprAST - Expression class for a binary operator.
  51. class BinaryExprAST : public ExprAST {
  52. char Op;
  53. std::unique_ptr<ExprAST> LHS, RHS;
  54. public:
  55. BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
  56. std::unique_ptr<ExprAST> RHS)
  57. : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
  58. Value *codegen() override;
  59. };
  60. /// ExprAST - Base class for all expression nodes.
  61. /// CallExprAST - Expression class for function calls.
  62. class CallExprAST : public ExprAST {
  63. std::string Callee;
  64. std::vector<std::unique_ptr<ExprAST>> Args;
  65. public:
  66. CallExprAST(const std::string &Callee,
  67. std::vector<std::unique_ptr<ExprAST>> Args) : Callee(Callee), Args(std::move(Args)) {}
  68. Value *codegen() override;
  69. };
  70. /// IfExprAST - Expression class for if/then/else.
  71. class IfExprAST : public ExprAST {
  72. std::unique_ptr<ExprAST> Cond, Then, Else;
  73. public:
  74. IfExprAST(std::unique_ptr<ExprAST> Cond, std::unique_ptr<ExprAST> Then,
  75. std::unique_ptr<ExprAST> Else)
  76. : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {}
  77. virtual Value *codegen();
  78. };
  79. /// ForExprAST - Expression class for for/in.
  80. class ForExprAST : public ExprAST {
  81. std::string VarName;
  82. std::unique_ptr<ExprAST> Start, End, Step, Body;
  83. public:
  84. ForExprAST(const std::string &VarName, std::unique_ptr<ExprAST> Start,
  85. std::unique_ptr<ExprAST> End, std::unique_ptr<ExprAST> Step,
  86. std::unique_ptr<ExprAST> Body)
  87. : VarName(VarName), Start(std::move(Start)), End(std::move(End)),
  88. Step(std::move(Step)), Body(std::move(Body)) {}
  89. virtual Value *codegen();
  90. };
  91. /// VarExprAST - Expression class for var/in
  92. class VarExprAST : public ExprAST {
  93. std::vector<std::pair<std::string, std::unique_ptr<ExprAST>>> VarNames;
  94. std::unique_ptr<ExprAST> Body;
  95. public:
  96. VarExprAST(
  97. std::vector<std::pair<std::string, std::unique_ptr<ExprAST>>> VarNames,
  98. std::unique_ptr<ExprAST> Body)
  99. : VarNames(std::move(VarNames)), Body(std::move(Body)) {}
  100. Value *codegen() override;
  101. };
  102. /// PrototypeAST - This class represents the "prototype" for a function,
  103. /// which captures its name, and its argument names (thus implicitly the number
  104. /// of arguments the function takes), as well as if it is an operator.
  105. class PrototypeAST {
  106. std::string Name;
  107. std::vector<std::string> Args;
  108. bool IsOperator;
  109. unsigned Precedence; // Precedence if a binary op.
  110. public:
  111. PrototypeAST(const std::string &Name, std::vector<std::string> Args,
  112. bool IsOperator = false, unsigned Prec = 0)
  113. : Name(Name), Args(std::move(Args)), IsOperator(IsOperator),
  114. Precedence(Prec) {}
  115. Function *codegen();
  116. const std::string &getName() const { return Name; }
  117. bool isUnaryOp() const { return IsOperator && Args.size() == 1; }
  118. bool isBinaryOp() const { return IsOperator && Args.size() == 2; }
  119. char getOperatorName() const {
  120. assert(isUnaryOp() || isBinaryOp());
  121. return Name[Name.size() - 1];
  122. }
  123. unsigned getBinaryPrecedence() const { return Precedence; }
  124. void CreateArgumentAllocas(Function *F);
  125. };
  126. /// FunctionAST - This class represents a function definition itself.
  127. class FunctionAST {
  128. std::unique_ptr<PrototypeAST> Proto;
  129. std::unique_ptr<ExprAST> Body;
  130. public:
  131. FunctionAST(std::unique_ptr<PrototypeAST> Proto,
  132. std::unique_ptr<ExprAST> Body)
  133. : Proto(std::move(Proto)), Body(std::move(Body)) {}
  134. Function *codegen();
  135. };
  136. llvm::Value *ErrorV(const char *Str);
  137. static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
  138. const std::string &VarName);
  139. }
  140. #endif