diff --git a/duchain/tests/duchain.h b/duchain/tests/duchain.h --- a/duchain/tests/duchain.h +++ b/duchain/tests/duchain.h @@ -185,6 +185,8 @@ void functionArgumentUnpacking(); void illegalExpression_data(); void illegalExpression(); + void printExpression_data(); + void printExpression(); }; } diff --git a/duchain/tests/duchain.cpp b/duchain/tests/duchain.cpp --- a/duchain/tests/duchain.cpp +++ b/duchain/tests/duchain.cpp @@ -3781,6 +3781,9 @@ QTest::newRow("equality expression") << QStringLiteral(" 2 > 1;\n"); + QTest::newRow("double print expression") << QStringLiteral("("code"); + + QTest::newRow("simple print expression") << QStringLiteral("problems().isEmpty()); +} diff --git a/parser/php.g b/parser/php.g --- a/parser/php.g +++ b/parser/php.g @@ -365,7 +365,7 @@ #expression=printExpression @ LOGICAL_AND -> logicalAndExpression ;; - (print=PRINT*) expression=assignmentExpression + (print=PRINT | 0) expression=assignmentExpression -> printExpression ;; -- leftside must me a variable, we check afterwards if it was a variable and @@ -432,10 +432,10 @@ ) -> conditionalExpression ;; - #expression=booleanOrExpression @ NULL_COALESCE + #expression=booleanOrExpression @ NULL_COALESCE -> nullCoalesceExpression ;; - #expression=booleanAndExpression @ BOOLEAN_OR + #expression=booleanAndExpression @ BOOLEAN_OR -> booleanOrExpression ;; #expression=bitOrExpression @ BOOLEAN_AND @@ -548,8 +548,10 @@ op=INC | op=DEC -> postprefixOperator ;; +-- 10 first follow conflicts because we go back up the chain + (print=PRINT+) printExpression=assignmentExpression --first/first conflict - no problem because of ifs - ?[: m_state.varExpressionState == OnlyVariable :] 0 [: m_state.varExpressionState = Normal; :] variable=variable + | ?[: m_state.varExpressionState == OnlyVariable :] 0 [: m_state.varExpressionState = Normal; :] variable=variable | ?[: m_state.varExpressionState == OnlyNewObject :] 0 [: m_state.varExpressionState = Normal; :] newObject=varExpressionNewObject | varExpressionNormal=varExpressionNormal | varExpressionArray=varExpressionArray arrayIndex=arrayIndexSpecifier* @@ -564,7 +566,7 @@ | try/rollback (variable=variable [: m_state.varExpressionIsVariable = true; :]) catch (scalar=scalar) | ISSET LPAREN (#issetVariable=variable @ COMMA) RPAREN - | EMPTY LPAREN emptyVarialbe=variable RPAREN + | EMPTY LPAREN emptyExpression=expr RPAREN | newObject=varExpressionNewObject | CLONE cloneCar=varExpressionNormal | closure=closure