From 852dd278363095575173cba686cf4d7994d30a4d Mon Sep 17 00:00:00 2001 From: PuqiAR Date: Mon, 23 Feb 2026 15:03:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E8=A7=A3=E6=9E=90=E5=99=A8=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BB=88=E6=AD=A2=E7=AC=A6=E9=87=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Parser/ExprParser.cpp | 71 ++++++++++++++++++++++++++++----------- src/Parser/Parser.hpp | 4 ++- src/VM/VM.cpp | 2 +- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/Parser/ExprParser.cpp b/src/Parser/ExprParser.cpp index d426c87..3f6e9cd 100644 --- a/src/Parser/ExprParser.cpp +++ b/src/Parser/ExprParser.cpp @@ -13,15 +13,15 @@ namespace Fig { state = State::ParsingLiteralExpr; const Token &literal_token = consumeToken(); - LiteralExpr *node = new LiteralExpr(literal_token, makeSourceLocation(literal_token)); + LiteralExpr *node = new LiteralExpr(literal_token, makeSourceLocation(literal_token)); return node; } Result Parser::parseIdentiExpr() // 当前token为Identifier调用 { state = State::ParsingIdentiExpr; const Token &identifier = consumeToken(); - IdentiExpr *node = - new IdentiExpr(srcManager.GetSub(identifier.index, identifier.length), makeSourceLocation(identifier)); + IdentiExpr *node = new IdentiExpr( + srcManager.GetSub(identifier.index, identifier.length), makeSourceLocation(identifier)); return node; } @@ -61,7 +61,8 @@ namespace Fig return node; } - Result Parser::parseIndexExpr(Expr *base) // 由 parseExpression调用, 当前token为 `[` + Result Parser::parseIndexExpr( + Expr *base) // 由 parseExpression调用, 当前token为 `[` { state = State::ParsingIndexExpr; const Token &lbracket_token = consumeToken(); // consume `[` @@ -74,8 +75,10 @@ namespace Fig if (currentToken().type != TokenType::RightBracket) // `]` { - return std::unexpected( - Error(ErrorType::SyntaxError, "unclosed brackets", "insert `]`", makeSourceLocation(lbracket_token))); + return std::unexpected(Error(ErrorType::SyntaxError, + "unclosed brackets", + "insert `]`", + makeSourceLocation(lbracket_token))); } consumeToken(); // consume `]` @@ -83,7 +86,8 @@ namespace Fig return indexExpr; } - Result Parser::parseCallExpr(Expr *callee) // 由 parseExpression调用, 当前token为 `(` + Result Parser::parseCallExpr( + Expr *callee) // 由 parseExpression调用, 当前token为 `(` { state = State::ParsingCallExpr; const Token &lparen_token = consumeToken(); // consume `(` @@ -133,24 +137,34 @@ namespace Fig return new CallExpr(callee, callArgs); } - std::unordered_set Parser::getTerminators() + const std::unordered_set &Parser::getBaseTerminators() { - /* - - Syntax terminators: - ; ) ] } , EOF - - */ static const std::unordered_set baseTerminators = {TokenType::Semicolon, TokenType::RightParen, TokenType::RightBracket, TokenType::RightBrace, TokenType::Comma, - TokenType::EndOfFile - - }; + TokenType::EndOfFile}; return baseTerminators; } + + std::unordered_set &Parser::getTerminators() + { + /* + + Syntax terminators: + ; ) ] } , EOF + */ + + static std::unordered_set terminators(getBaseTerminators()); + return terminators; + } + + void Parser::resetTermintors() + { + getTerminators() = getBaseTerminators(); + } + bool Parser::shouldTerminate() { const Token &token = currentToken(); @@ -160,6 +174,15 @@ namespace Fig Result Parser::parseExpression(BindingPower rbp, TokenType stop, TokenType stop2) { + if (!getTerminators().contains(stop)) + { + getTerminators().insert(stop); + } + if (!getTerminators().contains(stop2)) + { + getTerminators().insert(stop2); + } + Expr *lhs = nullptr; Token token = currentToken(); @@ -168,6 +191,7 @@ namespace Fig const auto &lhs_result = parseIdentiExpr(); if (!lhs_result) { + resetTermintors(); return std::unexpected(lhs_result.error()); } lhs = *lhs_result; @@ -177,6 +201,7 @@ namespace Fig const auto &lhs_result = parseLiteralExpr(); if (!lhs_result) { + resetTermintors(); return std::unexpected(lhs_result.error()); } lhs = *lhs_result; @@ -186,6 +211,7 @@ namespace Fig const auto &lhs_result = parsePrefixExpr(); if (!lhs_result) { + resetTermintors(); return std::unexpected(lhs_result.error()); } lhs = *lhs_result; @@ -196,19 +222,23 @@ namespace Fig const auto &expr_result = parseExpression(0); if (!expr_result) { + resetTermintors(); return expr_result; } const Token &rparen_token = consumeToken(); // consume `)` if (rparen_token.type != TokenType::RightParen) { - return std::unexpected(Error( - ErrorType::SyntaxError, "unclosed parenthese", "insert `)`", makeSourceLocation(lparen_token))); + return std::unexpected(Error(ErrorType::SyntaxError, + "unclosed parenthese", + "insert `)`", + makeSourceLocation(lparen_token))); } lhs = *expr_result; } if (!lhs) { + resetTermintors(); return std::unexpected(Error(ErrorType::ExpectedExpression, "expected expression", "insert expressions", @@ -241,6 +271,7 @@ namespace Fig const auto &result = parseInfixExpr(lhs); if (!result) { + resetTermintors(); return result; } lhs = *result; @@ -252,6 +283,7 @@ namespace Fig const auto &expr_result = parseIndexExpr(lhs); if (!expr_result) { + resetTermintors(); return expr_result; } lhs = *expr_result; @@ -261,6 +293,7 @@ namespace Fig const auto &expr_result = parseCallExpr(lhs); if (!expr_result) { + resetTermintors(); return expr_result; } lhs = *expr_result; diff --git a/src/Parser/Parser.hpp b/src/Parser/Parser.hpp index ce5b989..7921c0e 100644 --- a/src/Parser/Parser.hpp +++ b/src/Parser/Parser.hpp @@ -188,7 +188,9 @@ namespace Fig Result parseIndexExpr(Expr *); // 由 parseExpression调用, 当前token为 `[` Result parseCallExpr(Expr *); // 由 parseExpression调用, 当前token为 `(` - std::unordered_set getTerminators(); // 返回固定的终止符 + const std::unordered_set &getBaseTerminators(); + std::unordered_set &getTerminators(); // 返回固定的终止符 + void resetTermintors(); bool shouldTerminate(); // 判断是否终结 Result parseExpression(BindingPower = 0, TokenType stop = TokenType::Semicolon, TokenType stop2 = TokenType::Semicolon); diff --git a/src/VM/VM.cpp b/src/VM/VM.cpp index ef0c910..35b22b8 100644 --- a/src/VM/VM.cpp +++ b/src/VM/VM.cpp @@ -86,7 +86,7 @@ namespace Fig std::uint8_t a = decodeA(inst); switch (op) { - case OpCode::Exit: { + case OpCode::Exit: { [[unlikely]] return Value::GetNullInstance(); }