From 6b75e028ffa069faa459d543d36111ed9c455c12 Mon Sep 17 00:00:00 2001 From: PuqiAR Date: Tue, 17 Feb 2026 14:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=B3=E7=BB=93=E5=90=88?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=8A=9B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ast/Operator.cpp | 29 ++++++++++++++--------------- src/Parser/ExprParser.cpp | 5 +++-- src/Parser/Parser.hpp | 14 +++++++++----- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/Ast/Operator.cpp b/src/Ast/Operator.cpp index 8074c5f..bbc8e3a 100644 --- a/src/Ast/Operator.cpp +++ b/src/Ast/Operator.cpp @@ -51,7 +51,7 @@ namespace Fig {TokenType::PercentEqual, BinaryOperator::ModuloAssign}, {TokenType::CaretEqual, BinaryOperator::BitXorAssign}, - {TokenType::Pipe, BinaryOperator::BitAnd}, + {TokenType::Pipe, BinaryOperator::BitOr}, {TokenType::Ampersand, BinaryOperator::BitAnd}, {TokenType::ShiftLeft, BinaryOperator::ShiftLeft}, {TokenType::ShiftRight, BinaryOperator::ShiftRight}, @@ -137,22 +137,21 @@ namespace Fig BindingPower GetBinaryOpRBp(BinaryOperator op) { - /* - 右结合,左绑定力 >= 右 - a = b = c - a = (b = c) - a.b.c - */ switch (op) { - case BinaryOperator::Assign: return GetBinaryOpLBp(op); - case BinaryOperator::AddAssign: return GetBinaryOpLBp(op); - case BinaryOperator::SubAssign: return GetBinaryOpLBp(op); - case BinaryOperator::MultiplyAssign: return GetBinaryOpLBp(op); - case BinaryOperator::DivideAssign: return GetBinaryOpLBp(op); - case BinaryOperator::ModuloAssign: return GetBinaryOpLBp(op); - case BinaryOperator::BitXorAssign: return GetBinaryOpLBp(op); - case BinaryOperator::Power: return GetBinaryOpLBp(op); + /* + 右结合,左绑定力 >= 右 + a = b = c + a = (b = c) + */ + case BinaryOperator::Assign: + case BinaryOperator::AddAssign: + case BinaryOperator::SubAssign: + case BinaryOperator::MultiplyAssign: + case BinaryOperator::DivideAssign: + case BinaryOperator::ModuloAssign: + case BinaryOperator::BitXorAssign: + case BinaryOperator::Power: return GetBinaryOpLBp(op) - 1; default: /* diff --git a/src/Parser/ExprParser.cpp b/src/Parser/ExprParser.cpp index a7b35bc..a18a893 100644 --- a/src/Parser/ExprParser.cpp +++ b/src/Parser/ExprParser.cpp @@ -122,12 +122,12 @@ namespace Fig while (true) { - token = currentToken(); if (shouldTerminate()) { return lhs; } + token = currentToken(); if (IsTokenOp(token.type /* isBinary = true */)) // 是否为二元运算符 { BinaryOperator op = TokenToBinaryOp(token); @@ -136,7 +136,7 @@ namespace Fig { // 前操作数的右绑定力比当前操作数的左绑定力大 // lhs被吸走 - return lhs; + break; } const auto &result = parseInfixExpr(lhs); @@ -154,6 +154,7 @@ namespace Fig return lhs; } } + return lhs; } }; // namespace Fig \ No newline at end of file diff --git a/src/Parser/Parser.hpp b/src/Parser/Parser.hpp index 9bb7ce4..c87331c 100644 --- a/src/Parser/Parser.hpp +++ b/src/Parser/Parser.hpp @@ -34,7 +34,7 @@ namespace Fig bool isEOF = false; - const Token &nextToken() + Token nextToken() { assert(!isEOF && "nextToken: eof but called nextToken"); if (index + 1 < buffer.size()) @@ -57,12 +57,16 @@ namespace Fig return token; } - inline const Token &prevToken() + inline Token prevToken() { + if (buffer.size() < 2) + { + return currentToken(); + } return buffer[buffer.size() - 2]; } - inline const Token ¤tToken() + inline Token currentToken() { if (buffer.empty()) { @@ -70,8 +74,8 @@ namespace Fig } return buffer.back(); } - - const Token &peekToken(size_t lookahead = 1) + + Token peekToken(size_t lookahead = 1) { assert(!isEOF && "peekToken: eof but called peekToken");