bool Parser::parseParentheses(JumpList& failures) { ParenthesesType type = consumeParenthesesType(); // FIXME: WREC originally failed to backtrack correctly in cases such as // "c".match(/(.*)c/). Now, most parentheses handling is disabled. For // unsupported parentheses, we fall back on PCRE. switch (type) { case Generator::Assertion: { m_generator.generateParenthesesAssertion(failures); if (consume() != ')') { setError(ParenthesesUnmatched); return false; } Quantifier quantifier = consumeQuantifier(); if (quantifier.type != Quantifier::None && quantifier.min == 0) { setError(ParenthesesNotSupported); return false; } return true; } case Generator::InvertedAssertion: { m_generator.generateParenthesesInvertedAssertion(failures); if (consume() != ')') { setError(ParenthesesUnmatched); return false; } Quantifier quantifier = consumeQuantifier(); if (quantifier.type != Quantifier::None && quantifier.min == 0) { setError(ParenthesesNotSupported); return false; } return true; } default: setError(ParenthesesNotSupported); return false; } }
bool Parser::parseParentheses(JumpList& failures) { ParenthesesType type = consumeParenthesesType(); // FIXME: WREC originally failed to backtrack correctly in cases such as // "c".match(/(.*)c/). Now, most parentheses handling is disabled. For // unsupported parentheses, we fall back on PCRE. switch (type) { case Generator::Assertion: m_generator.generateParenthesesAssertion(failures); if (consume() != ')') { setError(ParenthesesUnmatched); return false; } // A quantifier after an assertion is meaningless, since assertions // don't move index forward. So, we discard it. consumeQuantifier(); break; case Generator::InvertedAssertion: m_generator.generateParenthesesInvertedAssertion(failures); if (consume() != ')') { setError(ParenthesesUnmatched); return false; } // A quantifier after an assertion is meaningless, since assertions // don't move index forward. So, we discard it. consumeQuantifier(); break; default: setError(ParenthesesNotSupported); return false; } return true; }