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");