aboutsummaryrefslogtreecommitdiff
path: root/include/cps
diff options
context:
space:
mode:
Diffstat (limited to 'include/cps')
-rw-r--r--include/cps/AST.h63
-rw-r--r--include/cps/CodeGen.h32
-rw-r--r--include/cps/Lexer.h27
-rw-r--r--include/cps/Parser.h25
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