diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-03-15 12:01:58 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-03-15 12:01:58 +0100 |
commit | 2a04efe0e42c9d7ac150bc918e16edb96cf4f219 (patch) | |
tree | bf79f4aee697369c6e682a3f7da07a4c1d26ea0d /Zend/zend_language_parser.y | |
parent | 4cfa01bfb8c95b094e104a70e877cfe5aae04104 (diff) | |
download | php-git-2a04efe0e42c9d7ac150bc918e16edb96cf4f219.tar.gz |
Remove unnecessary precedence/associativity annotations
Some of these are entirely unnecessary. Some specify an associativity
for operators where the concept doesn't make sense and has no effect:
Explicit associativity is only meaningful for binary operators. For
unary operators and constrained operations like instanceof or assignment
the associativity specification has no effect and only serves to confuse.
For example assignments were specified as %left, even though they will
actually behave as right-associative due to the variable requirement on
the LHS. Similarly instanceof was specified as %nonassoc, but it will
behave as left-associative, due to the restrictions places on the RHS.
Diffstat (limited to 'Zend/zend_language_parser.y')
-rw-r--r-- | Zend/zend_language_parser.y | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 8e0728f4b5..af5ce87fa2 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -51,16 +51,15 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %destructor { zend_ast_destroy($$); } <ast> %destructor { if ($$) zend_string_release_ex($$, 0); } <str> -%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE -%left ',' +%precedence T_INCLUDE T_INCLUDE_ONCE T_REQUIRE T_REQUIRE_ONCE %left T_LOGICAL_OR %left T_LOGICAL_XOR %left T_LOGICAL_AND -%right T_PRINT -%right T_YIELD -%right T_DOUBLE_ARROW -%right T_YIELD_FROM -%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL +%precedence T_PRINT +%precedence T_YIELD +%precedence T_DOUBLE_ARROW +%precedence T_YIELD_FROM +%precedence '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL %left '?' ':' %right T_COALESCE %left T_BOOLEAN_OR @@ -73,17 +72,16 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %left T_SL T_SR %left '+' '-' '.' %left '*' '/' '%' -%right '!' -%nonassoc T_INSTANCEOF -%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' +%precedence '!' +%precedence T_INSTANCEOF +%precedence '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' %right T_POW -%right '[' -%nonassoc T_NEW T_CLONE -%left T_NOELSE -%left T_ELSEIF -%left T_ELSE -%left T_ENDIF -%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC +%precedence T_NEW T_CLONE + +/* Resolve danging else conflict */ +%precedence T_NOELSE +%precedence T_ELSEIF +%precedence T_ELSE %token <ast> T_LNUMBER "integer number (T_LNUMBER)" %token <ast> T_DNUMBER "floating-point number (T_DNUMBER)" |