123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #ifndef AST_H
- #define AST_H
- #include "llvm/ADT/STLExtras.h"
- #include "llvm/IR/IRBuilder.h"
- #include "llvm/IR/LLVMContext.h"
- #include "llvm/IR/Module.h"
- #include "llvm/IR/Verifier.h"
- #include <cctype>
- #include <cstdio>
- #include <map>
- #include <string>
- #include <vector>
- using namespace llvm;
- //===----------------------------------------------------------------------===//
- // Abstract Syntax Tree (aka Parse Tree)
- //===----------------------------------------------------------------------===//
- namespace ast{
- // struct instantiated by the 'main' to access data structures if llvm IR.
- struct AstTree {
- public:
- static std::unique_ptr<llvm::Module> TheModule;
- static llvm::IRBuilder<> Builder;
- static std::map<std::string, llvm::Value *> NamedValues;
- static void InitializeModuleAndPassManager();
- };
- /// ExprAST - Base class for all expression nodes.
- class ExprAST {
- public:
- virtual ~ExprAST() {}
- virtual llvm::Value *codegen() = 0;
- };
- /// NumberExprAST - Expression class for numeric literals like "1.0".
- class NumberExprAST : public ExprAST {
- double Val;
- public:
- NumberExprAST(double Val) : Val(Val) {}
- Value *codegen() override;
- };
- /// VariableExprAST - Expression class for referencing a variable, like "a".
- class VariableExprAST : public ExprAST {
- std::string Name;
- public:
- VariableExprAST(const std::string &Name) : Name(Name) {}
- Value *codegen() override;
- };
- /// BinaryExprAST - Expression class for a binary operator.
- class BinaryExprAST : public ExprAST {
- char Op;
- std::unique_ptr<ExprAST> LHS, RHS;
- public:
- BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
- std::unique_ptr<ExprAST> RHS)
- : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
- Value *codegen() override;
- };
- /// CallExprAST - Expression class for function calls.
- class CallExprAST : public ExprAST {
- std::string Callee;
- std::vector<std::unique_ptr<ExprAST>> Args;
- public:
- CallExprAST(const std::string &Callee,
- std::vector<std::unique_ptr<ExprAST>> Args)
- : Callee(Callee), Args(std::move(Args)) {}
- Value *codegen() override;
- };
- /// PrototypeAST - This class represents the "prototype" for a function,
- /// which captures its name, and its argument names (thus implicitly the number
- /// of arguments the function takes).
- class PrototypeAST {
- std::string Name;
- std::vector<std::string> Args;
- public:
- PrototypeAST(const std::string &Name, std::vector<std::string> Args)
- : Name(Name), Args(std::move(Args)) {}
- Function *codegen();
- const std::string &getName() const { return Name; }
- };
- /// FunctionAST - This class represents a function definition itself.
- class FunctionAST {
- std::unique_ptr<PrototypeAST> Proto;
- std::unique_ptr<ExprAST> Body;
- public:
- FunctionAST(std::unique_ptr<PrototypeAST> Proto,
- std::unique_ptr<ExprAST> Body)
- : Proto(std::move(Proto)), Body(std::move(Body)) {}
- Function *codegen();
- };
- // method added from chapter 3 of the tutorial
- } // end anonymous namespace
- #endif
|