From f1fedc36ec54578be4983d2fc6abee999dbc51c2 Mon Sep 17 00:00:00 2001 From: ov-4 Date: Thu, 29 Jan 2026 10:41:27 +0000 Subject: Added binary operations +-*/ --- include/cps/AST.h | 12 ++++++++++++ include/cps/CodeGen.h | 1 + include/cps/Lexer.h | 12 +++++++++++- include/cps/Parser.h | 13 ++++++++++--- 4 files changed, 34 insertions(+), 4 deletions(-) (limited to 'include') 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 LHS, RHS; +public: + BinaryExprAST(char Op, std::unique_ptr LHS, std::unique_ptr 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 #include +#include namespace cps { class Parser { Lexer &Lex; int CurTok; + + std::map BinopPrecedence; int getNextToken(); + int GetTokPrecedence(); + std::unique_ptr ParseExpression(); + std::unique_ptr ParsePrimary(); + std::unique_ptr ParseBinOpRHS(int ExprPrec, std::unique_ptr LHS); + std::unique_ptr ParseNumberExpr(); - std::unique_ptr ParseParenExpr(); // 预留 std::unique_ptr ParseIdentifierExpr(); + std::unique_ptr ParseParenExpr(); public: - Parser(Lexer &L) : Lex(L) { getNextToken(); } - + Parser(Lexer &L); std::vector> Parse(); }; -- cgit v1.3.1-4-g156e