aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorov-4 <hausemasterstream@gmail.com>2026-01-29 10:41:27 +0000
committerov-4 <hausemasterstream@gmail.com>2026-01-29 10:41:27 +0000
commitf1fedc36ec54578be4983d2fc6abee999dbc51c2 (patch)
tree959fae06a583e96a219527b7032609f435f9108b /include
parentc2a3cecc1ab2d3f27dcea40a6f0f353b0306d66a (diff)
Added binary operations +-*/
Diffstat (limited to 'include')
-rw-r--r--include/cps/AST.h12
-rw-r--r--include/cps/CodeGen.h1
-rw-r--r--include/cps/Lexer.h12
-rw-r--r--include/cps/Parser.h13
4 files changed, 34 insertions, 4 deletions
diff --git a/include/cps/AST.h b/include/cps/AST.h
index 5b28e8a..4d72040 100644
--- a/include/cps/AST.h
+++ b/include/cps/AST.h
@@ -60,4 +60,16 @@ public:
ExprAST *getExpr() const { return Expr.get(); }
};
+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)) {}
+
+ char getOp() const { return Op; }
+ ExprAST *getLHS() const { return LHS.get(); }
+ ExprAST *getRHS() const { return RHS.get(); }
+};
+
} // namespace cps
diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h
index 2621795..d6a6013 100644
--- a/include/cps/CodeGen.h
+++ b/include/cps/CodeGen.h
@@ -20,6 +20,7 @@ class CodeGen {
llvm::FunctionCallee ScanfFunc;
llvm::Value *PrintfFormatStr;
llvm::Value *ScanfFormatStr;
+ llvm::Value *emitExpr(ExprAST *Expr);
void SetupExternalFunctions();
diff --git a/include/cps/Lexer.h b/include/cps/Lexer.h
index 0ad5609..b5ab37c 100644
--- a/include/cps/Lexer.h
+++ b/include/cps/Lexer.h
@@ -13,7 +13,17 @@ enum Token {
tok_identifier = -6,
tok_number = -7,
tok_assign = -8, // <-
- tok_colon = -9 // :
+ tok_colon = -9, // :
+
+ tok_if = -10,
+ tok_then = -11,
+ tok_else = -12,
+ tok_endif = -13,
+
+ tok_eq = -20, // =
+ tok_ne = -21, // <>
+ tok_le = -22, // <=
+ tok_ge = -23 // >=
};
class Lexer {
diff --git a/include/cps/Parser.h b/include/cps/Parser.h
index c24184f..1b27a22 100644
--- a/include/cps/Parser.h
+++ b/include/cps/Parser.h
@@ -3,22 +3,29 @@
#include "cps/AST.h"
#include <vector>
#include <memory>
+#include <map>
namespace cps {
class Parser {
Lexer &Lex;
int CurTok;
+
+ std::map<char, int> BinopPrecedence;
int getNextToken();
+ int GetTokPrecedence();
+
std::unique_ptr<ExprAST> ParseExpression();
+ std::unique_ptr<ExprAST> ParsePrimary();
+ std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec, std::unique_ptr<ExprAST> LHS);
+
std::unique_ptr<ExprAST> ParseNumberExpr();
- std::unique_ptr<ExprAST> ParseParenExpr(); // 预留
std::unique_ptr<ExprAST> ParseIdentifierExpr();
+ std::unique_ptr<ExprAST> ParseParenExpr();
public:
- Parser(Lexer &L) : Lex(L) { getNextToken(); }
-
+ Parser(Lexer &L);
std::vector<std::unique_ptr<StmtAST>> Parse();
};