feat: 优化表达式解析器,添加终止符重置功能及代码格式调整

This commit is contained in:
2026-02-23 15:03:53 +08:00
parent abdb1d2fb0
commit 852dd27836
3 changed files with 56 additions and 21 deletions

View File

@@ -20,8 +20,8 @@ namespace Fig
{ {
state = State::ParsingIdentiExpr; state = State::ParsingIdentiExpr;
const Token &identifier = consumeToken(); const Token &identifier = consumeToken();
IdentiExpr *node = IdentiExpr *node = new IdentiExpr(
new IdentiExpr(srcManager.GetSub(identifier.index, identifier.length), makeSourceLocation(identifier)); srcManager.GetSub(identifier.index, identifier.length), makeSourceLocation(identifier));
return node; return node;
} }
@@ -61,7 +61,8 @@ namespace Fig
return node; return node;
} }
Result<IndexExpr *, Error> Parser::parseIndexExpr(Expr *base) // 由 parseExpression调用, 当前token为 `[` Result<IndexExpr *, Error> Parser::parseIndexExpr(
Expr *base) // 由 parseExpression调用, 当前token为 `[`
{ {
state = State::ParsingIndexExpr; state = State::ParsingIndexExpr;
const Token &lbracket_token = consumeToken(); // consume `[` const Token &lbracket_token = consumeToken(); // consume `[`
@@ -74,8 +75,10 @@ namespace Fig
if (currentToken().type != TokenType::RightBracket) // `]` if (currentToken().type != TokenType::RightBracket) // `]`
{ {
return std::unexpected( return std::unexpected(Error(ErrorType::SyntaxError,
Error(ErrorType::SyntaxError, "unclosed brackets", "insert `]`", makeSourceLocation(lbracket_token))); "unclosed brackets",
"insert `]`",
makeSourceLocation(lbracket_token)));
} }
consumeToken(); // consume `]` consumeToken(); // consume `]`
@@ -83,7 +86,8 @@ namespace Fig
return indexExpr; return indexExpr;
} }
Result<CallExpr *, Error> Parser::parseCallExpr(Expr *callee) // 由 parseExpression调用, 当前token为 `(` Result<CallExpr *, Error> Parser::parseCallExpr(
Expr *callee) // 由 parseExpression调用, 当前token为 `(`
{ {
state = State::ParsingCallExpr; state = State::ParsingCallExpr;
const Token &lparen_token = consumeToken(); // consume `(` const Token &lparen_token = consumeToken(); // consume `(`
@@ -133,24 +137,34 @@ namespace Fig
return new CallExpr(callee, callArgs); return new CallExpr(callee, callArgs);
} }
std::unordered_set<TokenType> Parser::getTerminators() const std::unordered_set<TokenType> &Parser::getBaseTerminators()
{ {
/*
Syntax terminators:
; ) ] } , EOF
*/
static const std::unordered_set<TokenType> baseTerminators = {TokenType::Semicolon, static const std::unordered_set<TokenType> baseTerminators = {TokenType::Semicolon,
TokenType::RightParen, TokenType::RightParen,
TokenType::RightBracket, TokenType::RightBracket,
TokenType::RightBrace, TokenType::RightBrace,
TokenType::Comma, TokenType::Comma,
TokenType::EndOfFile TokenType::EndOfFile};
};
return baseTerminators; return baseTerminators;
} }
std::unordered_set<TokenType> &Parser::getTerminators()
{
/*
Syntax terminators:
; ) ] } , EOF
*/
static std::unordered_set<TokenType> terminators(getBaseTerminators());
return terminators;
}
void Parser::resetTermintors()
{
getTerminators() = getBaseTerminators();
}
bool Parser::shouldTerminate() bool Parser::shouldTerminate()
{ {
const Token &token = currentToken(); const Token &token = currentToken();
@@ -160,6 +174,15 @@ namespace Fig
Result<Expr *, Error> Parser::parseExpression(BindingPower rbp, TokenType stop, TokenType stop2) Result<Expr *, Error> 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; Expr *lhs = nullptr;
Token token = currentToken(); Token token = currentToken();
@@ -168,6 +191,7 @@ namespace Fig
const auto &lhs_result = parseIdentiExpr(); const auto &lhs_result = parseIdentiExpr();
if (!lhs_result) if (!lhs_result)
{ {
resetTermintors();
return std::unexpected(lhs_result.error()); return std::unexpected(lhs_result.error());
} }
lhs = *lhs_result; lhs = *lhs_result;
@@ -177,6 +201,7 @@ namespace Fig
const auto &lhs_result = parseLiteralExpr(); const auto &lhs_result = parseLiteralExpr();
if (!lhs_result) if (!lhs_result)
{ {
resetTermintors();
return std::unexpected(lhs_result.error()); return std::unexpected(lhs_result.error());
} }
lhs = *lhs_result; lhs = *lhs_result;
@@ -186,6 +211,7 @@ namespace Fig
const auto &lhs_result = parsePrefixExpr(); const auto &lhs_result = parsePrefixExpr();
if (!lhs_result) if (!lhs_result)
{ {
resetTermintors();
return std::unexpected(lhs_result.error()); return std::unexpected(lhs_result.error());
} }
lhs = *lhs_result; lhs = *lhs_result;
@@ -196,19 +222,23 @@ namespace Fig
const auto &expr_result = parseExpression(0); const auto &expr_result = parseExpression(0);
if (!expr_result) if (!expr_result)
{ {
resetTermintors();
return expr_result; return expr_result;
} }
const Token &rparen_token = consumeToken(); // consume `)` const Token &rparen_token = consumeToken(); // consume `)`
if (rparen_token.type != TokenType::RightParen) if (rparen_token.type != TokenType::RightParen)
{ {
return std::unexpected(Error( return std::unexpected(Error(ErrorType::SyntaxError,
ErrorType::SyntaxError, "unclosed parenthese", "insert `)`", makeSourceLocation(lparen_token))); "unclosed parenthese",
"insert `)`",
makeSourceLocation(lparen_token)));
} }
lhs = *expr_result; lhs = *expr_result;
} }
if (!lhs) if (!lhs)
{ {
resetTermintors();
return std::unexpected(Error(ErrorType::ExpectedExpression, return std::unexpected(Error(ErrorType::ExpectedExpression,
"expected expression", "expected expression",
"insert expressions", "insert expressions",
@@ -241,6 +271,7 @@ namespace Fig
const auto &result = parseInfixExpr(lhs); const auto &result = parseInfixExpr(lhs);
if (!result) if (!result)
{ {
resetTermintors();
return result; return result;
} }
lhs = *result; lhs = *result;
@@ -252,6 +283,7 @@ namespace Fig
const auto &expr_result = parseIndexExpr(lhs); const auto &expr_result = parseIndexExpr(lhs);
if (!expr_result) if (!expr_result)
{ {
resetTermintors();
return expr_result; return expr_result;
} }
lhs = *expr_result; lhs = *expr_result;
@@ -261,6 +293,7 @@ namespace Fig
const auto &expr_result = parseCallExpr(lhs); const auto &expr_result = parseCallExpr(lhs);
if (!expr_result) if (!expr_result)
{ {
resetTermintors();
return expr_result; return expr_result;
} }
lhs = *expr_result; lhs = *expr_result;

View File

@@ -188,7 +188,9 @@ namespace Fig
Result<IndexExpr *, Error> parseIndexExpr(Expr *); // 由 parseExpression调用, 当前token为 `[` Result<IndexExpr *, Error> parseIndexExpr(Expr *); // 由 parseExpression调用, 当前token为 `[`
Result<CallExpr *, Error> parseCallExpr(Expr *); // 由 parseExpression调用, 当前token为 `(` Result<CallExpr *, Error> parseCallExpr(Expr *); // 由 parseExpression调用, 当前token为 `(`
std::unordered_set<TokenType> getTerminators(); // 返回固定的终止符 const std::unordered_set<TokenType> &getBaseTerminators();
std::unordered_set<TokenType> &getTerminators(); // 返回固定的终止符
void resetTermintors();
bool shouldTerminate(); // 判断是否终结 bool shouldTerminate(); // 判断是否终结
Result<Expr *, Error> parseExpression(BindingPower = 0, TokenType stop = TokenType::Semicolon, TokenType stop2 = TokenType::Semicolon); Result<Expr *, Error> parseExpression(BindingPower = 0, TokenType stop = TokenType::Semicolon, TokenType stop2 = TokenType::Semicolon);

View File

@@ -86,7 +86,7 @@ namespace Fig
std::uint8_t a = decodeA(inst); std::uint8_t a = decodeA(inst);
switch (op) switch (op)
{ {
case OpCode::Exit: { case OpCode::Exit: { [[unlikely]]
return Value::GetNullInstance(); return Value::GetNullInstance();
} }