// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include namespace DB { UnmatchedParentheses checkUnmatchedParentheses(TokenIterator begin, Token * last) { /// We have just two kind of parentheses: () and []. UnmatchedParentheses stack; for (TokenIterator it = begin; it.isValid() && &it.get() <= last; ++it) { if (it->type == TokenType::OpeningRoundBracket || it->type == TokenType::OpeningSquareBracket) { stack.push_back(*it); } else if (it->type == TokenType::ClosingRoundBracket || it->type == TokenType::ClosingSquareBracket) { if (stack.empty()) { /// Excessive closing bracket. stack.push_back(*it); return stack; } else if ( (stack.back().type == TokenType::OpeningRoundBracket && it->type == TokenType::ClosingRoundBracket) || (stack.back().type == TokenType::OpeningSquareBracket && it->type == TokenType::ClosingSquareBracket)) { /// Valid match. stack.pop_back(); } else { /// Closing bracket type doesn't match opening bracket type. stack.push_back(*it); return stack; } } } /// If stack is not empty, we have unclosed brackets. return stack; } } // namespace DB