summaryrefslogtreecommitdiff
path: root/Zend/zend_language_parser.y
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2007-03-04 16:25:57 +0000
committerMarcus Boerger <helly@php.net>2007-03-04 16:25:57 +0000
commitb24f8404114e4188bf1d9b8370e6ad84a85f4301 (patch)
treeefd5d6ba980b5bfe18233be6b21f4906f79c4ca3 /Zend/zend_language_parser.y
parent213172a41b19680e1e4aeabd526717f474600bc5 (diff)
downloadphp-git-b24f8404114e4188bf1d9b8370e6ad84a85f4301.tar.gz
- Implement '?:'
[DOC] "expr1 ?: expr1" is a shortcut for: "expr1 ? expr1 : expr2" as exists in gcc and discussed some time back. Note that this is not an implementation ifsetor($var, default). While ifsetor would not generate any message for non existing variables or array indices the ternary shortcut does. Also the ternary shortcut does a boolean evaluation rather then checking for isset(). That way ther ternary shortcut can work on any expression while ifsetor can only work on variables. Also to be silent one has do do: "@$expr1 ?: $expr2".
Diffstat (limited to 'Zend/zend_language_parser.y')
-rw-r--r--Zend/zend_language_parser.y3
1 files changed, 3 insertions, 0 deletions
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 549bc17706..dec7a02272 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -611,6 +611,9 @@ expr_without_variable:
| expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
expr ':' { zend_do_qm_true(&$4, &$2, &$5 TSRMLS_CC); }
expr { zend_do_qm_false(&$$, &$7, &$2, &$5 TSRMLS_CC); }
+ | expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
+ ':' { zend_do_qm_true(&$1, &$2, &$4 TSRMLS_CC); }
+ expr { zend_do_qm_false(&$$, &$6, &$2, &$4 TSRMLS_CC); }
| internal_functions_in_yacc { $$ = $1; }
| T_INT_CAST expr { zend_do_cast(&$$, &$2, IS_LONG TSRMLS_CC); }
| T_DOUBLE_CAST expr { zend_do_cast(&$$, &$2, IS_DOUBLE TSRMLS_CC); }