diff options
Diffstat (limited to 'include/cps')
| -rw-r--r-- | include/cps/AST.h | 63 | ||||
| -rw-r--r-- | include/cps/CodeGen.h | 32 | ||||
| -rw-r--r-- | include/cps/Lexer.h | 27 | ||||
| -rw-r--r-- | include/cps/Parser.h | 25 |
4 files changed, 147 insertions, 0 deletions
diff --git a/include/cps/AST.h b/include/cps/AST.h new file mode 100644 index 0000000..5b28e8a --- /dev/null +++ b/include/cps/AST.h @@ -0,0 +1,63 @@ +#pragma once +#include <string> +#include <memory> +#include <vector> + +namespace cps { + +class ExprAST { +public: + virtual ~ExprAST() = default; +}; + +class NumberExprAST : public ExprAST { + int Val; +public: + NumberExprAST(int Val) : Val(Val) {} + int getVal() const { return Val; } +}; + +class VariableExprAST : public ExprAST { + std::string Name; +public: + VariableExprAST(const std::string &Name) : Name(Name) {} + const std::string &getName() const { return Name; } +}; + +class StmtAST { +public: + virtual ~StmtAST() = default; +}; + +class DeclareStmtAST : public StmtAST { + std::string Name; +public: + DeclareStmtAST(const std::string &Name) : Name(Name) {} + const std::string &getName() const { return Name; } +}; + +class AssignStmtAST : public StmtAST { + std::string Name; + std::unique_ptr<ExprAST> Expr; +public: + AssignStmtAST(const std::string &Name, std::unique_ptr<ExprAST> Expr) + : Name(Name), Expr(std::move(Expr)) {} + const std::string &getName() const { return Name; } + ExprAST *getExpr() const { return Expr.get(); } +}; + +class InputStmtAST : public StmtAST { + std::string Name; +public: + InputStmtAST(const std::string &Name) : Name(Name) {} + const std::string &getName() const { return Name; } +}; + +class OutputStmtAST : public StmtAST { + std::unique_ptr<ExprAST> Expr; +public: + OutputStmtAST(std::unique_ptr<ExprAST> Expr) : Expr(std::move(Expr)) {} + ExprAST *getExpr() const { return Expr.get(); } +}; + +} // namespace cps diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h new file mode 100644 index 0000000..2621795 --- /dev/null +++ b/include/cps/CodeGen.h @@ -0,0 +1,32 @@ +#pragma once +#include "cps/AST.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include <map> + +namespace cps { + +class CodeGen { + std::unique_ptr<llvm::LLVMContext> TheContext; + std::unique_ptr<llvm::Module> TheModule; + std::unique_ptr<llvm::IRBuilder<>> Builder; + std::map<std::string, llvm::AllocaInst*> NamedValues; + + llvm::AllocaInst *CreateEntryBlockAlloca(llvm::Function *TheFunction, + const std::string &VarName); + + llvm::FunctionCallee PrintfFunc; + llvm::FunctionCallee ScanfFunc; + llvm::Value *PrintfFormatStr; + llvm::Value *ScanfFormatStr; + + void SetupExternalFunctions(); + +public: + CodeGen(); + void compile(const std::vector<std::unique_ptr<StmtAST>> &Statements); + void print(); +}; + +} // namespace cps diff --git a/include/cps/Lexer.h b/include/cps/Lexer.h new file mode 100644 index 0000000..0ad5609 --- /dev/null +++ b/include/cps/Lexer.h @@ -0,0 +1,27 @@ +#pragma once +#include <string> +#include <iostream> + +namespace cps { + +enum Token { + tok_eof = -1, + tok_declare = -2, + tok_integer_kw = -3, // INTEGER + tok_input = -4, + tok_output = -5, + tok_identifier = -6, + tok_number = -7, + tok_assign = -8, // <- + tok_colon = -9 // : +}; + +class Lexer { +public: + std::string IdentifierStr; + int NumVal; + + int gettok(); +}; + +} // namespace cps diff --git a/include/cps/Parser.h b/include/cps/Parser.h new file mode 100644 index 0000000..c24184f --- /dev/null +++ b/include/cps/Parser.h @@ -0,0 +1,25 @@ +#pragma once +#include "cps/Lexer.h" +#include "cps/AST.h" +#include <vector> +#include <memory> + +namespace cps { + +class Parser { + Lexer &Lex; + int CurTok; + + int getNextToken(); + std::unique_ptr<ExprAST> ParseExpression(); + std::unique_ptr<ExprAST> ParseNumberExpr(); + std::unique_ptr<ExprAST> ParseParenExpr(); // 预留 + std::unique_ptr<ExprAST> ParseIdentifierExpr(); + +public: + Parser(Lexer &L) : Lex(L) { getNextToken(); } + + std::vector<std::unique_ptr<StmtAST>> Parse(); +}; + +} // namespace cps |
