feat: 优化表达式解析器,添加终止符重置功能及代码格式调整
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user