diff options
author | Lior Kaplan <kaplanlior@gmail.com> | 2014-02-14 22:39:19 +0200 |
---|---|---|
committer | Lior Kaplan <kaplanlior@gmail.com> | 2014-02-14 22:39:19 +0200 |
commit | d67160a566757f858e5883201e518230f5221c6b (patch) | |
tree | 24f894d317e2f58e2d5372f39a1d53fa30885751 | |
parent | 575107aad92a460051e02de029067359083542b9 (diff) | |
download | php-d67160a566757f858e5883201e518230f5221c6b.tar.gz |
Imported Upstream version 5.6.0~alpha2+dfsgupstream/5.6.0_alpha2+dfsg
249 files changed, 43960 insertions, 24109 deletions
diff --git a/.gitignore b/.gitignore index cf615c6e9..8d0e7565f 100644 --- a/.gitignore +++ b/.gitignore @@ -206,6 +206,8 @@ ext/pdo_sqlite/sqlite3.h ext/pdo_sqlite/tests/*.db ext/pdo_sqlite/tests/*.tmp ext/phar/phar.phar +ext/phar/phar.1 +ext/phar/phar.phar.1 ext/pspell/tests/*.tmp ext/reflection/xml ext/reflection/html @@ -237,12 +239,14 @@ sapi/apache/libphp5.module sapi/apache2handler/libphp5.module sapi/apache_hooks/libphp5.module sapi/cgi/php-cgi +sapi/cgi/php-cgi.1 sapi/cli/php.1 sapi/fpm/php-fpm sapi/fpm/php-fpm.1 sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.conf sapi/fpm/fpm/php-cgi +sapi/phpdbg/phpdbg scripts/php-config scripts/phpize scripts/man1/*.1 diff --git a/CODING_STANDARDS b/CODING_STANDARDS index 5fd3f9f35..27fff07f6 100644 --- a/CODING_STANDARDS +++ b/CODING_STANDARDS @@ -82,7 +82,7 @@ Exceptions: library may need to control or free the memory, or when the memory in question needs to survive between multiple requests. -Naming Conventions +User Functions/Methods Naming Conventions ------------------ 1. Function names for user-level functions should be enclosed with in @@ -163,6 +163,26 @@ Naming Conventions 'foobar' 'foo_bar' +Internal Function Naming Convensions +---------------------- + +1. Functions that are part of the external API should be named + 'php_modulename_function()' to avoid symbol collision. They should be in + lowercase, with words underscore delimited. Exposed API must be defined + in 'php_modulename.h'. + + PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS); + + Unexposed module function should be static and should not be defined in + 'php_modulename.h'. + + static int php_session_destroy(TSRMLS_D) + +2. Main module source file must be named 'modulename.c'. + +3. Header file that is used by other sources must be named 'php_modulename.h'. + + Syntax and indentation ---------------------- @@ -181,9 +201,9 @@ Syntax and indentation of PHP or one of its standard modules, please maintain the K&R style. This applies to just about everything, starting with indentation and comment styles and up to function declaration - syntax. Also see Indentstyle_. + syntax. Also see Indentstyle. -.. _Indentstyle: http://www.catb.org/~esr/jargon/html/I/indent-style.html + Indentstyle: http://www.catb.org/~esr/jargon/html/I/indent-style.html 3. Be generous with whitespace and braces. Keep one empty line between the variable declaration section and the statements in a block, as well as diff --git a/Makefile.global b/Makefile.global index bd82daf4d..11a7d5c43 100644 --- a/Makefile.global +++ b/Makefile.global @@ -115,6 +115,7 @@ clean: find . -name \*.la -o -name \*.a | xargs rm -f find . -name \*.so | xargs rm -f find . -name .libs -a -type d|xargs rm -rf + find . -name \*.1 | xargs rm -f rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_MILTER_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/* distclean: clean @@ -1,7 +1,21 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -23 Jan 2014, PHP 5.6.0 Alpha 1 +?? ??? 2014, PHP 5.6.0 Alpha 3 +13 Feb 2014, PHP 5.6.0 Alpha 2 +- Core: + . Added T_POW (**) operator + (RFC: https://wiki.php.net/rfc/pow-operator). (Tjerk Meesters) + +- mysqli + . Added new function mysqli_get_links_stats() as well as new INI variable + mysqli.rollback_on_cached_plink of type bool (Andrey) + +- PCRE: + . Upgraded to PCRE 8.34. (Anatol) + + +23 Jan 2014, PHP 5.6.0 Alpha 1 - CLI server: . Added some MIME types to the CLI web server. (Chris Jones) @@ -65,7 +79,13 @@ PHP NEWS . Added certificate fingerprint support. (Tjerk Meesters) . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) - + . Peer name verification matches SAN DNS names for certs using + the Subject Alternative Name x509 extension. (Daniel Lowrey) + . Fixed segfault when built against OpenSSL>=1.0.1 (Daniel Lowrey) + . Peer certificates now verified by default in client socket operations + (RFC: https://wiki.php.net/rfc/tls-peer-verification). (Daniel Lowrey) + . Added SPKAC support. (Jason Gerfen) + - PDO_pgsql: . Fixed Bug #42614 (PDO_pgsql: add pg_get_notify support). (Matteo) . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3 diff --git a/README.EXT_SKEL b/README.EXT_SKEL index d44fcc5c6..42df006d2 100644 --- a/README.EXT_SKEL +++ b/README.EXT_SKEL @@ -45,12 +45,29 @@ HOW TO USE IT --proto=filename. +SOURCE AND HEADER FILE NAME + + ./ext_skel generates 'module_name.c' and 'php_module_name.h' as main source + and header files. Keep these names. + + Module functions (User functions) must be named + + module_name_function() + + When you need to expose module functions to other modules, expose functions + strictly needed by others. Exposed internal function must be named + + php_module_name_function() + + See also CODING_STANDARDS. + + FORMAT OF FUNCTION DEFINITIONS FILE All the definitions must be on one line. In it's simplest form, it's just the function name, e.g. - my_function + module_name_function but then you'll be left with an almost empty function body without any argument handling. @@ -72,8 +89,9 @@ FORMAT OF FUNCTION DEFINITIONS FILE An example: - my_function(int arg1, int arg2 [, int arg3 [, int arg4]]) this is my 1st + module_name_function(int arg1, int arg2 [, int arg3 [, int arg4]]) + Arguments arg1 and arg2 are required. Arguments arg3 and arg4 are optional. If possible, the function definition should also contain it's return type @@ -133,15 +151,15 @@ EXAMPLE The following _one_ line - bool my_drawtext(resource image, string text, resource font, int x, int y [, int color]) + bool module_name_drawtext(resource image, string text, resource font, int x, int y [, int color]) will create this function definition for you (note that there are a few question marks to be replaced by you, and you must of course add your own value definitions too): -/* {{{ proto bool my_drawtext(resource image, string text, resource font, int x, int y [, int color]) +/* {{{ proto bool module_name_drawtext(resource image, string text, resource font, int x, int y [, int color]) */ -PHP_FUNCTION(my_drawtext) +PHP_FUNCTION(module_name_drawtext) { char *text = NULL; int argc = ZEND_NUM_ARGS(); @@ -164,7 +182,7 @@ PHP_FUNCTION(my_drawtext) ZEND_FETCH_RESOURCE(???, ???, font, font_id, "???", ???_rsrc_id); } - php_error(E_WARNING, "my_drawtext: not yet implemented"); + php_error(E_WARNING, "module_name_drawtext: not yet implemented"); } /* }}} */ diff --git a/README.RELEASE_PROCESS b/README.RELEASE_PROCESS index a0c34f8f7..4343b6213 100644 --- a/README.RELEASE_PROCESS +++ b/README.RELEASE_PROCESS @@ -101,10 +101,10 @@ pointing out "the location of the release" and "the possible release date of either the next RC, or the final release". 2. Send an email (see example here http://news.php.net/php.pear.qa/5201) **To** -``php-qa@lists.php.net`` and ``primary-qa-tests@lists.php.net``. +``php-qa@lists.php.net`` and ``primary-qa-tester@lists.php.net``. This email is to notify the selected projects about a new release so that they can make sure their projects keep working. Make sure that you have been setup -as a moderator for ``primary-qa-tests@lists.php.net`` by having someone (Wez, +as a moderator for ``primary-qa-tester@lists.php.net`` by having someone (Hannes, Dan, Derick) run the following commands for you: ``ssh lists.php.net`` diff --git a/README.SUBMITTING_PATCH b/README.SUBMITTING_PATCH index d1b74bd18..50a1664a7 100644 --- a/README.SUBMITTING_PATCH +++ b/README.SUBMITTING_PATCH @@ -50,6 +50,17 @@ Please make the mail subject prefix "[PATCH]". If attaching a patch, ensure it has a file extension of ".txt". This is because only MIME attachments of type 'text/*' are accepted. +The preferred way to propose PHP patch is sending pull request from +github. + +https://github.com/php/php-src + +Fork the official PHP repository and send a pull request. A +notification will be sent to the pull request mailing list. Sending a +note to PHP Internals list (internals@lists.php.net) may help getting +more feedback and quicker turnaround. You can also add pull requests +to bug reports at http://bugs.php.net/. + PHP Documentation Patches ------------------------- diff --git a/README.TESTING b/README.TESTING index 5e0ee11be..3ed5e6b2a 100644 --- a/README.TESTING +++ b/README.TESTING @@ -2,7 +2,7 @@ ------------------ Failed tests usually indicate a problem with your local system setup and not within PHP itself (at least for official PHP release versions). -You may decide to automaticaly submit a test summary to our QA workflow +You may decide to automatically submit a test summary to our QA workflow at the end of a test run. Please do *not* submit a failed test as a bug or ask for help on why it failed on your system without providing substantial backup information diff --git a/TSRM/TSRM.dsp b/TSRM/TSRM.dsp index 6c3e8bfb8..8604bc0da 100644 --- a/TSRM/TSRM.dsp +++ b/TSRM/TSRM.dsp @@ -171,10 +171,6 @@ SOURCE=.\tsrm_strtok_r.h # End Source File # Begin Source File -SOURCE=.\tsrm_virtual_cwd.h -# End Source File -# Begin Source File - SOURCE=.\tsrm_win32.h # End Source File # End Group @@ -28,11 +28,22 @@ PHP X.Y UPGRADE NOTES containing non-lowercase values inside JSON arrays or objects has never been accepted. +- openssl: + To prevent Man-in-the-Middle attacks against encrypted transfers client + streams now verify peer certificates by default. Previous versions + required users to manually enable peer verification. As a result of this + change, existing code using ssl:// or tls:// stream wrappers (e.g. + file_get_contents(), fsockopen(), stream_socket_client()) may no longer + connect successfully without manually disabling peer verification via the + stream context's "verify_peer" setting. Encrypted transfers delegate to + operating system certificate stores by default, so many/most users *should* + be unaffected by this transparent security enhancement. + ======================================== 2. New Features ======================================== -- Added constant scalar expressions syntax +- Added constant scalar expressions syntax. (https://wiki.php.net/rfc/const_scalar_exprs) - Added dedicated syntax for variadic functions. @@ -41,6 +52,9 @@ PHP X.Y UPGRADE NOTES - Added support for argument unpacking to complement the variadic syntax. (https://wiki.php.net/rfc/argument_unpacking) +- Added T_POW (**) operator. + (https://wiki.php.net/rfc/pow-operator) + - The php://input stream is now re-usable and can be used concurrently with enable_post_data_reading=0. @@ -51,6 +65,8 @@ PHP X.Y UPGRADE NOTES - Added openssl crypto method stream context option. +- Added openssl peer verification support for SAN x509 extension + - Added use function and use const. (https://wiki.php.net/rfc/use_function) @@ -94,6 +110,10 @@ PHP X.Y UPGRADE NOTES - Openssl: Added string openssl_x509_fingerprint($x509, $type, $binary). + Added string openssl_spki_new($private_key, $challenge, $algorithm) + Added bool openssl_spki_verify($spkac) + Added string openssl_spki_export($spkac) + Added string openssl_spki_export_challenge($spkac) - LDAP: Added ldap_escape($value, $ignore = "", $flags = 0). diff --git a/Zend/Zend.dsp b/Zend/Zend.dsp index 348e1abaa..98d368fb1 100644 --- a/Zend/Zend.dsp +++ b/Zend/Zend.dsp @@ -269,6 +269,10 @@ SOURCE=.\zend_variables.c SOURCE=.\zend_vm_opcodes.c
# End Source File
+# Begin Source File
+
+SOURCE=.\zend_virtual_cwd.c
+# End Source File
# End Group
# Begin Group "Header Files"
@@ -437,10 +441,6 @@ SOURCE=.\zend_ts_hash.h SOURCE=.\zend_variables.h
# End Source File
-# Begin Source File
-
-SOURCE=.\zend_virtual_cwd.c
-# End Source File
# End Group
# Begin Group "Parsers"
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c index c73f3cedd..521e98e25 100644 --- a/Zend/zend_ini_scanner.c +++ b/Zend/zend_ini_scanner.c @@ -1,4663 +1,4663 @@ -/* Generated by re2c 0.13.5 */
-#line 1 "Zend/zend_ini_scanner.l"
-/*
- +----------------------------------------------------------------------+
- | Zend Engine |
- +----------------------------------------------------------------------+
- | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.00 of the Zend license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.zend.com/license/2_00.txt. |
- | If you did not receive a copy of the Zend license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@zend.com so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Zeev Suraski <zeev@zend.com> |
- | Jani Taskinen <jani@php.net> |
- | Marcus Boerger <helly@php.net> |
- | Nuno Lopes <nlopess@php.net> |
- | Scott MacVicar <scottmac@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#include <errno.h>
-#include "zend.h"
-#include "zend_globals.h"
-#include <zend_ini_parser.h>
-#include "zend_ini_scanner.h"
-
-#if 0
-# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
-#else
-# define YYDEBUG(s, c)
-#endif
-
-#include "zend_ini_scanner_defs.h"
-
-#define YYCTYPE unsigned char
-/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD)
- * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */
-#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; }
-#define YYCURSOR SCNG(yy_cursor)
-#define YYLIMIT SCNG(yy_limit)
-#define YYMARKER SCNG(yy_marker)
-
-#define YYGETCONDITION() SCNG(yy_state)
-#define YYSETCONDITION(s) SCNG(yy_state) = s
-
-#define STATE(name) yyc##name
-
-/* emulate flex constructs */
-#define BEGIN(state) YYSETCONDITION(STATE(state))
-#define YYSTATE YYGETCONDITION()
-#define yytext ((char*)SCNG(yy_text))
-#define yyleng SCNG(yy_leng)
-#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \
- yyleng = (unsigned int)x; } while(0)
-
-/* #define yymore() goto yymore_restart */
-
-/* perform sanity check. If this message is triggered you should
- increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */
-#define YYMAXFILL 6
-#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1)
-# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL
-#endif
-
-
-/* How it works (for the core ini directives):
- * ===========================================
- *
- * 1. Scanner scans file for tokens and passes them to parser.
- * 2. Parser parses the tokens and passes the name/value pairs to the callback
- * function which stores them in the configuration hash table.
- * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual
- * registering of ini entries and uses zend_get_configuration_directive()
- * to fetch the previously stored name/value pair from configuration hash table
- * and registers the static ini entries which match the name to the value
- * into EG(ini_directives) hash table.
- * 4. PATH section entries are used per-request from down to top, each overriding
- * previous if one exists. zend_alter_ini_entry() is called for each entry.
- * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the
- * php_admin_* directives used within Apache httpd.conf when PHP is compiled as
- * module for Apache.
- * 5. User defined ini files (like .htaccess for apache) are parsed for each request and
- * stored in separate hash defined by SAPI.
- */
-
-/* TODO: (ordered by importance :-)
- * ===============================================================================
- *
- * - Separate constant lookup totally from plain strings (using CONSTANT pattern)
- * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators
- * - Add #include "some.ini"
- * - Allow variables to refer to options also when using parse_ini_file()
- *
- */
-
-/* Globals Macros */
-#define SCNG INI_SCNG
-#ifdef ZTS
-ZEND_API ts_rsrc_id ini_scanner_globals_id;
-#else
-ZEND_API zend_ini_scanner_globals ini_scanner_globals;
-#endif
-
-/* Eat leading whitespace */
-#define EAT_LEADING_WHITESPACE() \
- while (yytext[0]) { \
- if (yytext[0] == ' ' || yytext[0] == '\t') { \
- SCNG(yy_text)++; \
- yyleng--; \
- } else { \
- break; \
- } \
- }
-
-/* Eat trailing whitespace + extra char */
-#define EAT_TRAILING_WHITESPACE_EX(ch) \
- while (yyleng > 0 && ( \
- (ch != 'X' && yytext[yyleng - 1] == ch) || \
- yytext[yyleng - 1] == '\n' || \
- yytext[yyleng - 1] == '\r' || \
- yytext[yyleng - 1] == '\t' || \
- yytext[yyleng - 1] == ' ') \
- ) { \
- yyleng--; \
- }
-
-/* Eat trailing whitespace */
-#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X')
-
-#define zend_ini_copy_value(retval, str, len) { \
- Z_STRVAL_P(retval) = zend_strndup(str, len); \
- Z_STRLEN_P(retval) = len; \
- Z_TYPE_P(retval) = IS_STRING; \
-}
-
-#define RETURN_TOKEN(type, str, len) { \
- zend_ini_copy_value(ini_lval, str, len); \
- return type; \
-}
-
-static void _yy_push_state(int new_state TSRMLS_DC)
-{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
- YYSETCONDITION(new_state);
-}
-
-#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)
-
-static void yy_pop_state(TSRMLS_D)
-{
- int *stack_state;
- zend_stack_top(&SCNG(state_stack), (void **) &stack_state);
- YYSETCONDITION(*stack_state);
- zend_stack_del_top(&SCNG(state_stack));
-}
-
-static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC)
-{
- YYCURSOR = (YYCTYPE*)str;
- SCNG(yy_start) = YYCURSOR;
- YYLIMIT = YYCURSOR + len;
-}
-
-#define ini_filename SCNG(filename)
-
-/* {{{ init_ini_scanner()
-*/
-static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC)
-{
- /* Sanity check */
- if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) {
- zend_error(E_WARNING, "Invalid scanner mode");
- return FAILURE;
- }
-
- SCNG(lineno) = 1;
- SCNG(scanner_mode) = scanner_mode;
- SCNG(yy_in) = fh;
-
- if (fh != NULL) {
- ini_filename = zend_strndup(fh->filename, strlen(fh->filename));
- } else {
- ini_filename = NULL;
- }
-
- zend_stack_init(&SCNG(state_stack));
- BEGIN(INITIAL);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ shutdown_ini_scanner()
-*/
-void shutdown_ini_scanner(TSRMLS_D)
-{
- zend_stack_destroy(&SCNG(state_stack));
- if (ini_filename) {
- free(ini_filename);
- }
-}
-/* }}} */
-
-/* {{{ zend_ini_scanner_get_lineno()
-*/
-int zend_ini_scanner_get_lineno(TSRMLS_D)
-{
- return SCNG(lineno);
-}
-/* }}} */
-
-/* {{{ zend_ini_scanner_get_filename()
-*/
-char *zend_ini_scanner_get_filename(TSRMLS_D)
-{
- return ini_filename ? ini_filename : "Unknown";
-}
-/* }}} */
-
-/* {{{ zend_ini_open_file_for_scanning()
-*/
-int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC)
-{
- char *buf;
- size_t size;
-
- if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) {
- return FAILURE;
- }
-
- if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) {
- zend_file_handle_dtor(fh TSRMLS_CC);
- return FAILURE;
- }
-
- yy_scan_buffer(buf, size TSRMLS_CC);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ zend_ini_prepare_string_for_scanning()
-*/
-int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC)
-{
- int len = strlen(str);
-
- if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) {
- return FAILURE;
- }
-
- yy_scan_buffer(str, len TSRMLS_CC);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ zend_ini_escape_string()
- */
-static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC)
-{
- register char *s, *t;
- char *end;
-
- zend_ini_copy_value(lval, str, len);
-
- /* convert escape sequences */
- s = t = Z_STRVAL_P(lval);
- end = s + Z_STRLEN_P(lval);
-
- while (s < end) {
- if (*s == '\\') {
- s++;
- if (s >= end) {
- *t++ = '\\';
- continue;
- }
- switch (*s) {
- case '"':
- if (*s != quote_type) {
- *t++ = '\\';
- *t++ = *s;
- break;
- }
- case '\\':
- case '$':
- *t++ = *s;
- Z_STRLEN_P(lval)--;
- break;
- default:
- *t++ = '\\';
- *t++ = *s;
- break;
- }
- } else {
- *t++ = *s;
- }
- if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
- SCNG(lineno)++;
- }
- s++;
- }
- *t = 0;
-}
-/* }}} */
-
-int ini_lex(zval *ini_lval TSRMLS_DC)
-{
-restart:
- SCNG(yy_text) = YYCURSOR;
-
-/* yymore_restart: */
- /* detect EOF */
- if (YYCURSOR >= YYLIMIT) {
- if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {
- BEGIN(INITIAL);
- return END_OF_LINE;
- }
- return 0;
- }
-
- /* Eat any UTF-8 BOM we find in the first 3 bytes */
- if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) {
- if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) {
- YYCURSOR += 3;
- goto restart;
- }
- }
-
-#line 337 "Zend/zend_ini_scanner.c"
-{
- YYCTYPE yych;
- unsigned int yyaccept = 0;
- if (YYGETCONDITION() < 4) {
- if (YYGETCONDITION() < 2) {
- if (YYGETCONDITION() < 1) {
- goto yyc_INITIAL;
- } else {
- goto yyc_ST_OFFSET;
- }
- } else {
- if (YYGETCONDITION() < 3) {
- goto yyc_ST_SECTION_VALUE;
- } else {
- goto yyc_ST_VALUE;
- }
- }
- } else {
- if (YYGETCONDITION() < 6) {
- if (YYGETCONDITION() < 5) {
- goto yyc_ST_SECTION_RAW;
- } else {
- goto yyc_ST_DOUBLE_QUOTES;
- }
- } else {
- if (YYGETCONDITION() < 7) {
- goto yyc_ST_VARNAME;
- } else {
- goto yyc_ST_RAW;
- }
- }
- }
-/* *********************************** */
-yyc_INITIAL:
- {
- static const unsigned char yybm[] = {
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 160, 0, 144, 144, 0, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 240, 128, 128, 144, 128, 144, 128, 144,
- 128, 128, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 144, 128, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 144, 144, 128, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 128, 128, 128, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- };
-
- YYDEBUG(0, *YYCURSOR);
- YYFILL(5);
- yych = *YYCURSOR;
- YYDEBUG(-1, yych);
- switch (yych) {
- case '\t': goto yy4;
- case '\n': goto yy6;
- case '\r': goto yy8;
- case ' ': goto yy9;
- case '!':
- case '"':
- case '$':
- case '&':
- case '(':
- case ')':
- case '^':
- case '{':
- case '|':
- case '}':
- case '~': goto yy10;
- case '#': goto yy12;
- case '%':
- case '\'':
- case '*':
- case '+':
- case ',':
- case '-':
- case '.':
- case '/':
- case ':':
- case '<':
- case '>':
- case '?':
- case '@':
- case ']': goto yy13;
- case ';': goto yy14;
- case '=': goto yy16;
- case 'F':
- case 'f': goto yy18;
- case 'N':
- case 'n': goto yy19;
- case 'O':
- case 'o': goto yy20;
- case 'T':
- case 't': goto yy21;
- case 'Y':
- case 'y': goto yy22;
- case '[': goto yy23;
- default: goto yy2;
- }
-yy2:
- YYDEBUG(2, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy26;
-yy3:
- YYDEBUG(3, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 429 "Zend/zend_ini_scanner.l"
- { /* Get option name */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace */
- EAT_TRAILING_WHITESPACE();
-
- RETURN_TOKEN(TC_LABEL, yytext, yyleng);
-}
-#line 476 "Zend/zend_ini_scanner.c"
-yy4:
- YYDEBUG(4, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy68;
-yy5:
- YYDEBUG(5, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 575 "Zend/zend_ini_scanner.l"
- {
- /* eat whitespace */
- goto restart;
-}
-#line 490 "Zend/zend_ini_scanner.c"
-yy6:
- YYDEBUG(6, *YYCURSOR);
- ++YYCURSOR;
-yy7:
- YYDEBUG(7, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 580 "Zend/zend_ini_scanner.l"
- {
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 502 "Zend/zend_ini_scanner.c"
-yy8:
- YYDEBUG(8, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy71;
- goto yy7;
-yy9:
- YYDEBUG(9, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy26;
- if (yych <= '\t') goto yy67;
- goto yy71;
- } else {
- if (yych == '\r') goto yy72;
- if (yych <= 0x1F) goto yy26;
- goto yy69;
- }
- } else {
- if (yych <= ':') {
- if (yych == '#') goto yy58;
- goto yy26;
- } else {
- if (yych <= ';') goto yy53;
- if (yych == '=') goto yy51;
- goto yy26;
- }
- }
-yy10:
- YYDEBUG(10, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(11, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 503 "Zend/zend_ini_scanner.l"
- { /* Disallow these chars outside option values */
- return yytext[0];
-}
-#line 541 "Zend/zend_ini_scanner.c"
-yy12:
- YYDEBUG(12, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy59;
-yy13:
- YYDEBUG(13, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy26;
-yy14:
- YYDEBUG(14, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy54;
- YYDEBUG(15, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 603 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 562 "Zend/zend_ini_scanner.c"
-yy16:
- YYDEBUG(16, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy52;
-yy17:
- YYDEBUG(17, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 439 "Zend/zend_ini_scanner.l"
- { /* Start option value */
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
- yy_push_state(ST_RAW TSRMLS_CC);
- } else {
- yy_push_state(ST_VALUE TSRMLS_CC);
- }
- return '=';
-}
-#line 580 "Zend/zend_ini_scanner.c"
-yy18:
- YYDEBUG(18, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy48;
- if (yych == 'a') goto yy48;
- goto yy26;
-yy19:
- YYDEBUG(19, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'U') {
- if (yych == 'O') goto yy44;
- if (yych <= 'T') goto yy26;
- goto yy45;
- } else {
- if (yych <= 'o') {
- if (yych <= 'n') goto yy26;
- goto yy44;
- } else {
- if (yych == 'u') goto yy45;
- goto yy26;
- }
- }
-yy20:
- YYDEBUG(20, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'N') {
- if (yych == 'F') goto yy38;
- if (yych <= 'M') goto yy26;
- goto yy31;
- } else {
- if (yych <= 'f') {
- if (yych <= 'e') goto yy26;
- goto yy38;
- } else {
- if (yych == 'n') goto yy31;
- goto yy26;
- }
- }
-yy21:
- YYDEBUG(21, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy36;
- if (yych == 'r') goto yy36;
- goto yy26;
-yy22:
- YYDEBUG(22, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy27;
- if (yych == 'e') goto yy27;
- goto yy26;
-yy23:
- YYDEBUG(23, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(24, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 358 "Zend/zend_ini_scanner.l"
- { /* Section start */
- /* Enter section data lookup state */
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
- yy_push_state(ST_SECTION_RAW TSRMLS_CC);
- } else {
- yy_push_state(ST_SECTION_VALUE TSRMLS_CC);
- }
- return TC_SECTION;
-}
-#line 646 "Zend/zend_ini_scanner.c"
-yy25:
- YYDEBUG(25, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy26:
- YYDEBUG(26, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy25;
- }
- if (yych == '[') goto yy28;
- goto yy3;
-yy27:
- YYDEBUG(27, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy31;
- if (yych == 's') goto yy31;
- goto yy26;
-yy28:
- YYDEBUG(28, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(29, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy28;
- }
- YYDEBUG(30, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 383 "Zend/zend_ini_scanner.l"
- { /* Start of option with offset */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace and [ */
- EAT_TRAILING_WHITESPACE_EX('[');
-
- /* Enter offset lookup state */
- yy_push_state(ST_OFFSET TSRMLS_CC);
-
- RETURN_TOKEN(TC_OFFSET, yytext, yyleng);
-}
-#line 689 "Zend/zend_ini_scanner.c"
-yy31:
- YYDEBUG(31, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(32, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy31;
- }
- if (yych <= '\'') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy25;
- if (yych <= '\t') goto yy34;
- } else {
- if (yych != '\r') goto yy25;
- }
- } else {
- if (yych <= '$') {
- if (yych == '#') goto yy25;
- } else {
- if (yych != '&') goto yy25;
- }
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= ';') {
- if (yych <= ')') goto yy33;
- if (yych <= ':') goto yy25;
- } else {
- if (yych != '=') goto yy25;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '[') goto yy28;
- if (yych <= ']') goto yy25;
- } else {
- if (yych <= 'z') goto yy25;
- if (yych >= 0x7F) goto yy25;
- }
- }
- }
-yy33:
- YYDEBUG(33, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 421 "Zend/zend_ini_scanner.l"
- { /* TRUE value (when used outside option value/offset this causes parse error!) */
- RETURN_TOKEN(BOOL_TRUE, "1", 1);
-}
-#line 739 "Zend/zend_ini_scanner.c"
-yy34:
- YYDEBUG(34, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(35, *YYCURSOR);
- if (yych == '\t') goto yy34;
- if (yych == ' ') goto yy34;
- goto yy33;
-yy36:
- YYDEBUG(36, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy37;
- if (yych != 'u') goto yy26;
-yy37:
- YYDEBUG(37, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy31;
- if (yych == 'e') goto yy31;
- goto yy26;
-yy38:
- YYDEBUG(38, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy39;
- if (yych != 'f') goto yy26;
-yy39:
- YYDEBUG(39, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(40, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy25;
- if (yych <= '\t') goto yy42;
- } else {
- if (yych != '\r') goto yy25;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy39;
- if (yych >= '#') goto yy25;
- } else {
- if (yych == '%') goto yy25;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '\'') goto yy25;
- if (yych >= '*') goto yy25;
- } else {
- if (yych == '<') goto yy25;
- }
- } else {
- if (yych <= ']') {
- if (yych == '[') goto yy28;
- goto yy25;
- } else {
- if (yych <= '^') goto yy41;
- if (yych <= 'z') goto yy25;
- if (yych >= 0x7F) goto yy25;
- }
- }
- }
-yy41:
- YYDEBUG(41, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 425 "Zend/zend_ini_scanner.l"
- { /* FALSE value (when used outside option value/offset this causes parse error!)*/
- RETURN_TOKEN(BOOL_FALSE, "", 0);
-}
-#line 813 "Zend/zend_ini_scanner.c"
-yy42:
- YYDEBUG(42, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(43, *YYCURSOR);
- if (yych == '\t') goto yy42;
- if (yych == ' ') goto yy42;
- goto yy41;
-yy44:
- YYDEBUG(44, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\'') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy26;
- if (yych <= '\t') goto yy42;
- goto yy41;
- } else {
- if (yych == '\r') goto yy41;
- goto yy26;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy39;
- if (yych <= '"') goto yy41;
- goto yy26;
- } else {
- if (yych == '%') goto yy26;
- if (yych <= '&') goto yy41;
- goto yy26;
- }
- }
- } else {
- if (yych <= 'N') {
- if (yych <= ';') {
- if (yych <= ')') goto yy41;
- if (yych <= ':') goto yy26;
- goto yy41;
- } else {
- if (yych == '=') goto yy41;
- if (yych <= 'M') goto yy26;
- goto yy47;
- }
- } else {
- if (yych <= 'm') {
- if (yych == '^') goto yy41;
- goto yy26;
- } else {
- if (yych <= 'n') goto yy47;
- if (yych <= 'z') goto yy26;
- if (yych <= '~') goto yy41;
- goto yy26;
- }
- }
- }
-yy45:
- YYDEBUG(45, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy46;
- if (yych != 'l') goto yy26;
-yy46:
- YYDEBUG(46, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy39;
- if (yych == 'l') goto yy39;
- goto yy26;
-yy47:
- YYDEBUG(47, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy39;
- if (yych == 'e') goto yy39;
- goto yy26;
-yy48:
- YYDEBUG(48, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy49;
- if (yych != 'l') goto yy26;
-yy49:
- YYDEBUG(49, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy50;
- if (yych != 's') goto yy26;
-yy50:
- YYDEBUG(50, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy39;
- if (yych == 'e') goto yy39;
- goto yy26;
-yy51:
- YYDEBUG(51, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy52:
- YYDEBUG(52, *YYCURSOR);
- if (yych == '\t') goto yy51;
- if (yych == ' ') goto yy51;
- goto yy17;
-yy53:
- YYDEBUG(53, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy54:
- YYDEBUG(54, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy53;
- }
- if (yych >= '\r') goto yy57;
-yy55:
- YYDEBUG(55, *YYCURSOR);
- ++YYCURSOR;
-yy56:
- YYDEBUG(56, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 936 "Zend/zend_ini_scanner.c"
-yy57:
- YYDEBUG(57, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy55;
- goto yy56;
-yy58:
- YYDEBUG(58, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy59:
- YYDEBUG(59, *YYCURSOR);
- if (yych <= '\'') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy58;
- if (yych >= '\n') goto yy64;
- } else {
- if (yych == '\r') goto yy66;
- goto yy58;
- }
- } else {
- if (yych <= '$') {
- if (yych == '#') goto yy58;
- } else {
- if (yych != '&') goto yy58;
- }
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= ';') {
- if (yych <= ')') goto yy60;
- if (yych <= ':') goto yy58;
- } else {
- if (yych != '=') goto yy58;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '[') goto yy62;
- if (yych <= ']') goto yy58;
- } else {
- if (yych <= 'z') goto yy58;
- if (yych >= 0x7F) goto yy58;
- }
- }
- }
-yy60:
- YYDEBUG(60, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(61, *YYCURSOR);
- if (yych == '\n') goto yy64;
- if (yych == '\r') goto yy66;
- goto yy60;
-yy62:
- YYDEBUG(62, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(63, *YYCURSOR);
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy60;
- if (yych <= '\t') goto yy62;
- if (yych >= '\v') goto yy60;
- } else {
- if (yych <= '\r') goto yy66;
- if (yych == ' ') goto yy62;
- goto yy60;
- }
-yy64:
- YYDEBUG(64, *YYCURSOR);
- ++YYCURSOR;
-yy65:
- YYDEBUG(65, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 591 "Zend/zend_ini_scanner.l"
- { /* #Comment */
- zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno));
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 1022 "Zend/zend_ini_scanner.c"
-yy66:
- YYDEBUG(66, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy64;
- goto yy65;
-yy67:
- YYDEBUG(67, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy68:
- YYDEBUG(68, *YYCURSOR);
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy5;
- if (yych <= '\t') goto yy67;
- goto yy71;
- } else {
- if (yych == '\r') goto yy72;
- if (yych <= 0x1F) goto yy5;
- goto yy67;
- }
- } else {
- if (yych <= ':') {
- if (yych == '#') goto yy60;
- goto yy5;
- } else {
- if (yych <= ';') goto yy53;
- if (yych == '=') goto yy51;
- goto yy5;
- }
- }
-yy69:
- YYDEBUG(69, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(70, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy25;
- if (yych <= '\t') goto yy67;
- } else {
- if (yych == '\r') goto yy72;
- goto yy25;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy69;
- if (yych <= '"') goto yy3;
- goto yy58;
- } else {
- if (yych == '%') goto yy25;
- goto yy3;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '\'') goto yy25;
- if (yych <= ')') goto yy3;
- goto yy25;
- } else {
- if (yych <= ';') goto yy53;
- if (yych <= '<') goto yy25;
- goto yy51;
- }
- } else {
- if (yych <= ']') {
- if (yych == '[') goto yy28;
- goto yy25;
- } else {
- if (yych <= '^') goto yy3;
- if (yych <= 'z') goto yy25;
- if (yych <= '~') goto yy3;
- goto yy25;
- }
- }
- }
-yy71:
- YYDEBUG(71, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy7;
-yy72:
- YYDEBUG(72, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) == '\n') goto yy71;
- goto yy7;
- }
-/* *********************************** */
-yyc_ST_DOUBLE_QUOTES:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- };
- YYDEBUG(73, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych == '"') goto yy77;
- if (yych == '$') goto yy79;
- YYDEBUG(75, *YYCURSOR);
- ++YYCURSOR;
-yy76:
- YYDEBUG(76, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 535 "Zend/zend_ini_scanner.l"
- { /* Escape double quoted string contents */
- if (YYCURSOR > YYLIMIT) {
- return 0;
- }
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '"':
- if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') {
- continue;
- }
- break;
- case '$':
- if (*YYCURSOR == '{') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
-
- zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC);
- return TC_QUOTED_STRING;
-}
-#line 1198 "Zend/zend_ini_scanner.c"
-yy77:
- YYDEBUG(77, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy83;
-yy78:
- YYDEBUG(78, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 530 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string ends */
- yy_pop_state(TSRMLS_C);
- return '"';
-}
-#line 1212 "Zend/zend_ini_scanner.c"
-yy79:
- YYDEBUG(79, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych != '{') goto yy76;
- YYDEBUG(80, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(81, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 401 "Zend/zend_ini_scanner.l"
- { /* Variable start */
- yy_push_state(ST_VARNAME TSRMLS_CC);
- return TC_DOLLAR_CURLY;
-}
-#line 1226 "Zend/zend_ini_scanner.c"
-yy82:
- YYDEBUG(82, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy83:
- YYDEBUG(83, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy82;
- }
- goto yy78;
- }
-/* *********************************** */
-yyc_ST_OFFSET:
- {
- static const unsigned char yybm[] = {
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 194, 64, 66, 66, 64, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 194, 66, 64, 66, 68, 66, 66, 0,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 66, 64, 66, 66, 66, 66,
- 66, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 66, 72, 64, 66, 82,
- 66, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- };
- YYDEBUG(84, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '-') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy86;
- if (yych <= '\t') goto yy88;
- goto yy89;
- } else {
- if (yych == '\r') goto yy89;
- if (yych >= ' ') goto yy88;
- }
- } else {
- if (yych <= '$') {
- if (yych == '"') goto yy91;
- if (yych >= '$') goto yy93;
- } else {
- if (yych == '\'') goto yy94;
- if (yych >= '-') goto yy95;
- }
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= '9') {
- if (yych <= '.') goto yy96;
- if (yych >= '0') goto yy97;
- } else {
- if (yych == ';') goto yy89;
- if (yych >= 'A') goto yy99;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '[') goto yy86;
- if (yych <= '\\') goto yy101;
- if (yych <= ']') goto yy102;
- } else {
- if (yych == '`') goto yy86;
- if (yych <= 'z') goto yy99;
- }
- }
- }
-yy86:
- YYDEBUG(86, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy105;
-yy87:
- YYDEBUG(87, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 521 "Zend/zend_ini_scanner.l"
- { /* Get rest as section/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 1330 "Zend/zend_ini_scanner.c"
-yy88:
- YYDEBUG(88, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy131;
- }
- if (yych == '"') goto yy133;
- if (yych == ']') goto yy134;
- goto yy105;
-yy89:
- YYDEBUG(89, *YYCURSOR);
- ++YYCURSOR;
-yy90:
- YYDEBUG(90, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 603 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 1351 "Zend/zend_ini_scanner.c"
-yy91:
- YYDEBUG(91, *YYCURSOR);
- ++YYCURSOR;
-yy92:
- YYDEBUG(92, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 525 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);
- return '"';
-}
-#line 1363 "Zend/zend_ini_scanner.c"
-yy93:
- YYDEBUG(93, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy90;
- if (yych <= '[') goto yy104;
- goto yy109;
- } else {
- if (yych == '{') goto yy129;
- goto yy104;
- }
-yy94:
- YYDEBUG(94, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy125;
- }
- goto yy90;
-yy95:
- YYDEBUG(95, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy105;
- if (yych <= '9') goto yy123;
- goto yy105;
-yy96:
- YYDEBUG(96, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy105;
- if (yych <= '9') goto yy121;
- goto yy105;
-yy97:
- YYDEBUG(97, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '\'') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy98;
- if (yych <= '\f') goto yy105;
- } else {
- if (yych == '"') goto yy98;
- if (yych <= '&') goto yy105;
- }
- } else {
- if (yych <= '9') {
- if (yych == '.') goto yy117;
- if (yych <= '/') goto yy105;
- goto yy119;
- } else {
- if (yych <= ';') {
- if (yych <= ':') goto yy105;
- } else {
- if (yych != ']') goto yy105;
- }
- }
- }
-yy98:
- YYDEBUG(98, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 499 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 1429 "Zend/zend_ini_scanner.c"
-yy99:
- YYDEBUG(99, *YYCURSOR);
- yyaccept = 3;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy115;
- }
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych != '\n') goto yy105;
- } else {
- if (yych <= '\r') goto yy100;
- if (yych <= '!') goto yy105;
- }
- } else {
- if (yych <= ':') {
- if (yych != '\'') goto yy105;
- } else {
- if (yych <= ';') goto yy100;
- if (yych != ']') goto yy105;
- }
- }
-yy100:
- YYDEBUG(100, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 495 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#line 1459 "Zend/zend_ini_scanner.c"
-yy101:
- YYDEBUG(101, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy104;
-yy102:
- YYDEBUG(102, *YYCURSOR);
- ++YYCURSOR;
-yy103:
- YYDEBUG(103, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 396 "Zend/zend_ini_scanner.l"
- { /* End of section or an option offset */
- BEGIN(INITIAL);
- return ']';
-}
-#line 1475 "Zend/zend_ini_scanner.c"
-yy104:
- YYDEBUG(104, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy105:
- YYDEBUG(105, *YYCURSOR);
- if (yybm[0+yych] & 2) {
- goto yy104;
- }
- if (yych == '$') goto yy107;
- if (yych != '\\') goto yy87;
-yy106:
- YYDEBUG(106, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- goto yy104;
-yy107:
- YYDEBUG(107, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy108;
- if (yych <= '[') goto yy104;
- goto yy109;
- } else {
- if (yych != '{') goto yy104;
- }
-yy108:
- YYDEBUG(108, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 1) {
- if (yyaccept <= 0) {
- goto yy87;
- } else {
- goto yy90;
- }
- } else {
- if (yyaccept <= 2) {
- goto yy98;
- } else {
- goto yy100;
- }
- }
-yy109:
- YYDEBUG(109, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 4) {
- goto yy110;
- }
- if (yych == '\\') goto yy112;
- goto yy104;
-yy110:
- YYDEBUG(110, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(111, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy110;
- }
- if (yych == '\\') goto yy114;
- goto yy104;
-yy112:
- YYDEBUG(112, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(113, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy110;
- }
- if (yych == '\\') goto yy112;
- goto yy104;
-yy114:
- YYDEBUG(114, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 4) {
- goto yy110;
- }
- if (yych == '\\') goto yy112;
- goto yy104;
-yy115:
- YYDEBUG(115, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(116, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy115;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy100;
- if (yych <= '\f') goto yy104;
- goto yy100;
- } else {
- if (yych == '"') goto yy100;
- if (yych <= '#') goto yy104;
- goto yy107;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy100;
- if (yych <= ':') goto yy104;
- goto yy100;
- } else {
- if (yych <= '[') goto yy104;
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy100;
- goto yy104;
- }
- }
-yy117:
- YYDEBUG(117, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(118, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy117;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy98;
- if (yych <= '\f') goto yy104;
- goto yy98;
- } else {
- if (yych == '"') goto yy98;
- if (yych <= '#') goto yy104;
- goto yy107;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy98;
- if (yych <= ':') goto yy104;
- goto yy98;
- } else {
- if (yych <= '[') goto yy104;
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy98;
- goto yy104;
- }
- }
-yy119:
- YYDEBUG(119, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(120, *YYCURSOR);
- if (yych <= '\'') {
- if (yych <= '!') {
- if (yych <= '\n') {
- if (yych <= '\t') goto yy104;
- goto yy98;
- } else {
- if (yych == '\r') goto yy98;
- goto yy104;
- }
- } else {
- if (yych <= '#') {
- if (yych <= '"') goto yy98;
- goto yy104;
- } else {
- if (yych <= '$') goto yy107;
- if (yych <= '&') goto yy104;
- goto yy98;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '.') {
- if (yych <= '-') goto yy104;
- goto yy117;
- } else {
- if (yych <= '/') goto yy104;
- if (yych <= '9') goto yy119;
- goto yy104;
- }
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy98;
- goto yy104;
- } else {
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy98;
- goto yy104;
- }
- }
- }
-yy121:
- YYDEBUG(121, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(122, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy98;
- if (yych <= '\f') goto yy104;
- goto yy98;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy104;
- goto yy98;
- } else {
- if (yych == '$') goto yy107;
- goto yy104;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy98;
- if (yych <= '/') goto yy104;
- if (yych <= '9') goto yy121;
- goto yy104;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy98;
- goto yy104;
- } else {
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy98;
- goto yy104;
- }
- }
- }
-yy123:
- YYDEBUG(123, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(124, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy98;
- if (yych <= '\f') goto yy104;
- goto yy98;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy104;
- goto yy98;
- } else {
- if (yych == '$') goto yy107;
- goto yy104;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy98;
- if (yych <= '/') goto yy104;
- if (yych <= '9') goto yy123;
- goto yy104;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy98;
- goto yy104;
- } else {
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy98;
- goto yy104;
- }
- }
- }
-yy125:
- YYDEBUG(125, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(126, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy125;
- }
- YYDEBUG(127, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(128, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 368 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1774 "Zend/zend_ini_scanner.c"
-yy129:
- YYDEBUG(129, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(130, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 401 "Zend/zend_ini_scanner.l"
- { /* Variable start */
- yy_push_state(ST_VARNAME TSRMLS_CC);
- return TC_DOLLAR_CURLY;
-}
-#line 1785 "Zend/zend_ini_scanner.c"
-yy131:
- YYDEBUG(131, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(132, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy131;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy87;
- if (yych <= '\f') goto yy104;
- goto yy87;
- } else {
- if (yych == '"') goto yy133;
- if (yych <= '#') goto yy104;
- goto yy107;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy87;
- if (yych <= ':') goto yy104;
- goto yy87;
- } else {
- if (yych <= '[') goto yy104;
- if (yych <= '\\') goto yy106;
- if (yych <= ']') goto yy134;
- goto yy104;
- }
- }
-yy133:
- YYDEBUG(133, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy92;
-yy134:
- YYDEBUG(134, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy103;
- }
-/* *********************************** */
-yyc_ST_RAW:
- {
- static const unsigned char yybm[] = {
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 192, 0, 64, 64, 0, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 192, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64,
- };
- YYDEBUG(135, *YYCURSOR);
- YYFILL(3);
- yych = *YYCURSOR;
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy139;
- } else {
- if (yych <= '\t') goto yy141;
- if (yych <= '\n') goto yy142;
- goto yy139;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy144;
- if (yych <= 0x1F) goto yy139;
- goto yy141;
- } else {
- if (yych == ';') goto yy145;
- goto yy139;
- }
- }
- YYDEBUG(137, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(138, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 598 "Zend/zend_ini_scanner.l"
- { /* End of option value (if EOF is reached before EOL */
- BEGIN(INITIAL);
- return END_OF_LINE;
-}
-#line 1895 "Zend/zend_ini_scanner.c"
-yy139:
- YYDEBUG(139, *YYCURSOR);
- ++YYCURSOR;
-yy140:
- YYDEBUG(140, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 448 "Zend/zend_ini_scanner.l"
- { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
- char *sc = NULL;
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR) {
- case '\n':
- case '\r':
- goto end_raw_value_chars;
- break;
- case ';':
- if (sc == NULL) {
- sc = YYCURSOR;
- }
- /* no break */
- default:
- YYCURSOR++;
- break;
- }
- }
-end_raw_value_chars:
- yyleng = YYCURSOR - SCNG(yy_text);
-
- /* Eat trailing semicolons */
- while (yytext[yyleng - 1] == ';') {
- yyleng--;
- }
-
- /* Eat leading and trailing double quotes */
- if (yytext[0] == '"' && yytext[yyleng - 1] == '"') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- } else if (sc) {
- YYCURSOR = sc;
- yyleng = YYCURSOR - SCNG(yy_text);
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1939 "Zend/zend_ini_scanner.c"
-yy141:
- YYDEBUG(141, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy140;
- if (yych <= '\n') goto yy153;
- if (yych <= '\f') goto yy140;
- goto yy153;
- } else {
- if (yych <= ' ') {
- if (yych <= 0x1F) goto yy140;
- goto yy153;
- } else {
- if (yych == ';') goto yy153;
- goto yy140;
- }
- }
-yy142:
- YYDEBUG(142, *YYCURSOR);
- ++YYCURSOR;
-yy143:
- YYDEBUG(143, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 489 "Zend/zend_ini_scanner.l"
- { /* End of option value */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 1970 "Zend/zend_ini_scanner.c"
-yy144:
- YYDEBUG(144, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy151;
- goto yy143;
-yy145:
- YYDEBUG(145, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy147;
-yy146:
- YYDEBUG(146, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy147:
- YYDEBUG(147, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy146;
- }
- if (yych >= '\r') goto yy150;
-yy148:
- YYDEBUG(148, *YYCURSOR);
- ++YYCURSOR;
-yy149:
- YYDEBUG(149, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 2004 "Zend/zend_ini_scanner.c"
-yy150:
- YYDEBUG(150, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy148;
- goto yy149;
-yy151:
- YYDEBUG(151, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy143;
-yy152:
- YYDEBUG(152, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy153:
- YYDEBUG(153, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy152;
- }
- if (yych <= '\f') {
- if (yych == '\n') goto yy151;
- } else {
- if (yych <= '\r') goto yy155;
- if (yych == ';') goto yy146;
- }
- YYDEBUG(154, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 575 "Zend/zend_ini_scanner.l"
- {
- /* eat whitespace */
- goto restart;
-}
-#line 2038 "Zend/zend_ini_scanner.c"
-yy155:
- YYDEBUG(155, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) == '\n') goto yy151;
- goto yy143;
- }
-/* *********************************** */
-yyc_ST_SECTION_RAW:
- {
- static const unsigned char yybm[] = {
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 192, 0, 128, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 192, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- };
- YYDEBUG(156, *YYCURSOR);
- YYFILL(3);
- yych = *YYCURSOR;
- if (yych <= '\f') {
- if (yych == '\n') goto yy160;
- } else {
- if (yych <= '\r') goto yy160;
- if (yych == ']') goto yy162;
- }
- YYDEBUG(158, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy169;
-yy159:
- YYDEBUG(159, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 485 "Zend/zend_ini_scanner.l"
- { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 2102 "Zend/zend_ini_scanner.c"
-yy160:
- YYDEBUG(160, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(161, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 603 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 2112 "Zend/zend_ini_scanner.c"
-yy162:
- YYDEBUG(162, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy165;
-yy163:
- YYDEBUG(163, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 377 "Zend/zend_ini_scanner.l"
- { /* End of section */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return ']';
-}
-#line 2127 "Zend/zend_ini_scanner.c"
-yy164:
- YYDEBUG(164, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy165:
- YYDEBUG(165, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy164;
- }
- if (yych == '\n') goto yy166;
- if (yych == '\r') goto yy167;
- goto yy163;
-yy166:
- YYDEBUG(166, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy163;
-yy167:
- YYDEBUG(167, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy166;
- goto yy163;
-yy168:
- YYDEBUG(168, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy169:
- YYDEBUG(169, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy168;
- }
- goto yy159;
- }
-/* *********************************** */
-yyc_ST_SECTION_VALUE:
- {
- static const unsigned char yybm[] = {
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 134, 128, 132, 132, 128, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 134, 132, 128, 132, 136, 132, 132, 0,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 228, 228, 228, 228, 228, 228, 228, 228,
- 228, 228, 132, 128, 132, 132, 132, 132,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 144, 128, 132, 164,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- };
- YYDEBUG(170, *YYCURSOR);
- YYFILL(3);
- yych = *YYCURSOR;
- if (yych <= '-') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy172;
- if (yych <= '\t') goto yy174;
- goto yy175;
- } else {
- if (yych == '\r') goto yy175;
- if (yych >= ' ') goto yy174;
- }
- } else {
- if (yych <= '$') {
- if (yych == '"') goto yy177;
- if (yych >= '$') goto yy179;
- } else {
- if (yych == '\'') goto yy180;
- if (yych >= '-') goto yy181;
- }
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= '9') {
- if (yych <= '.') goto yy182;
- if (yych >= '0') goto yy183;
- } else {
- if (yych == ';') goto yy175;
- if (yych >= 'A') goto yy185;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '[') goto yy172;
- if (yych <= '\\') goto yy187;
- if (yych <= ']') goto yy188;
- } else {
- if (yych == '`') goto yy172;
- if (yych <= 'z') goto yy185;
- }
- }
- }
-yy172:
- YYDEBUG(172, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy195;
-yy173:
- YYDEBUG(173, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 521 "Zend/zend_ini_scanner.l"
- { /* Get rest as section/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 2253 "Zend/zend_ini_scanner.c"
-yy174:
- YYDEBUG(174, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy221;
- goto yy195;
- } else {
- if (yych <= ' ') goto yy221;
- if (yych == '"') goto yy223;
- goto yy195;
- }
-yy175:
- YYDEBUG(175, *YYCURSOR);
- ++YYCURSOR;
-yy176:
- YYDEBUG(176, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 603 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 2276 "Zend/zend_ini_scanner.c"
-yy177:
- YYDEBUG(177, *YYCURSOR);
- ++YYCURSOR;
-yy178:
- YYDEBUG(178, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 525 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);
- return '"';
-}
-#line 2288 "Zend/zend_ini_scanner.c"
-yy179:
- YYDEBUG(179, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy176;
- if (yych <= '[') goto yy194;
- goto yy199;
- } else {
- if (yych == '{') goto yy219;
- goto yy194;
- }
-yy180:
- YYDEBUG(180, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy215;
- }
- goto yy176;
-yy181:
- YYDEBUG(181, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy195;
- if (yych <= '9') goto yy213;
- goto yy195;
-yy182:
- YYDEBUG(182, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy195;
- if (yych <= '9') goto yy211;
- goto yy195;
-yy183:
- YYDEBUG(183, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '\'') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy184;
- if (yych <= '\f') goto yy195;
- } else {
- if (yych == '"') goto yy184;
- if (yych <= '&') goto yy195;
- }
- } else {
- if (yych <= '9') {
- if (yych == '.') goto yy207;
- if (yych <= '/') goto yy195;
- goto yy209;
- } else {
- if (yych <= ';') {
- if (yych <= ':') goto yy195;
- } else {
- if (yych != ']') goto yy195;
- }
- }
- }
-yy184:
- YYDEBUG(184, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 499 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 2354 "Zend/zend_ini_scanner.c"
-yy185:
- YYDEBUG(185, *YYCURSOR);
- yyaccept = 3;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy205;
- }
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych != '\n') goto yy195;
- } else {
- if (yych <= '\r') goto yy186;
- if (yych <= '!') goto yy195;
- }
- } else {
- if (yych <= ':') {
- if (yych != '\'') goto yy195;
- } else {
- if (yych <= ';') goto yy186;
- if (yych != ']') goto yy195;
- }
- }
-yy186:
- YYDEBUG(186, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 495 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#line 2384 "Zend/zend_ini_scanner.c"
-yy187:
- YYDEBUG(187, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy194;
-yy188:
- YYDEBUG(188, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy191;
-yy189:
- YYDEBUG(189, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 377 "Zend/zend_ini_scanner.l"
- { /* End of section */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return ']';
-}
-#line 2403 "Zend/zend_ini_scanner.c"
-yy190:
- YYDEBUG(190, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy191:
- YYDEBUG(191, *YYCURSOR);
- if (yybm[0+yych] & 2) {
- goto yy190;
- }
- if (yych == '\n') goto yy192;
- if (yych == '\r') goto yy193;
- goto yy189;
-yy192:
- YYDEBUG(192, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy189;
-yy193:
- YYDEBUG(193, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy192;
- goto yy189;
-yy194:
- YYDEBUG(194, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy195:
- YYDEBUG(195, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy194;
- }
- if (yych == '$') goto yy197;
- if (yych != '\\') goto yy173;
-yy196:
- YYDEBUG(196, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- goto yy194;
-yy197:
- YYDEBUG(197, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy198;
- if (yych <= '[') goto yy194;
- goto yy199;
- } else {
- if (yych != '{') goto yy194;
- }
-yy198:
- YYDEBUG(198, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 1) {
- if (yyaccept <= 0) {
- goto yy173;
- } else {
- goto yy176;
- }
- } else {
- if (yyaccept <= 2) {
- goto yy184;
- } else {
- goto yy186;
- }
- }
-yy199:
- YYDEBUG(199, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy200;
- }
- if (yych == '\\') goto yy202;
- goto yy194;
-yy200:
- YYDEBUG(200, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(201, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy200;
- }
- if (yych == '\\') goto yy204;
- goto yy194;
-yy202:
- YYDEBUG(202, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(203, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy200;
- }
- if (yych == '\\') goto yy202;
- goto yy194;
-yy204:
- YYDEBUG(204, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy200;
- }
- if (yych == '\\') goto yy202;
- goto yy194;
-yy205:
- YYDEBUG(205, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(206, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy205;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy186;
- if (yych <= '\f') goto yy194;
- goto yy186;
- } else {
- if (yych == '"') goto yy186;
- if (yych <= '#') goto yy194;
- goto yy197;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy186;
- if (yych <= ':') goto yy194;
- goto yy186;
- } else {
- if (yych <= '[') goto yy194;
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy186;
- goto yy194;
- }
- }
-yy207:
- YYDEBUG(207, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(208, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy207;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy184;
- if (yych <= '\f') goto yy194;
- goto yy184;
- } else {
- if (yych == '"') goto yy184;
- if (yych <= '#') goto yy194;
- goto yy197;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy184;
- if (yych <= ':') goto yy194;
- goto yy184;
- } else {
- if (yych <= '[') goto yy194;
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy184;
- goto yy194;
- }
- }
-yy209:
- YYDEBUG(209, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(210, *YYCURSOR);
- if (yych <= '\'') {
- if (yych <= '!') {
- if (yych <= '\n') {
- if (yych <= '\t') goto yy194;
- goto yy184;
- } else {
- if (yych == '\r') goto yy184;
- goto yy194;
- }
- } else {
- if (yych <= '#') {
- if (yych <= '"') goto yy184;
- goto yy194;
- } else {
- if (yych <= '$') goto yy197;
- if (yych <= '&') goto yy194;
- goto yy184;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '.') {
- if (yych <= '-') goto yy194;
- goto yy207;
- } else {
- if (yych <= '/') goto yy194;
- if (yych <= '9') goto yy209;
- goto yy194;
- }
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy184;
- goto yy194;
- } else {
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy184;
- goto yy194;
- }
- }
- }
-yy211:
- YYDEBUG(211, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(212, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy184;
- if (yych <= '\f') goto yy194;
- goto yy184;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy194;
- goto yy184;
- } else {
- if (yych == '$') goto yy197;
- goto yy194;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy184;
- if (yych <= '/') goto yy194;
- if (yych <= '9') goto yy211;
- goto yy194;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy184;
- goto yy194;
- } else {
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy184;
- goto yy194;
- }
- }
- }
-yy213:
- YYDEBUG(213, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(214, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy184;
- if (yych <= '\f') goto yy194;
- goto yy184;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy194;
- goto yy184;
- } else {
- if (yych == '$') goto yy197;
- goto yy194;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy184;
- if (yych <= '/') goto yy194;
- if (yych <= '9') goto yy213;
- goto yy194;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy184;
- goto yy194;
- } else {
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy184;
- goto yy194;
- }
- }
- }
-yy215:
- YYDEBUG(215, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(216, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy215;
- }
- YYDEBUG(217, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(218, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 368 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 2724 "Zend/zend_ini_scanner.c"
-yy219:
- YYDEBUG(219, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(220, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 401 "Zend/zend_ini_scanner.l"
- { /* Variable start */
- yy_push_state(ST_VARNAME TSRMLS_CC);
- return TC_DOLLAR_CURLY;
-}
-#line 2735 "Zend/zend_ini_scanner.c"
-yy221:
- YYDEBUG(221, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(222, *YYCURSOR);
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy194;
- if (yych <= '\t') goto yy221;
- if (yych <= '\n') goto yy173;
- goto yy194;
- } else {
- if (yych <= 0x1F) {
- if (yych <= '\r') goto yy173;
- goto yy194;
- } else {
- if (yych <= ' ') goto yy221;
- if (yych <= '!') goto yy194;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '$') {
- if (yych <= '#') goto yy194;
- goto yy197;
- } else {
- if (yych == '\'') goto yy173;
- goto yy194;
- }
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy173;
- goto yy194;
- } else {
- if (yych <= '\\') goto yy196;
- if (yych <= ']') goto yy173;
- goto yy194;
- }
- }
- }
-yy223:
- YYDEBUG(223, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy178;
- }
-/* *********************************** */
-yyc_ST_VALUE:
- {
- static const unsigned char yybm[] = {
- 160, 162, 162, 162, 162, 162, 162, 162,
- 162, 176, 128, 162, 162, 128, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 176, 160, 160, 162, 168, 162, 160, 32,
- 160, 160, 162, 162, 162, 162, 162, 162,
- 230, 230, 230, 230, 230, 230, 230, 230,
- 230, 230, 162, 160, 162, 160, 162, 162,
- 162, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 162, 162, 162, 160, 166,
- 162, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 162, 160, 162, 160, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162,
- };
- YYDEBUG(224, *YYCURSOR);
- YYFILL(6);
- yych = *YYCURSOR;
- YYDEBUG(-1, yych);
- switch (yych) {
- case 0x00: goto yy226;
- case '\t':
- case ' ': goto yy230;
- case '\n': goto yy232;
- case '\r': goto yy234;
- case '!':
- case '&':
- case '(':
- case ')':
- case '^':
- case '|':
- case '~': goto yy235;
- case '"': goto yy237;
- case '$': goto yy239;
- case '\'': goto yy240;
- case '-': goto yy241;
- case '.': goto yy242;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9': goto yy243;
- case ';': goto yy245;
- case '=': goto yy246;
- case 'A':
- case 'B':
- case 'C':
- case 'D':
- case 'E':
- case 'G':
- case 'H':
- case 'I':
- case 'J':
- case 'K':
- case 'L':
- case 'M':
- case 'P':
- case 'Q':
- case 'R':
- case 'S':
- case 'U':
- case 'V':
- case 'W':
- case 'X':
- case 'Z':
- case '_':
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'g':
- case 'h':
- case 'i':
- case 'j':
- case 'k':
- case 'l':
- case 'm':
- case 'p':
- case 'q':
- case 'r':
- case 's':
- case 'u':
- case 'v':
- case 'w':
- case 'x':
- case 'z': goto yy248;
- case 'F':
- case 'f': goto yy250;
- case 'N':
- case 'n': goto yy251;
- case 'O':
- case 'o': goto yy252;
- case 'T':
- case 't': goto yy253;
- case 'Y':
- case 'y': goto yy254;
- default: goto yy228;
- }
-yy226:
- YYDEBUG(226, *YYCURSOR);
- ++YYCURSOR;
-yy227:
- YYDEBUG(227, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 598 "Zend/zend_ini_scanner.l"
- { /* End of option value (if EOF is reached before EOL */
- BEGIN(INITIAL);
- return END_OF_LINE;
-}
-#line 2921 "Zend/zend_ini_scanner.c"
-yy228:
- YYDEBUG(228, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy256;
-yy229:
- YYDEBUG(229, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 517 "Zend/zend_ini_scanner.l"
- { /* Get everything else as option/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 2934 "Zend/zend_ini_scanner.c"
-yy230:
- YYDEBUG(230, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy306;
-yy231:
- YYDEBUG(231, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 571 "Zend/zend_ini_scanner.l"
- {
- RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);
-}
-#line 2947 "Zend/zend_ini_scanner.c"
-yy232:
- YYDEBUG(232, *YYCURSOR);
- ++YYCURSOR;
-yy233:
- YYDEBUG(233, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 489 "Zend/zend_ini_scanner.l"
- { /* End of option value */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 2960 "Zend/zend_ini_scanner.c"
-yy234:
- YYDEBUG(234, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy304;
- goto yy233;
-yy235:
- YYDEBUG(235, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy303;
-yy236:
- YYDEBUG(236, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 507 "Zend/zend_ini_scanner.l"
- { /* Boolean operators */
- return yytext[0];
-}
-#line 2978 "Zend/zend_ini_scanner.c"
-yy237:
- YYDEBUG(237, *YYCURSOR);
- ++YYCURSOR;
-yy238:
- YYDEBUG(238, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 525 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);
- return '"';
-}
-#line 2990 "Zend/zend_ini_scanner.c"
-yy239:
- YYDEBUG(239, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy227;
- if (yych <= '[') goto yy255;
- goto yy262;
- } else {
- if (yych == '{') goto yy300;
- goto yy255;
- }
-yy240:
- YYDEBUG(240, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy296;
- }
- goto yy227;
-yy241:
- YYDEBUG(241, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy294;
- goto yy256;
-yy242:
- YYDEBUG(242, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy292;
- goto yy256;
-yy243:
- YYDEBUG(243, *YYCURSOR);
- yyaccept = 3;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy244;
- if (yych <= 0x08) goto yy256;
- } else {
- if (yych != '\r') goto yy256;
- }
- } else {
- if (yych <= ')') {
- if (yych <= '"') goto yy244;
- if (yych <= '%') goto yy256;
- } else {
- if (yych == '.') goto yy288;
- goto yy256;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= '9') goto yy290;
- if (yych <= ':') goto yy256;
- } else {
- if (yych != '=') goto yy256;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy244;
- if (yych <= '{') goto yy256;
- } else {
- if (yych != '~') goto yy256;
- }
- }
- }
-yy244:
- YYDEBUG(244, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 499 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 3069 "Zend/zend_ini_scanner.c"
-yy245:
- YYDEBUG(245, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- goto yy284;
-yy246:
- YYDEBUG(246, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(247, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 511 "Zend/zend_ini_scanner.l"
- { /* Make = used in option value to trigger error */
- yyless(0);
- BEGIN(INITIAL);
- return END_OF_LINE;
-}
-#line 3086 "Zend/zend_ini_scanner.c"
-yy248:
- YYDEBUG(248, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy257;
- }
- if (yych <= ':') {
- if (yych <= '\r') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy256;
- } else {
- if (yych <= '\n') goto yy249;
- if (yych <= '\f') goto yy256;
- }
- } else {
- if (yych <= '"') {
- if (yych <= 0x1F) goto yy256;
- } else {
- if (yych <= '%') goto yy256;
- if (yych >= '*') goto yy256;
- }
- }
- } else {
- if (yych <= '^') {
- if (yych <= '<') {
- if (yych >= '<') goto yy256;
- } else {
- if (yych <= '=') goto yy249;
- if (yych <= ']') goto yy256;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy256;
- } else {
- if (yych != '~') goto yy256;
- }
- }
- }
-yy249:
- YYDEBUG(249, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 495 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#line 3133 "Zend/zend_ini_scanner.c"
-yy250:
- YYDEBUG(250, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '<') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '/') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- goto yy256;
- } else {
- if (yych <= '9') goto yy257;
- if (yych == ';') goto yy249;
- goto yy256;
- }
- }
- } else {
- if (yych <= '_') {
- if (yych <= 'A') {
- if (yych <= '=') goto yy249;
- if (yych <= '@') goto yy256;
- goto yy280;
- } else {
- if (yych <= 'Z') goto yy257;
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- goto yy257;
- }
- } else {
- if (yych <= '{') {
- if (yych <= '`') goto yy256;
- if (yych <= 'a') goto yy280;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy251:
- YYDEBUG(251, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'N') {
- if (yych <= '%') {
- if (yych <= '\f') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- if (yych <= '\n') goto yy249;
- goto yy256;
- } else {
- if (yych <= '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- if (yych <= '"') goto yy249;
- goto yy256;
- }
- } else {
- if (yych <= ':') {
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy257;
- goto yy256;
- } else {
- if (yych <= '<') {
- if (yych <= ';') goto yy249;
- goto yy256;
- } else {
- if (yych <= '=') goto yy249;
- if (yych <= '@') goto yy256;
- goto yy257;
- }
- }
- }
- } else {
- if (yych <= 'n') {
- if (yych <= 'Z') {
- if (yych <= 'O') goto yy276;
- if (yych == 'U') goto yy277;
- goto yy257;
- } else {
- if (yych <= '^') {
- if (yych <= ']') goto yy256;
- goto yy249;
- } else {
- if (yych == '`') goto yy256;
- goto yy257;
- }
- }
- } else {
- if (yych <= 'z') {
- if (yych <= 'o') goto yy276;
- if (yych == 'u') goto yy277;
- goto yy257;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy256;
- goto yy249;
- } else {
- if (yych == '~') goto yy249;
- goto yy256;
- }
- }
- }
- }
-yy252:
- YYDEBUG(252, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'E') {
- if (yych <= '%') {
- if (yych <= '\f') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- if (yych <= '\n') goto yy249;
- goto yy256;
- } else {
- if (yych <= '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- if (yych <= '"') goto yy249;
- goto yy256;
- }
- } else {
- if (yych <= ':') {
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy257;
- goto yy256;
- } else {
- if (yych <= '<') {
- if (yych <= ';') goto yy249;
- goto yy256;
- } else {
- if (yych <= '=') goto yy249;
- if (yych <= '@') goto yy256;
- goto yy257;
- }
- }
- }
- } else {
- if (yych <= 'e') {
- if (yych <= 'Z') {
- if (yych <= 'F') goto yy271;
- if (yych == 'N') goto yy265;
- goto yy257;
- } else {
- if (yych <= '^') {
- if (yych <= ']') goto yy256;
- goto yy249;
- } else {
- if (yych == '`') goto yy256;
- goto yy257;
- }
- }
- } else {
- if (yych <= 'z') {
- if (yych <= 'f') goto yy271;
- if (yych == 'n') goto yy265;
- goto yy257;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy256;
- goto yy249;
- } else {
- if (yych == '~') goto yy249;
- goto yy256;
- }
- }
- }
- }
-yy253:
- YYDEBUG(253, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'R') goto yy269;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'r') goto yy269;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy254:
- YYDEBUG(254, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'E') goto yy259;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy259;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy255:
- YYDEBUG(255, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy256:
- YYDEBUG(256, *YYCURSOR);
- if (yybm[0+yych] & 2) {
- goto yy255;
- }
- if (yych == '$') goto yy260;
- goto yy229;
-yy257:
- YYDEBUG(257, *YYCURSOR);
- yyaccept = 4;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(258, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy257;
- }
- if (yych <= ')') {
- if (yych <= '\r') {
- if (yych <= 0x08) {
- if (yych <= 0x00) goto yy249;
- goto yy255;
- } else {
- if (yych <= '\n') goto yy249;
- if (yych <= '\f') goto yy255;
- goto yy249;
- }
- } else {
- if (yych <= '#') {
- if (yych <= 0x1F) goto yy255;
- if (yych <= '"') goto yy249;
- goto yy255;
- } else {
- if (yych <= '$') goto yy260;
- if (yych <= '%') goto yy255;
- goto yy249;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy255;
- goto yy249;
- } else {
- if (yych == '=') goto yy249;
- goto yy255;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy249;
- if (yych <= '{') goto yy255;
- goto yy249;
- } else {
- if (yych == '~') goto yy249;
- goto yy255;
- }
- }
- }
-yy259:
- YYDEBUG(259, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'S') goto yy265;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 's') goto yy265;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy260:
- YYDEBUG(260, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy261;
- if (yych <= '[') goto yy255;
- goto yy262;
- } else {
- if (yych != '{') goto yy255;
- }
-yy261:
- YYDEBUG(261, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 3) {
- if (yyaccept <= 1) {
- if (yyaccept <= 0) {
- goto yy229;
- } else {
- goto yy231;
- }
- } else {
- if (yyaccept <= 2) {
- goto yy227;
- } else {
- goto yy244;
- }
- }
- } else {
- if (yyaccept <= 5) {
- if (yyaccept <= 4) {
- goto yy249;
- } else {
- goto yy266;
- }
- } else {
- goto yy273;
- }
- }
-yy262:
- YYDEBUG(262, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy263;
- }
- goto yy255;
-yy263:
- YYDEBUG(263, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(264, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy263;
- }
- if (yych <= 0x00) goto yy229;
- if (yych == '\\') goto yy262;
- goto yy255;
-yy265:
- YYDEBUG(265, *YYCURSOR);
- yyaccept = 5;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy267;
- }
- if (yych <= ';') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy266;
- if (yych <= '\t') goto yy256;
- } else {
- if (yych != '\r') goto yy256;
- }
- } else {
- if (yych <= ')') {
- if (yych <= '"') goto yy266;
- if (yych <= '%') goto yy256;
- } else {
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy257;
- if (yych <= ':') goto yy256;
- }
- }
- } else {
- if (yych <= '_') {
- if (yych <= '@') {
- if (yych != '=') goto yy256;
- } else {
- if (yych <= 'Z') goto yy257;
- if (yych <= ']') goto yy256;
- if (yych >= '_') goto yy257;
- }
- } else {
- if (yych <= '{') {
- if (yych <= '`') goto yy256;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych >= 0x7F) goto yy256;
- }
- }
- }
-yy266:
- YYDEBUG(266, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 421 "Zend/zend_ini_scanner.l"
- { /* TRUE value (when used outside option value/offset this causes parse error!) */
- RETURN_TOKEN(BOOL_TRUE, "1", 1);
-}
-#line 3645 "Zend/zend_ini_scanner.c"
-yy267:
- YYDEBUG(267, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(268, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy267;
- }
- goto yy266;
-yy269:
- YYDEBUG(269, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych != 'U') goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'u') goto yy270;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy270:
- YYDEBUG(270, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'E') goto yy265;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy265;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy271:
- YYDEBUG(271, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych != 'F') goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'f') goto yy272;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy272:
- YYDEBUG(272, *YYCURSOR);
- yyaccept = 6;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy257;
- }
- if (yych <= ')') {
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy256;
- } else {
- if (yych <= '\t') goto yy274;
- if (yych >= '\v') goto yy256;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy273;
- if (yych <= 0x1F) goto yy256;
- goto yy274;
- } else {
- if (yych <= '"') goto yy273;
- if (yych <= '%') goto yy256;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy256;
- } else {
- if (yych != '=') goto yy256;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy273;
- if (yych <= '{') goto yy256;
- } else {
- if (yych != '~') goto yy256;
- }
- }
- }
-yy273:
- YYDEBUG(273, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 425 "Zend/zend_ini_scanner.l"
- { /* FALSE value (when used outside option value/offset this causes parse error!)*/
- RETURN_TOKEN(BOOL_FALSE, "", 0);
-}
-#line 3855 "Zend/zend_ini_scanner.c"
-yy274:
- YYDEBUG(274, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(275, *YYCURSOR);
- if (yych == '\t') goto yy274;
- if (yych == ' ') goto yy274;
- goto yy273;
-yy276:
- YYDEBUG(276, *YYCURSOR);
- yyaccept = 6;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '<') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy273;
- if (yych <= 0x08) goto yy256;
- if (yych <= '\t') goto yy274;
- goto yy273;
- } else {
- if (yych == '\r') goto yy273;
- if (yych <= 0x1F) goto yy256;
- goto yy274;
- }
- } else {
- if (yych <= '/') {
- if (yych <= '"') goto yy273;
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy273;
- goto yy256;
- } else {
- if (yych <= '9') goto yy257;
- if (yych == ';') goto yy273;
- goto yy256;
- }
- }
- } else {
- if (yych <= '_') {
- if (yych <= 'N') {
- if (yych <= '=') goto yy273;
- if (yych <= '@') goto yy256;
- if (yych <= 'M') goto yy257;
- goto yy279;
- } else {
- if (yych <= 'Z') goto yy257;
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy273;
- goto yy257;
- }
- } else {
- if (yych <= 'z') {
- if (yych <= '`') goto yy256;
- if (yych == 'n') goto yy279;
- goto yy257;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy256;
- goto yy273;
- } else {
- if (yych == '~') goto yy273;
- goto yy256;
- }
- }
- }
- }
-yy277:
- YYDEBUG(277, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych != 'L') goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy278;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy278:
- YYDEBUG(278, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'L') goto yy272;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy272;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy279:
- YYDEBUG(279, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'E') goto yy272;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy272;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy280:
- YYDEBUG(280, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych != 'L') goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy281;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy281:
- YYDEBUG(281, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych != 'S') goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 's') goto yy282;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy282:
- YYDEBUG(282, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy249;
- if (yych <= 0x08) goto yy256;
- goto yy249;
- } else {
- if (yych == '\r') goto yy249;
- if (yych <= 0x1F) goto yy256;
- goto yy249;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy256;
- if (yych <= ')') goto yy249;
- if (yych <= '/') goto yy256;
- goto yy257;
- } else {
- if (yych == ';') goto yy249;
- if (yych <= '<') goto yy256;
- goto yy249;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy256;
- if (yych == 'E') goto yy272;
- goto yy257;
- } else {
- if (yych <= ']') goto yy256;
- if (yych <= '^') goto yy249;
- if (yych <= '_') goto yy257;
- goto yy256;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy272;
- if (yych <= 'z') goto yy257;
- goto yy256;
- } else {
- if (yych == '}') goto yy256;
- if (yych <= '~') goto yy249;
- goto yy256;
- }
- }
- }
-yy283:
- YYDEBUG(283, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy284:
- YYDEBUG(284, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy283;
- }
- if (yych >= '\r') goto yy287;
-yy285:
- YYDEBUG(285, *YYCURSOR);
- ++YYCURSOR;
-yy286:
- YYDEBUG(286, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 4248 "Zend/zend_ini_scanner.c"
-yy287:
- YYDEBUG(287, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy285;
- goto yy286;
-yy288:
- YYDEBUG(288, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(289, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy288;
- }
- if (yych <= ')') {
- if (yych <= '\r') {
- if (yych <= 0x08) {
- if (yych <= 0x00) goto yy244;
- goto yy255;
- } else {
- if (yych <= '\n') goto yy244;
- if (yych <= '\f') goto yy255;
- goto yy244;
- }
- } else {
- if (yych <= '#') {
- if (yych <= 0x1F) goto yy255;
- if (yych <= '"') goto yy244;
- goto yy255;
- } else {
- if (yych <= '$') goto yy260;
- if (yych <= '%') goto yy255;
- goto yy244;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy255;
- goto yy244;
- } else {
- if (yych == '=') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy244;
- if (yych <= '{') goto yy255;
- goto yy244;
- } else {
- if (yych == '~') goto yy244;
- goto yy255;
- }
- }
- }
-yy290:
- YYDEBUG(290, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(291, *YYCURSOR);
- if (yych <= '.') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy244;
- if (yych <= 0x08) goto yy255;
- goto yy244;
- } else {
- if (yych == '\r') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy244;
- if (yych <= '#') goto yy255;
- goto yy260;
- } else {
- if (yych <= '%') goto yy255;
- if (yych <= ')') goto yy244;
- if (yych <= '-') goto yy255;
- goto yy288;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '/') goto yy255;
- if (yych <= '9') goto yy290;
- goto yy255;
- } else {
- if (yych == '<') goto yy255;
- goto yy244;
- }
- } else {
- if (yych <= '{') {
- if (yych == '^') goto yy244;
- goto yy255;
- } else {
- if (yych == '}') goto yy255;
- if (yych <= '~') goto yy244;
- goto yy255;
- }
- }
- }
-yy292:
- YYDEBUG(292, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(293, *YYCURSOR);
- if (yych <= '/') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy244;
- if (yych <= 0x08) goto yy255;
- goto yy244;
- } else {
- if (yych == '\r') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy244;
- if (yych <= '#') goto yy255;
- goto yy260;
- } else {
- if (yych <= '%') goto yy255;
- if (yych <= ')') goto yy244;
- goto yy255;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= '9') goto yy292;
- if (yych <= ':') goto yy255;
- goto yy244;
- } else {
- if (yych == '=') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy244;
- if (yych <= '{') goto yy255;
- goto yy244;
- } else {
- if (yych == '~') goto yy244;
- goto yy255;
- }
- }
- }
-yy294:
- YYDEBUG(294, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(295, *YYCURSOR);
- if (yych <= '/') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy244;
- if (yych <= 0x08) goto yy255;
- goto yy244;
- } else {
- if (yych == '\r') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy244;
- if (yych <= '#') goto yy255;
- goto yy260;
- } else {
- if (yych <= '%') goto yy255;
- if (yych <= ')') goto yy244;
- goto yy255;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= '9') goto yy294;
- if (yych <= ':') goto yy255;
- goto yy244;
- } else {
- if (yych == '=') goto yy244;
- goto yy255;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy244;
- if (yych <= '{') goto yy255;
- goto yy244;
- } else {
- if (yych == '~') goto yy244;
- goto yy255;
- }
- }
- }
-yy296:
- YYDEBUG(296, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(297, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy296;
- }
- YYDEBUG(298, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(299, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 368 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 4475 "Zend/zend_ini_scanner.c"
-yy300:
- YYDEBUG(300, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(301, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 401 "Zend/zend_ini_scanner.l"
- { /* Variable start */
- yy_push_state(ST_VARNAME TSRMLS_CC);
- return TC_DOLLAR_CURLY;
-}
-#line 4486 "Zend/zend_ini_scanner.c"
-yy302:
- YYDEBUG(302, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy303:
- YYDEBUG(303, *YYCURSOR);
- if (yych == '\t') goto yy302;
- if (yych == ' ') goto yy302;
- goto yy236;
-yy304:
- YYDEBUG(304, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy233;
-yy305:
- YYDEBUG(305, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
-yy306:
- YYDEBUG(306, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy231;
- if (yych <= '\t') goto yy305;
- goto yy304;
- } else {
- if (yych == '\r') goto yy308;
- goto yy231;
- }
- } else {
- if (yych <= '"') {
- if (yych <= ' ') goto yy305;
- if (yych <= '!') goto yy231;
- } else {
- if (yych == ';') goto yy283;
- goto yy231;
- }
- }
- YYDEBUG(307, *YYCURSOR);
- yych = *++YYCURSOR;
- goto yy238;
-yy308:
- YYDEBUG(308, *YYCURSOR);
- ++YYCURSOR;
- if ((yych = *YYCURSOR) == '\n') goto yy304;
- goto yy233;
- }
-/* *********************************** */
-yyc_ST_VARNAME:
- {
- static const unsigned char yybm[] = {
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 0, 0, 128, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 0, 0, 128, 0, 128, 0, 128,
- 0, 0, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 128, 128, 0, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- };
- YYDEBUG(309, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= ')') {
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy311;
- if (yych <= '\n') goto yy313;
- } else {
- if (yych <= '\r') goto yy313;
- if (yych >= '!') goto yy313;
- }
- } else {
- if (yych <= '%') {
- if (yych == '$') goto yy313;
- } else {
- if (yych != '\'') goto yy313;
- }
- }
- } else {
- if (yych <= '[') {
- if (yych <= '<') {
- if (yych == ';') goto yy313;
- } else {
- if (yych <= '=') goto yy313;
- if (yych >= '[') goto yy313;
- }
- } else {
- if (yych <= 'z') {
- if (yych == '^') goto yy313;
- } else {
- if (yych == '}') goto yy315;
- if (yych <= '~') goto yy313;
- }
- }
- }
-yy311:
- YYDEBUG(311, *YYCURSOR);
- ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy318;
-yy312:
- YYDEBUG(312, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 406 "Zend/zend_ini_scanner.l"
- { /* Variable name */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace */
- EAT_TRAILING_WHITESPACE();
-
- RETURN_TOKEN(TC_VARNAME, yytext, yyleng);
-}
-#line 4627 "Zend/zend_ini_scanner.c"
-yy313:
- YYDEBUG(313, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(314, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 603 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 4637 "Zend/zend_ini_scanner.c"
-yy315:
- YYDEBUG(315, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(316, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 416 "Zend/zend_ini_scanner.l"
- { /* Variable end */
- yy_pop_state(TSRMLS_C);
- return '}';
-}
-#line 4648 "Zend/zend_ini_scanner.c"
-yy317:
- YYDEBUG(317, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy318:
- YYDEBUG(318, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy317;
- }
- goto yy312;
- }
-}
-#line 607 "Zend/zend_ini_scanner.l"
-
-}
+/* Generated by re2c 0.13.5 */ +#line 1 "Zend/zend_ini_scanner.l" +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Zeev Suraski <zeev@zend.com> | + | Jani Taskinen <jani@php.net> | + | Marcus Boerger <helly@php.net> | + | Nuno Lopes <nlopess@php.net> | + | Scott MacVicar <scottmac@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include <errno.h> +#include "zend.h" +#include "zend_globals.h" +#include <zend_ini_parser.h> +#include "zend_ini_scanner.h" + +#if 0 +# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) +#else +# define YYDEBUG(s, c) +#endif + +#include "zend_ini_scanner_defs.h" + +#define YYCTYPE unsigned char +/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD) + * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */ +#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; } +#define YYCURSOR SCNG(yy_cursor) +#define YYLIMIT SCNG(yy_limit) +#define YYMARKER SCNG(yy_marker) + +#define YYGETCONDITION() SCNG(yy_state) +#define YYSETCONDITION(s) SCNG(yy_state) = s + +#define STATE(name) yyc##name + +/* emulate flex constructs */ +#define BEGIN(state) YYSETCONDITION(STATE(state)) +#define YYSTATE YYGETCONDITION() +#define yytext ((char*)SCNG(yy_text)) +#define yyleng SCNG(yy_leng) +#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \ + yyleng = (unsigned int)x; } while(0) + +/* #define yymore() goto yymore_restart */ + +/* perform sanity check. If this message is triggered you should + increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ +#define YYMAXFILL 6 +#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1) +# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL +#endif + + +/* How it works (for the core ini directives): + * =========================================== + * + * 1. Scanner scans file for tokens and passes them to parser. + * 2. Parser parses the tokens and passes the name/value pairs to the callback + * function which stores them in the configuration hash table. + * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual + * registering of ini entries and uses zend_get_configuration_directive() + * to fetch the previously stored name/value pair from configuration hash table + * and registers the static ini entries which match the name to the value + * into EG(ini_directives) hash table. + * 4. PATH section entries are used per-request from down to top, each overriding + * previous if one exists. zend_alter_ini_entry() is called for each entry. + * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the + * php_admin_* directives used within Apache httpd.conf when PHP is compiled as + * module for Apache. + * 5. User defined ini files (like .htaccess for apache) are parsed for each request and + * stored in separate hash defined by SAPI. + */ + +/* TODO: (ordered by importance :-) + * =============================================================================== + * + * - Separate constant lookup totally from plain strings (using CONSTANT pattern) + * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators + * - Add #include "some.ini" + * - Allow variables to refer to options also when using parse_ini_file() + * + */ + +/* Globals Macros */ +#define SCNG INI_SCNG +#ifdef ZTS +ZEND_API ts_rsrc_id ini_scanner_globals_id; +#else +ZEND_API zend_ini_scanner_globals ini_scanner_globals; +#endif + +/* Eat leading whitespace */ +#define EAT_LEADING_WHITESPACE() \ + while (yytext[0]) { \ + if (yytext[0] == ' ' || yytext[0] == '\t') { \ + SCNG(yy_text)++; \ + yyleng--; \ + } else { \ + break; \ + } \ + } + +/* Eat trailing whitespace + extra char */ +#define EAT_TRAILING_WHITESPACE_EX(ch) \ + while (yyleng > 0 && ( \ + (ch != 'X' && yytext[yyleng - 1] == ch) || \ + yytext[yyleng - 1] == '\n' || \ + yytext[yyleng - 1] == '\r' || \ + yytext[yyleng - 1] == '\t' || \ + yytext[yyleng - 1] == ' ') \ + ) { \ + yyleng--; \ + } + +/* Eat trailing whitespace */ +#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X') + +#define zend_ini_copy_value(retval, str, len) { \ + Z_STRVAL_P(retval) = zend_strndup(str, len); \ + Z_STRLEN_P(retval) = len; \ + Z_TYPE_P(retval) = IS_STRING; \ +} + +#define RETURN_TOKEN(type, str, len) { \ + zend_ini_copy_value(ini_lval, str, len); \ + return type; \ +} + +static void _yy_push_state(int new_state TSRMLS_DC) +{ + zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); + YYSETCONDITION(new_state); +} + +#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) + +static void yy_pop_state(TSRMLS_D) +{ + int *stack_state; + zend_stack_top(&SCNG(state_stack), (void **) &stack_state); + YYSETCONDITION(*stack_state); + zend_stack_del_top(&SCNG(state_stack)); +} + +static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) +{ + YYCURSOR = (YYCTYPE*)str; + SCNG(yy_start) = YYCURSOR; + YYLIMIT = YYCURSOR + len; +} + +#define ini_filename SCNG(filename) + +/* {{{ init_ini_scanner() +*/ +static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC) +{ + /* Sanity check */ + if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) { + zend_error(E_WARNING, "Invalid scanner mode"); + return FAILURE; + } + + SCNG(lineno) = 1; + SCNG(scanner_mode) = scanner_mode; + SCNG(yy_in) = fh; + + if (fh != NULL) { + ini_filename = zend_strndup(fh->filename, strlen(fh->filename)); + } else { + ini_filename = NULL; + } + + zend_stack_init(&SCNG(state_stack)); + BEGIN(INITIAL); + + return SUCCESS; +} +/* }}} */ + +/* {{{ shutdown_ini_scanner() +*/ +void shutdown_ini_scanner(TSRMLS_D) +{ + zend_stack_destroy(&SCNG(state_stack)); + if (ini_filename) { + free(ini_filename); + } +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_lineno() +*/ +int zend_ini_scanner_get_lineno(TSRMLS_D) +{ + return SCNG(lineno); +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_filename() +*/ +char *zend_ini_scanner_get_filename(TSRMLS_D) +{ + return ini_filename ? ini_filename : "Unknown"; +} +/* }}} */ + +/* {{{ zend_ini_open_file_for_scanning() +*/ +int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC) +{ + char *buf; + size_t size; + + if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) { + zend_file_handle_dtor(fh TSRMLS_CC); + return FAILURE; + } + + yy_scan_buffer(buf, size TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_prepare_string_for_scanning() +*/ +int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC) +{ + int len = strlen(str); + + if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + yy_scan_buffer(str, len TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_escape_string() + */ +static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC) +{ + register char *s, *t; + char *end; + + zend_ini_copy_value(lval, str, len); + + /* convert escape sequences */ + s = t = Z_STRVAL_P(lval); + end = s + Z_STRLEN_P(lval); + + while (s < end) { + if (*s == '\\') { + s++; + if (s >= end) { + *t++ = '\\'; + continue; + } + switch (*s) { + case '"': + if (*s != quote_type) { + *t++ = '\\'; + *t++ = *s; + break; + } + case '\\': + case '$': + *t++ = *s; + Z_STRLEN_P(lval)--; + break; + default: + *t++ = '\\'; + *t++ = *s; + break; + } + } else { + *t++ = *s; + } + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + SCNG(lineno)++; + } + s++; + } + *t = 0; +} +/* }}} */ + +int ini_lex(zval *ini_lval TSRMLS_DC) +{ +restart: + SCNG(yy_text) = YYCURSOR; + +/* yymore_restart: */ + /* detect EOF */ + if (YYCURSOR >= YYLIMIT) { + if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) { + BEGIN(INITIAL); + return END_OF_LINE; + } + return 0; + } + + /* Eat any UTF-8 BOM we find in the first 3 bytes */ + if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) { + if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) { + YYCURSOR += 3; + goto restart; + } + } + +#line 337 "Zend/zend_ini_scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if (YYGETCONDITION() < 4) { + if (YYGETCONDITION() < 2) { + if (YYGETCONDITION() < 1) { + goto yyc_INITIAL; + } else { + goto yyc_ST_OFFSET; + } + } else { + if (YYGETCONDITION() < 3) { + goto yyc_ST_SECTION_VALUE; + } else { + goto yyc_ST_VALUE; + } + } + } else { + if (YYGETCONDITION() < 6) { + if (YYGETCONDITION() < 5) { + goto yyc_ST_SECTION_RAW; + } else { + goto yyc_ST_DOUBLE_QUOTES; + } + } else { + if (YYGETCONDITION() < 7) { + goto yyc_ST_VARNAME; + } else { + goto yyc_ST_RAW; + } + } + } +/* *********************************** */ +yyc_INITIAL: + { + static const unsigned char yybm[] = { + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 160, 0, 144, 144, 0, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 240, 128, 128, 144, 128, 144, 128, 144, + 128, 128, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 144, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 128, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + }; + + YYDEBUG(0, *YYCURSOR); + YYFILL(5); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case '\t': goto yy4; + case '\n': goto yy6; + case '\r': goto yy8; + case ' ': goto yy9; + case '!': + case '"': + case '$': + case '&': + case '(': + case ')': + case '^': + case '{': + case '|': + case '}': + case '~': goto yy10; + case '#': goto yy12; + case '%': + case '\'': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case '<': + case '>': + case '?': + case '@': + case ']': goto yy13; + case ';': goto yy14; + case '=': goto yy16; + case 'F': + case 'f': goto yy18; + case 'N': + case 'n': goto yy19; + case 'O': + case 'o': goto yy20; + case 'T': + case 't': goto yy21; + case 'Y': + case 'y': goto yy22; + case '[': goto yy23; + default: goto yy2; + } +yy2: + YYDEBUG(2, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy26; +yy3: + YYDEBUG(3, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 429 "Zend/zend_ini_scanner.l" + { /* Get option name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_LABEL, yytext, yyleng); +} +#line 476 "Zend/zend_ini_scanner.c" +yy4: + YYDEBUG(4, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy68; +yy5: + YYDEBUG(5, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 490 "Zend/zend_ini_scanner.c" +yy6: + YYDEBUG(6, *YYCURSOR); + ++YYCURSOR; +yy7: + YYDEBUG(7, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 580 "Zend/zend_ini_scanner.l" + { + SCNG(lineno)++; + return END_OF_LINE; +} +#line 502 "Zend/zend_ini_scanner.c" +yy8: + YYDEBUG(8, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy71; + goto yy7; +yy9: + YYDEBUG(9, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy26; + goto yy69; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy58; + goto yy26; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy26; + } + } +yy10: + YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 503 "Zend/zend_ini_scanner.l" + { /* Disallow these chars outside option values */ + return yytext[0]; +} +#line 541 "Zend/zend_ini_scanner.c" +yy12: + YYDEBUG(12, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy59; +yy13: + YYDEBUG(13, *YYCURSOR); + yych = *++YYCURSOR; + goto yy26; +yy14: + YYDEBUG(14, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy54; + YYDEBUG(15, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 562 "Zend/zend_ini_scanner.c" +yy16: + YYDEBUG(16, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy52; +yy17: + YYDEBUG(17, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 439 "Zend/zend_ini_scanner.l" + { /* Start option value */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_RAW TSRMLS_CC); + } else { + yy_push_state(ST_VALUE TSRMLS_CC); + } + return '='; +} +#line 580 "Zend/zend_ini_scanner.c" +yy18: + YYDEBUG(18, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy48; + if (yych == 'a') goto yy48; + goto yy26; +yy19: + YYDEBUG(19, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych == 'O') goto yy44; + if (yych <= 'T') goto yy26; + goto yy45; + } else { + if (yych <= 'o') { + if (yych <= 'n') goto yy26; + goto yy44; + } else { + if (yych == 'u') goto yy45; + goto yy26; + } + } +yy20: + YYDEBUG(20, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'N') { + if (yych == 'F') goto yy38; + if (yych <= 'M') goto yy26; + goto yy31; + } else { + if (yych <= 'f') { + if (yych <= 'e') goto yy26; + goto yy38; + } else { + if (yych == 'n') goto yy31; + goto yy26; + } + } +yy21: + YYDEBUG(21, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy36; + if (yych == 'r') goto yy36; + goto yy26; +yy22: + YYDEBUG(22, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy27; + if (yych == 'e') goto yy27; + goto yy26; +yy23: + YYDEBUG(23, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(24, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 358 "Zend/zend_ini_scanner.l" + { /* Section start */ + /* Enter section data lookup state */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_SECTION_RAW TSRMLS_CC); + } else { + yy_push_state(ST_SECTION_VALUE TSRMLS_CC); + } + return TC_SECTION; +} +#line 646 "Zend/zend_ini_scanner.c" +yy25: + YYDEBUG(25, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy26: + YYDEBUG(26, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy25; + } + if (yych == '[') goto yy28; + goto yy3; +yy27: + YYDEBUG(27, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy31; + if (yych == 's') goto yy31; + goto yy26; +yy28: + YYDEBUG(28, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(29, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy28; + } + YYDEBUG(30, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 383 "Zend/zend_ini_scanner.l" + { /* Start of option with offset */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace and [ */ + EAT_TRAILING_WHITESPACE_EX('['); + + /* Enter offset lookup state */ + yy_push_state(ST_OFFSET TSRMLS_CC); + + RETURN_TOKEN(TC_OFFSET, yytext, yyleng); +} +#line 689 "Zend/zend_ini_scanner.c" +yy31: + YYDEBUG(31, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(32, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy31; + } + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy34; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy25; + } else { + if (yych != '&') goto yy25; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy33; + if (yych <= ':') goto yy25; + } else { + if (yych != '=') goto yy25; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy28; + if (yych <= ']') goto yy25; + } else { + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy33: + YYDEBUG(33, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 739 "Zend/zend_ini_scanner.c" +yy34: + YYDEBUG(34, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(35, *YYCURSOR); + if (yych == '\t') goto yy34; + if (yych == ' ') goto yy34; + goto yy33; +yy36: + YYDEBUG(36, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'U') goto yy37; + if (yych != 'u') goto yy26; +yy37: + YYDEBUG(37, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy31; + if (yych == 'e') goto yy31; + goto yy26; +yy38: + YYDEBUG(38, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'F') goto yy39; + if (yych != 'f') goto yy26; +yy39: + YYDEBUG(39, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(40, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy42; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych >= '#') goto yy25; + } else { + if (yych == '%') goto yy25; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych >= '*') goto yy25; + } else { + if (yych == '<') goto yy25; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy41; + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy41: + YYDEBUG(41, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 813 "Zend/zend_ini_scanner.c" +yy42: + YYDEBUG(42, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(43, *YYCURSOR); + if (yych == '\t') goto yy42; + if (yych == ' ') goto yy42; + goto yy41; +yy44: + YYDEBUG(44, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\'') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy42; + goto yy41; + } else { + if (yych == '\r') goto yy41; + goto yy26; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych <= '"') goto yy41; + goto yy26; + } else { + if (yych == '%') goto yy26; + if (yych <= '&') goto yy41; + goto yy26; + } + } + } else { + if (yych <= 'N') { + if (yych <= ';') { + if (yych <= ')') goto yy41; + if (yych <= ':') goto yy26; + goto yy41; + } else { + if (yych == '=') goto yy41; + if (yych <= 'M') goto yy26; + goto yy47; + } + } else { + if (yych <= 'm') { + if (yych == '^') goto yy41; + goto yy26; + } else { + if (yych <= 'n') goto yy47; + if (yych <= 'z') goto yy26; + if (yych <= '~') goto yy41; + goto yy26; + } + } + } +yy45: + YYDEBUG(45, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy46; + if (yych != 'l') goto yy26; +yy46: + YYDEBUG(46, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy39; + if (yych == 'l') goto yy39; + goto yy26; +yy47: + YYDEBUG(47, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy48: + YYDEBUG(48, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy49; + if (yych != 'l') goto yy26; +yy49: + YYDEBUG(49, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy50; + if (yych != 's') goto yy26; +yy50: + YYDEBUG(50, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy51: + YYDEBUG(51, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy52: + YYDEBUG(52, *YYCURSOR); + if (yych == '\t') goto yy51; + if (yych == ' ') goto yy51; + goto yy17; +yy53: + YYDEBUG(53, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy54: + YYDEBUG(54, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy53; + } + if (yych >= '\r') goto yy57; +yy55: + YYDEBUG(55, *YYCURSOR); + ++YYCURSOR; +yy56: + YYDEBUG(56, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 936 "Zend/zend_ini_scanner.c" +yy57: + YYDEBUG(57, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy55; + goto yy56; +yy58: + YYDEBUG(58, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy59: + YYDEBUG(59, *YYCURSOR); + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy58; + if (yych >= '\n') goto yy64; + } else { + if (yych == '\r') goto yy66; + goto yy58; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy58; + } else { + if (yych != '&') goto yy58; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy60; + if (yych <= ':') goto yy58; + } else { + if (yych != '=') goto yy58; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy62; + if (yych <= ']') goto yy58; + } else { + if (yych <= 'z') goto yy58; + if (yych >= 0x7F) goto yy58; + } + } + } +yy60: + YYDEBUG(60, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(61, *YYCURSOR); + if (yych == '\n') goto yy64; + if (yych == '\r') goto yy66; + goto yy60; +yy62: + YYDEBUG(62, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(63, *YYCURSOR); + if (yych <= '\f') { + if (yych <= 0x08) goto yy60; + if (yych <= '\t') goto yy62; + if (yych >= '\v') goto yy60; + } else { + if (yych <= '\r') goto yy66; + if (yych == ' ') goto yy62; + goto yy60; + } +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; +yy65: + YYDEBUG(65, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 591 "Zend/zend_ini_scanner.l" + { /* #Comment */ + zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1022 "Zend/zend_ini_scanner.c" +yy66: + YYDEBUG(66, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy64; + goto yy65; +yy67: + YYDEBUG(67, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy68: + YYDEBUG(68, *YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy5; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy5; + goto yy67; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy60; + goto yy5; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy5; + } + } +yy69: + YYDEBUG(69, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(70, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy67; + } else { + if (yych == '\r') goto yy72; + goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy69; + if (yych <= '"') goto yy3; + goto yy58; + } else { + if (yych == '%') goto yy25; + goto yy3; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych <= ')') goto yy3; + goto yy25; + } else { + if (yych <= ';') goto yy53; + if (yych <= '<') goto yy25; + goto yy51; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy3; + if (yych <= 'z') goto yy25; + if (yych <= '~') goto yy3; + goto yy25; + } + } + } +yy71: + YYDEBUG(71, *YYCURSOR); + yych = *++YYCURSOR; + goto yy7; +yy72: + YYDEBUG(72, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy71; + goto yy7; + } +/* *********************************** */ +yyc_ST_DOUBLE_QUOTES: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + YYDEBUG(73, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych == '"') goto yy77; + if (yych == '$') goto yy79; + YYDEBUG(75, *YYCURSOR); + ++YYCURSOR; +yy76: + YYDEBUG(76, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 535 "Zend/zend_ini_scanner.l" + { /* Escape double quoted string contents */ + if (YYCURSOR > YYLIMIT) { + return 0; + } + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '"': + if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') { + continue; + } + break; + case '$': + if (*YYCURSOR == '{') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') { + YYCURSOR++; + } + /* fall through */ + default: + continue; + } + + YYCURSOR--; + break; + } + + yyleng = YYCURSOR - SCNG(yy_text); + + zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); + return TC_QUOTED_STRING; +} +#line 1198 "Zend/zend_ini_scanner.c" +yy77: + YYDEBUG(77, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy83; +yy78: + YYDEBUG(78, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 530 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string ends */ + yy_pop_state(TSRMLS_C); + return '"'; +} +#line 1212 "Zend/zend_ini_scanner.c" +yy79: + YYDEBUG(79, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '{') goto yy76; + YYDEBUG(80, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(81, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1226 "Zend/zend_ini_scanner.c" +yy82: + YYDEBUG(82, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy83: + YYDEBUG(83, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy82; + } + goto yy78; + } +/* *********************************** */ +yyc_ST_OFFSET: + { + static const unsigned char yybm[] = { + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 194, 64, 66, 66, 64, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 194, 66, 64, 66, 68, 66, 66, 0, + 66, 66, 66, 66, 66, 66, 66, 66, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 66, 64, 66, 66, 66, 66, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 72, 64, 66, 82, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + }; + YYDEBUG(84, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy86; + if (yych <= '\t') goto yy88; + goto yy89; + } else { + if (yych == '\r') goto yy89; + if (yych >= ' ') goto yy88; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy91; + if (yych >= '$') goto yy93; + } else { + if (yych == '\'') goto yy94; + if (yych >= '-') goto yy95; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy96; + if (yych >= '0') goto yy97; + } else { + if (yych == ';') goto yy89; + if (yych >= 'A') goto yy99; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy86; + if (yych <= '\\') goto yy101; + if (yych <= ']') goto yy102; + } else { + if (yych == '`') goto yy86; + if (yych <= 'z') goto yy99; + } + } + } +yy86: + YYDEBUG(86, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy105; +yy87: + YYDEBUG(87, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 1330 "Zend/zend_ini_scanner.c" +yy88: + YYDEBUG(88, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych == '"') goto yy133; + if (yych == ']') goto yy134; + goto yy105; +yy89: + YYDEBUG(89, *YYCURSOR); + ++YYCURSOR; +yy90: + YYDEBUG(90, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 1351 "Zend/zend_ini_scanner.c" +yy91: + YYDEBUG(91, *YYCURSOR); + ++YYCURSOR; +yy92: + YYDEBUG(92, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 1363 "Zend/zend_ini_scanner.c" +yy93: + YYDEBUG(93, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy90; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych == '{') goto yy129; + goto yy104; + } +yy94: + YYDEBUG(94, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + goto yy90; +yy95: + YYDEBUG(95, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy123; + goto yy105; +yy96: + YYDEBUG(96, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy121; + goto yy105; +yy97: + YYDEBUG(97, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy105; + } else { + if (yych == '"') goto yy98; + if (yych <= '&') goto yy105; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy117; + if (yych <= '/') goto yy105; + goto yy119; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy105; + } else { + if (yych != ']') goto yy105; + } + } + } +yy98: + YYDEBUG(98, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 1429 "Zend/zend_ini_scanner.c" +yy99: + YYDEBUG(99, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy105; + } else { + if (yych <= '\r') goto yy100; + if (yych <= '!') goto yy105; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy105; + } else { + if (yych <= ';') goto yy100; + if (yych != ']') goto yy105; + } + } +yy100: + YYDEBUG(100, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 1459 "Zend/zend_ini_scanner.c" +yy101: + YYDEBUG(101, *YYCURSOR); + yych = *++YYCURSOR; + goto yy104; +yy102: + YYDEBUG(102, *YYCURSOR); + ++YYCURSOR; +yy103: + YYDEBUG(103, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 396 "Zend/zend_ini_scanner.l" + { /* End of section or an option offset */ + BEGIN(INITIAL); + return ']'; +} +#line 1475 "Zend/zend_ini_scanner.c" +yy104: + YYDEBUG(104, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy105: + YYDEBUG(105, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy104; + } + if (yych == '$') goto yy107; + if (yych != '\\') goto yy87; +yy106: + YYDEBUG(106, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy104; +yy107: + YYDEBUG(107, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy108; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych != '{') goto yy104; + } +yy108: + YYDEBUG(108, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy87; + } else { + goto yy90; + } + } else { + if (yyaccept <= 2) { + goto yy98; + } else { + goto yy100; + } + } +yy109: + YYDEBUG(109, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy110: + YYDEBUG(110, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(111, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy114; + goto yy104; +yy112: + YYDEBUG(112, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(113, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy114: + YYDEBUG(114, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy115: + YYDEBUG(115, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(116, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy100; + if (yych <= '\f') goto yy104; + goto yy100; + } else { + if (yych == '"') goto yy100; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy100; + if (yych <= ':') goto yy104; + goto yy100; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy100; + goto yy104; + } + } +yy117: + YYDEBUG(117, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(118, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy117; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych == '"') goto yy98; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy98; + if (yych <= ':') goto yy104; + goto yy98; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } +yy119: + YYDEBUG(119, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(120, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy104; + goto yy98; + } else { + if (yych == '\r') goto yy98; + goto yy104; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy98; + goto yy104; + } else { + if (yych <= '$') goto yy107; + if (yych <= '&') goto yy104; + goto yy98; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy104; + goto yy117; + } else { + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy119; + goto yy104; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy121: + YYDEBUG(121, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(122, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy121; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy123: + YYDEBUG(123, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(124, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy123; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy125: + YYDEBUG(125, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(126, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + YYDEBUG(127, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(128, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1774 "Zend/zend_ini_scanner.c" +yy129: + YYDEBUG(129, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(130, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1785 "Zend/zend_ini_scanner.c" +yy131: + YYDEBUG(131, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(132, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy87; + if (yych <= '\f') goto yy104; + goto yy87; + } else { + if (yych == '"') goto yy133; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy87; + if (yych <= ':') goto yy104; + goto yy87; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy134; + goto yy104; + } + } +yy133: + YYDEBUG(133, *YYCURSOR); + yych = *++YYCURSOR; + goto yy92; +yy134: + YYDEBUG(134, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy103; + } +/* *********************************** */ +yyc_ST_RAW: + { + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; + YYDEBUG(135, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy139; + } else { + if (yych <= '\t') goto yy141; + if (yych <= '\n') goto yy142; + goto yy139; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy144; + if (yych <= 0x1F) goto yy139; + goto yy141; + } else { + if (yych == ';') goto yy145; + goto yy139; + } + } + YYDEBUG(137, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(138, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 1895 "Zend/zend_ini_scanner.c" +yy139: + YYDEBUG(139, *YYCURSOR); + ++YYCURSOR; +yy140: + YYDEBUG(140, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 448 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + char *sc = NULL; + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR) { + case '\n': + case '\r': + goto end_raw_value_chars; + break; + case ';': + if (sc == NULL) { + sc = YYCURSOR; + } + /* no break */ + default: + YYCURSOR++; + break; + } + } +end_raw_value_chars: + yyleng = YYCURSOR - SCNG(yy_text); + + /* Eat trailing semicolons */ + while (yytext[yyleng - 1] == ';') { + yyleng--; + } + + /* Eat leading and trailing double quotes */ + if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } else if (sc) { + YYCURSOR = sc; + yyleng = YYCURSOR - SCNG(yy_text); + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1939 "Zend/zend_ini_scanner.c" +yy141: + YYDEBUG(141, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych <= 0x08) goto yy140; + if (yych <= '\n') goto yy153; + if (yych <= '\f') goto yy140; + goto yy153; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy140; + goto yy153; + } else { + if (yych == ';') goto yy153; + goto yy140; + } + } +yy142: + YYDEBUG(142, *YYCURSOR); + ++YYCURSOR; +yy143: + YYDEBUG(143, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1970 "Zend/zend_ini_scanner.c" +yy144: + YYDEBUG(144, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy151; + goto yy143; +yy145: + YYDEBUG(145, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy147; +yy146: + YYDEBUG(146, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy147: + YYDEBUG(147, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy146; + } + if (yych >= '\r') goto yy150; +yy148: + YYDEBUG(148, *YYCURSOR); + ++YYCURSOR; +yy149: + YYDEBUG(149, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2004 "Zend/zend_ini_scanner.c" +yy150: + YYDEBUG(150, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy148; + goto yy149; +yy151: + YYDEBUG(151, *YYCURSOR); + yych = *++YYCURSOR; + goto yy143; +yy152: + YYDEBUG(152, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy153: + YYDEBUG(153, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy152; + } + if (yych <= '\f') { + if (yych == '\n') goto yy151; + } else { + if (yych <= '\r') goto yy155; + if (yych == ';') goto yy146; + } + YYDEBUG(154, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 2038 "Zend/zend_ini_scanner.c" +yy155: + YYDEBUG(155, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy151; + goto yy143; + } +/* *********************************** */ +yyc_ST_SECTION_RAW: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 192, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(156, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych == '\n') goto yy160; + } else { + if (yych <= '\r') goto yy160; + if (yych == ']') goto yy162; + } + YYDEBUG(158, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy169; +yy159: + YYDEBUG(159, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 485 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2102 "Zend/zend_ini_scanner.c" +yy160: + YYDEBUG(160, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(161, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2112 "Zend/zend_ini_scanner.c" +yy162: + YYDEBUG(162, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy165; +yy163: + YYDEBUG(163, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2127 "Zend/zend_ini_scanner.c" +yy164: + YYDEBUG(164, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy165: + YYDEBUG(165, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy164; + } + if (yych == '\n') goto yy166; + if (yych == '\r') goto yy167; + goto yy163; +yy166: + YYDEBUG(166, *YYCURSOR); + yych = *++YYCURSOR; + goto yy163; +yy167: + YYDEBUG(167, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy166; + goto yy163; +yy168: + YYDEBUG(168, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy169: + YYDEBUG(169, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy168; + } + goto yy159; + } +/* *********************************** */ +yyc_ST_SECTION_VALUE: + { + static const unsigned char yybm[] = { + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 134, 128, 132, 132, 128, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 134, 132, 128, 132, 136, 132, 132, 0, + 132, 132, 132, 132, 132, 132, 132, 132, + 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 132, 128, 132, 132, 132, 132, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 144, 128, 132, 164, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + }; + YYDEBUG(170, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy172; + if (yych <= '\t') goto yy174; + goto yy175; + } else { + if (yych == '\r') goto yy175; + if (yych >= ' ') goto yy174; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy177; + if (yych >= '$') goto yy179; + } else { + if (yych == '\'') goto yy180; + if (yych >= '-') goto yy181; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy182; + if (yych >= '0') goto yy183; + } else { + if (yych == ';') goto yy175; + if (yych >= 'A') goto yy185; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy172; + if (yych <= '\\') goto yy187; + if (yych <= ']') goto yy188; + } else { + if (yych == '`') goto yy172; + if (yych <= 'z') goto yy185; + } + } + } +yy172: + YYDEBUG(172, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy195; +yy173: + YYDEBUG(173, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2253 "Zend/zend_ini_scanner.c" +yy174: + YYDEBUG(174, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy221; + goto yy195; + } else { + if (yych <= ' ') goto yy221; + if (yych == '"') goto yy223; + goto yy195; + } +yy175: + YYDEBUG(175, *YYCURSOR); + ++YYCURSOR; +yy176: + YYDEBUG(176, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2276 "Zend/zend_ini_scanner.c" +yy177: + YYDEBUG(177, *YYCURSOR); + ++YYCURSOR; +yy178: + YYDEBUG(178, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2288 "Zend/zend_ini_scanner.c" +yy179: + YYDEBUG(179, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy176; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych == '{') goto yy219; + goto yy194; + } +yy180: + YYDEBUG(180, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + goto yy176; +yy181: + YYDEBUG(181, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy213; + goto yy195; +yy182: + YYDEBUG(182, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy211; + goto yy195; +yy183: + YYDEBUG(183, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy195; + } else { + if (yych == '"') goto yy184; + if (yych <= '&') goto yy195; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy207; + if (yych <= '/') goto yy195; + goto yy209; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy195; + } else { + if (yych != ']') goto yy195; + } + } + } +yy184: + YYDEBUG(184, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 2354 "Zend/zend_ini_scanner.c" +yy185: + YYDEBUG(185, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy195; + } else { + if (yych <= '\r') goto yy186; + if (yych <= '!') goto yy195; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy195; + } else { + if (yych <= ';') goto yy186; + if (yych != ']') goto yy195; + } + } +yy186: + YYDEBUG(186, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 2384 "Zend/zend_ini_scanner.c" +yy187: + YYDEBUG(187, *YYCURSOR); + yych = *++YYCURSOR; + goto yy194; +yy188: + YYDEBUG(188, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy191; +yy189: + YYDEBUG(189, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2403 "Zend/zend_ini_scanner.c" +yy190: + YYDEBUG(190, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy191: + YYDEBUG(191, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy190; + } + if (yych == '\n') goto yy192; + if (yych == '\r') goto yy193; + goto yy189; +yy192: + YYDEBUG(192, *YYCURSOR); + yych = *++YYCURSOR; + goto yy189; +yy193: + YYDEBUG(193, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy192; + goto yy189; +yy194: + YYDEBUG(194, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy195: + YYDEBUG(195, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy194; + } + if (yych == '$') goto yy197; + if (yych != '\\') goto yy173; +yy196: + YYDEBUG(196, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy194; +yy197: + YYDEBUG(197, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy198; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych != '{') goto yy194; + } +yy198: + YYDEBUG(198, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy173; + } else { + goto yy176; + } + } else { + if (yyaccept <= 2) { + goto yy184; + } else { + goto yy186; + } + } +yy199: + YYDEBUG(199, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy200: + YYDEBUG(200, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(201, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy204; + goto yy194; +yy202: + YYDEBUG(202, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(203, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy204: + YYDEBUG(204, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy205: + YYDEBUG(205, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(206, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy186; + if (yych <= '\f') goto yy194; + goto yy186; + } else { + if (yych == '"') goto yy186; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy186; + if (yych <= ':') goto yy194; + goto yy186; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy186; + goto yy194; + } + } +yy207: + YYDEBUG(207, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(208, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy207; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych == '"') goto yy184; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy184; + if (yych <= ':') goto yy194; + goto yy184; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } +yy209: + YYDEBUG(209, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(210, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy194; + goto yy184; + } else { + if (yych == '\r') goto yy184; + goto yy194; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy184; + goto yy194; + } else { + if (yych <= '$') goto yy197; + if (yych <= '&') goto yy194; + goto yy184; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy194; + goto yy207; + } else { + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy209; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy211: + YYDEBUG(211, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(212, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy211; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy213: + YYDEBUG(213, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(214, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy213; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy215: + YYDEBUG(215, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(216, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + YYDEBUG(217, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(218, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2724 "Zend/zend_ini_scanner.c" +yy219: + YYDEBUG(219, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(220, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 2735 "Zend/zend_ini_scanner.c" +yy221: + YYDEBUG(221, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(222, *YYCURSOR); + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy194; + if (yych <= '\t') goto yy221; + if (yych <= '\n') goto yy173; + goto yy194; + } else { + if (yych <= 0x1F) { + if (yych <= '\r') goto yy173; + goto yy194; + } else { + if (yych <= ' ') goto yy221; + if (yych <= '!') goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '$') { + if (yych <= '#') goto yy194; + goto yy197; + } else { + if (yych == '\'') goto yy173; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy173; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy173; + goto yy194; + } + } + } +yy223: + YYDEBUG(223, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy178; + } +/* *********************************** */ +yyc_ST_VALUE: + { + static const unsigned char yybm[] = { + 160, 162, 162, 162, 162, 162, 162, 162, + 162, 176, 128, 162, 162, 128, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 176, 160, 160, 162, 168, 162, 160, 32, + 160, 160, 162, 162, 162, 162, 162, 162, + 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 162, 160, 162, 160, 162, 162, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 162, 162, 160, 166, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 160, 162, 160, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + }; + YYDEBUG(224, *YYCURSOR); + YYFILL(6); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case 0x00: goto yy226; + case '\t': + case ' ': goto yy230; + case '\n': goto yy232; + case '\r': goto yy234; + case '!': + case '&': + case '(': + case ')': + case '^': + case '|': + case '~': goto yy235; + case '"': goto yy237; + case '$': goto yy239; + case '\'': goto yy240; + case '-': goto yy241; + case '.': goto yy242; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy243; + case ';': goto yy245; + case '=': goto yy246; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'p': + case 'q': + case 'r': + case 's': + case 'u': + case 'v': + case 'w': + case 'x': + case 'z': goto yy248; + case 'F': + case 'f': goto yy250; + case 'N': + case 'n': goto yy251; + case 'O': + case 'o': goto yy252; + case 'T': + case 't': goto yy253; + case 'Y': + case 'y': goto yy254; + default: goto yy228; + } +yy226: + YYDEBUG(226, *YYCURSOR); + ++YYCURSOR; +yy227: + YYDEBUG(227, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 2921 "Zend/zend_ini_scanner.c" +yy228: + YYDEBUG(228, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy256; +yy229: + YYDEBUG(229, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 517 "Zend/zend_ini_scanner.l" + { /* Get everything else as option/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2934 "Zend/zend_ini_scanner.c" +yy230: + YYDEBUG(230, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy306; +yy231: + YYDEBUG(231, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 571 "Zend/zend_ini_scanner.l" + { + RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); +} +#line 2947 "Zend/zend_ini_scanner.c" +yy232: + YYDEBUG(232, *YYCURSOR); + ++YYCURSOR; +yy233: + YYDEBUG(233, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2960 "Zend/zend_ini_scanner.c" +yy234: + YYDEBUG(234, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy304; + goto yy233; +yy235: + YYDEBUG(235, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy303; +yy236: + YYDEBUG(236, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 507 "Zend/zend_ini_scanner.l" + { /* Boolean operators */ + return yytext[0]; +} +#line 2978 "Zend/zend_ini_scanner.c" +yy237: + YYDEBUG(237, *YYCURSOR); + ++YYCURSOR; +yy238: + YYDEBUG(238, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2990 "Zend/zend_ini_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy227; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych == '{') goto yy300; + goto yy255; + } +yy240: + YYDEBUG(240, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + goto yy227; +yy241: + YYDEBUG(241, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy294; + goto yy256; +yy242: + YYDEBUG(242, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy292; + goto yy256; +yy243: + YYDEBUG(243, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy244; + if (yych <= '%') goto yy256; + } else { + if (yych == '.') goto yy288; + goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy290; + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy244: + YYDEBUG(244, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 3069 "Zend/zend_ini_scanner.c" +yy245: + YYDEBUG(245, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy284; +yy246: + YYDEBUG(246, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(247, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 511 "Zend/zend_ini_scanner.l" + { /* Make = used in option value to trigger error */ + yyless(0); + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 3086 "Zend/zend_ini_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ':') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy256; + } + } else { + if (yych <= '"') { + if (yych <= 0x1F) goto yy256; + } else { + if (yych <= '%') goto yy256; + if (yych >= '*') goto yy256; + } + } + } else { + if (yych <= '^') { + if (yych <= '<') { + if (yych >= '<') goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= ']') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy249: + YYDEBUG(249, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 3133 "Zend/zend_ini_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '/') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy249; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'A') { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy280; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'a') goto yy280; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy251: + YYDEBUG(251, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'N') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'n') { + if (yych <= 'Z') { + if (yych <= 'O') goto yy276; + if (yych == 'U') goto yy277; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'o') goto yy276; + if (yych == 'u') goto yy277; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy252: + YYDEBUG(252, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'E') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'e') { + if (yych <= 'Z') { + if (yych <= 'F') goto yy271; + if (yych == 'N') goto yy265; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'f') goto yy271; + if (yych == 'n') goto yy265; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy253: + YYDEBUG(253, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'R') goto yy269; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'r') goto yy269; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy254: + YYDEBUG(254, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy259; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy259; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy255: + YYDEBUG(255, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy256: + YYDEBUG(256, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy255; + } + if (yych == '$') goto yy260; + goto yy229; +yy257: + YYDEBUG(257, *YYCURSOR); + yyaccept = 4; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(258, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy249; + goto yy255; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy255; + goto yy249; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy249; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy249; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy249; + } else { + if (yych == '=') goto yy249; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy249; + if (yych <= '{') goto yy255; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy255; + } + } + } +yy259: + YYDEBUG(259, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'S') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy260: + YYDEBUG(260, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy261; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych != '{') goto yy255; + } +yy261: + YYDEBUG(261, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 3) { + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy229; + } else { + goto yy231; + } + } else { + if (yyaccept <= 2) { + goto yy227; + } else { + goto yy244; + } + } + } else { + if (yyaccept <= 5) { + if (yyaccept <= 4) { + goto yy249; + } else { + goto yy266; + } + } else { + goto yy273; + } + } +yy262: + YYDEBUG(262, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy263; + } + goto yy255; +yy263: + YYDEBUG(263, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(264, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy263; + } + if (yych <= 0x00) goto yy229; + if (yych == '\\') goto yy262; + goto yy255; +yy265: + YYDEBUG(265, *YYCURSOR); + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + if (yych <= ';') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy266; + if (yych <= '\t') goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy266; + if (yych <= '%') goto yy256; + } else { + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + if (yych <= ':') goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= '@') { + if (yych != '=') goto yy256; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych >= '_') goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych >= 0x7F) goto yy256; + } + } + } +yy266: + YYDEBUG(266, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 3645 "Zend/zend_ini_scanner.c" +yy267: + YYDEBUG(267, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(268, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + goto yy266; +yy269: + YYDEBUG(269, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'U') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'u') goto yy270; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy270: + YYDEBUG(270, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy271: + YYDEBUG(271, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'F') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'f') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy272: + YYDEBUG(272, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\t') goto yy274; + if (yych >= '\v') goto yy256; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } else { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy273; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy273: + YYDEBUG(273, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 3855 "Zend/zend_ini_scanner.c" +yy274: + YYDEBUG(274, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(275, *YYCURSOR); + if (yych == '\t') goto yy274; + if (yych == ' ') goto yy274; + goto yy273; +yy276: + YYDEBUG(276, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy273; + if (yych <= 0x08) goto yy256; + if (yych <= '\t') goto yy274; + goto yy273; + } else { + if (yych == '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } + } else { + if (yych <= '/') { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy273; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy273; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'N') { + if (yych <= '=') goto yy273; + if (yych <= '@') goto yy256; + if (yych <= 'M') goto yy257; + goto yy279; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy273; + goto yy257; + } + } else { + if (yych <= 'z') { + if (yych <= '`') goto yy256; + if (yych == 'n') goto yy279; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy273; + } else { + if (yych == '~') goto yy273; + goto yy256; + } + } + } + } +yy277: + YYDEBUG(277, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy278; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy278: + YYDEBUG(278, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'L') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy279: + YYDEBUG(279, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy280: + YYDEBUG(280, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy281; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy281: + YYDEBUG(281, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'S') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy282; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy282: + YYDEBUG(282, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy283: + YYDEBUG(283, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy284: + YYDEBUG(284, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy283; + } + if (yych >= '\r') goto yy287; +yy285: + YYDEBUG(285, *YYCURSOR); + ++YYCURSOR; +yy286: + YYDEBUG(286, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 4248 "Zend/zend_ini_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy285; + goto yy286; +yy288: + YYDEBUG(288, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(289, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy288; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy244; + goto yy255; + } else { + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy244; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy244; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy290: + YYDEBUG(290, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(291, *YYCURSOR); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + if (yych <= '-') goto yy255; + goto yy288; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '/') goto yy255; + if (yych <= '9') goto yy290; + goto yy255; + } else { + if (yych == '<') goto yy255; + goto yy244; + } + } else { + if (yych <= '{') { + if (yych == '^') goto yy244; + goto yy255; + } else { + if (yych == '}') goto yy255; + if (yych <= '~') goto yy244; + goto yy255; + } + } + } +yy292: + YYDEBUG(292, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(293, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy292; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy294: + YYDEBUG(294, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(295, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy294; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy296: + YYDEBUG(296, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(297, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + YYDEBUG(298, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(299, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 4475 "Zend/zend_ini_scanner.c" +yy300: + YYDEBUG(300, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(301, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 4486 "Zend/zend_ini_scanner.c" +yy302: + YYDEBUG(302, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy303: + YYDEBUG(303, *YYCURSOR); + if (yych == '\t') goto yy302; + if (yych == ' ') goto yy302; + goto yy236; +yy304: + YYDEBUG(304, *YYCURSOR); + yych = *++YYCURSOR; + goto yy233; +yy305: + YYDEBUG(305, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy306: + YYDEBUG(306, *YYCURSOR); + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy231; + if (yych <= '\t') goto yy305; + goto yy304; + } else { + if (yych == '\r') goto yy308; + goto yy231; + } + } else { + if (yych <= '"') { + if (yych <= ' ') goto yy305; + if (yych <= '!') goto yy231; + } else { + if (yych == ';') goto yy283; + goto yy231; + } + } + YYDEBUG(307, *YYCURSOR); + yych = *++YYCURSOR; + goto yy238; +yy308: + YYDEBUG(308, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy304; + goto yy233; + } +/* *********************************** */ +yyc_ST_VARNAME: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 0, 128, 0, 128, + 0, 0, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 128, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(309, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= ')') { + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy311; + if (yych <= '\n') goto yy313; + } else { + if (yych <= '\r') goto yy313; + if (yych >= '!') goto yy313; + } + } else { + if (yych <= '%') { + if (yych == '$') goto yy313; + } else { + if (yych != '\'') goto yy313; + } + } + } else { + if (yych <= '[') { + if (yych <= '<') { + if (yych == ';') goto yy313; + } else { + if (yych <= '=') goto yy313; + if (yych >= '[') goto yy313; + } + } else { + if (yych <= 'z') { + if (yych == '^') goto yy313; + } else { + if (yych == '}') goto yy315; + if (yych <= '~') goto yy313; + } + } + } +yy311: + YYDEBUG(311, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy318; +yy312: + YYDEBUG(312, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 406 "Zend/zend_ini_scanner.l" + { /* Variable name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_VARNAME, yytext, yyleng); +} +#line 4627 "Zend/zend_ini_scanner.c" +yy313: + YYDEBUG(313, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(314, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 4637 "Zend/zend_ini_scanner.c" +yy315: + YYDEBUG(315, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(316, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 416 "Zend/zend_ini_scanner.l" + { /* Variable end */ + yy_pop_state(TSRMLS_C); + return '}'; +} +#line 4648 "Zend/zend_ini_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy318: + YYDEBUG(318, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy317; + } + goto yy312; + } +} +#line 607 "Zend/zend_ini_scanner.l" + +} diff --git a/Zend/zend_ini_scanner_defs.h b/Zend/zend_ini_scanner_defs.h index 572395497..287d7bc1f 100644 --- a/Zend/zend_ini_scanner_defs.h +++ b/Zend/zend_ini_scanner_defs.h @@ -1,13 +1,13 @@ -/* Generated by re2c 0.13.5 */
-#line 3 "Zend/zend_ini_scanner_defs.h"
-
-enum YYCONDTYPE {
- yycINITIAL,
- yycST_OFFSET,
- yycST_SECTION_VALUE,
- yycST_VALUE,
- yycST_SECTION_RAW,
- yycST_DOUBLE_QUOTES,
- yycST_VARNAME,
- yycST_RAW,
-};
+/* Generated by re2c 0.13.5 */ +#line 3 "Zend/zend_ini_scanner_defs.h" + +enum YYCONDTYPE { + yycINITIAL, + yycST_OFFSET, + yycST_SECTION_VALUE, + yycST_VALUE, + yycST_SECTION_RAW, + yycST_DOUBLE_QUOTES, + yycST_VARNAME, + yycST_RAW, +}; diff --git a/Zend/zend_language_parser.c b/Zend/zend_language_parser.c index 509bb3824..5c6066a6c 100644 --- a/Zend/zend_language_parser.c +++ b/Zend/zend_language_parser.c @@ -168,126 +168,128 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); T_LOGICAL_AND = 265, T_PRINT = 266, T_YIELD = 267, - T_SR_EQUAL = 268, - T_SL_EQUAL = 269, - T_XOR_EQUAL = 270, - T_OR_EQUAL = 271, - T_AND_EQUAL = 272, - T_MOD_EQUAL = 273, - T_CONCAT_EQUAL = 274, - T_DIV_EQUAL = 275, - T_MUL_EQUAL = 276, - T_MINUS_EQUAL = 277, - T_PLUS_EQUAL = 278, - T_BOOLEAN_OR = 279, - T_BOOLEAN_AND = 280, - T_IS_NOT_IDENTICAL = 281, - T_IS_IDENTICAL = 282, - T_IS_NOT_EQUAL = 283, - T_IS_EQUAL = 284, - T_IS_GREATER_OR_EQUAL = 285, - T_IS_SMALLER_OR_EQUAL = 286, - T_SR = 287, - T_SL = 288, - T_INSTANCEOF = 289, - T_UNSET_CAST = 290, - T_BOOL_CAST = 291, - T_OBJECT_CAST = 292, - T_ARRAY_CAST = 293, - T_STRING_CAST = 294, - T_DOUBLE_CAST = 295, - T_INT_CAST = 296, - T_DEC = 297, - T_INC = 298, - T_CLONE = 299, - T_NEW = 300, - T_EXIT = 301, - T_IF = 302, - T_ELSEIF = 303, - T_ELSE = 304, - T_ENDIF = 305, - T_LNUMBER = 306, - T_DNUMBER = 307, - T_STRING = 308, - T_STRING_VARNAME = 309, - T_VARIABLE = 310, - T_NUM_STRING = 311, - T_INLINE_HTML = 312, - T_CHARACTER = 313, - T_BAD_CHARACTER = 314, - T_ENCAPSED_AND_WHITESPACE = 315, - T_CONSTANT_ENCAPSED_STRING = 316, - T_ECHO = 317, - T_DO = 318, - T_WHILE = 319, - T_ENDWHILE = 320, - T_FOR = 321, - T_ENDFOR = 322, - T_FOREACH = 323, - T_ENDFOREACH = 324, - T_DECLARE = 325, - T_ENDDECLARE = 326, - T_AS = 327, - T_SWITCH = 328, - T_ENDSWITCH = 329, - T_CASE = 330, - T_DEFAULT = 331, - T_BREAK = 332, - T_CONTINUE = 333, - T_GOTO = 334, - T_FUNCTION = 335, - T_CONST = 336, - T_RETURN = 337, - T_TRY = 338, - T_CATCH = 339, - T_FINALLY = 340, - T_THROW = 341, - T_USE = 342, - T_INSTEADOF = 343, - T_GLOBAL = 344, - T_PUBLIC = 345, - T_PROTECTED = 346, - T_PRIVATE = 347, - T_FINAL = 348, - T_ABSTRACT = 349, - T_STATIC = 350, - T_VAR = 351, - T_UNSET = 352, - T_ISSET = 353, - T_EMPTY = 354, - T_HALT_COMPILER = 355, - T_CLASS = 356, - T_TRAIT = 357, - T_INTERFACE = 358, - T_EXTENDS = 359, - T_IMPLEMENTS = 360, - T_OBJECT_OPERATOR = 361, - T_DOUBLE_ARROW = 362, - T_LIST = 363, - T_ARRAY = 364, - T_CALLABLE = 365, - T_CLASS_C = 366, - T_TRAIT_C = 367, - T_METHOD_C = 368, - T_FUNC_C = 369, - T_LINE = 370, - T_FILE = 371, - T_COMMENT = 372, - T_DOC_COMMENT = 373, - T_OPEN_TAG = 374, - T_OPEN_TAG_WITH_ECHO = 375, - T_CLOSE_TAG = 376, - T_WHITESPACE = 377, - T_START_HEREDOC = 378, - T_END_HEREDOC = 379, - T_DOLLAR_OPEN_CURLY_BRACES = 380, - T_CURLY_OPEN = 381, - T_PAAMAYIM_NEKUDOTAYIM = 382, - T_NAMESPACE = 383, - T_NS_C = 384, - T_DIR = 385, - T_NS_SEPARATOR = 386, - T_ELLIPSIS = 387 + T_POW_EQUAL = 268, + T_SR_EQUAL = 269, + T_SL_EQUAL = 270, + T_XOR_EQUAL = 271, + T_OR_EQUAL = 272, + T_AND_EQUAL = 273, + T_MOD_EQUAL = 274, + T_CONCAT_EQUAL = 275, + T_DIV_EQUAL = 276, + T_MUL_EQUAL = 277, + T_MINUS_EQUAL = 278, + T_PLUS_EQUAL = 279, + T_BOOLEAN_OR = 280, + T_BOOLEAN_AND = 281, + T_IS_NOT_IDENTICAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_EQUAL = 284, + T_IS_EQUAL = 285, + T_IS_GREATER_OR_EQUAL = 286, + T_IS_SMALLER_OR_EQUAL = 287, + T_SR = 288, + T_SL = 289, + T_INSTANCEOF = 290, + T_UNSET_CAST = 291, + T_BOOL_CAST = 292, + T_OBJECT_CAST = 293, + T_ARRAY_CAST = 294, + T_STRING_CAST = 295, + T_DOUBLE_CAST = 296, + T_INT_CAST = 297, + T_DEC = 298, + T_INC = 299, + T_POW = 300, + T_CLONE = 301, + T_NEW = 302, + T_EXIT = 303, + T_IF = 304, + T_ELSEIF = 305, + T_ELSE = 306, + T_ENDIF = 307, + T_LNUMBER = 308, + T_DNUMBER = 309, + T_STRING = 310, + T_STRING_VARNAME = 311, + T_VARIABLE = 312, + T_NUM_STRING = 313, + T_INLINE_HTML = 314, + T_CHARACTER = 315, + T_BAD_CHARACTER = 316, + T_ENCAPSED_AND_WHITESPACE = 317, + T_CONSTANT_ENCAPSED_STRING = 318, + T_ECHO = 319, + T_DO = 320, + T_WHILE = 321, + T_ENDWHILE = 322, + T_FOR = 323, + T_ENDFOR = 324, + T_FOREACH = 325, + T_ENDFOREACH = 326, + T_DECLARE = 327, + T_ENDDECLARE = 328, + T_AS = 329, + T_SWITCH = 330, + T_ENDSWITCH = 331, + T_CASE = 332, + T_DEFAULT = 333, + T_BREAK = 334, + T_CONTINUE = 335, + T_GOTO = 336, + T_FUNCTION = 337, + T_CONST = 338, + T_RETURN = 339, + T_TRY = 340, + T_CATCH = 341, + T_FINALLY = 342, + T_THROW = 343, + T_USE = 344, + T_INSTEADOF = 345, + T_GLOBAL = 346, + T_PUBLIC = 347, + T_PROTECTED = 348, + T_PRIVATE = 349, + T_FINAL = 350, + T_ABSTRACT = 351, + T_STATIC = 352, + T_VAR = 353, + T_UNSET = 354, + T_ISSET = 355, + T_EMPTY = 356, + T_HALT_COMPILER = 357, + T_CLASS = 358, + T_TRAIT = 359, + T_INTERFACE = 360, + T_EXTENDS = 361, + T_IMPLEMENTS = 362, + T_OBJECT_OPERATOR = 363, + T_DOUBLE_ARROW = 364, + T_LIST = 365, + T_ARRAY = 366, + T_CALLABLE = 367, + T_CLASS_C = 368, + T_TRAIT_C = 369, + T_METHOD_C = 370, + T_FUNC_C = 371, + T_LINE = 372, + T_FILE = 373, + T_COMMENT = 374, + T_DOC_COMMENT = 375, + T_OPEN_TAG = 376, + T_OPEN_TAG_WITH_ECHO = 377, + T_CLOSE_TAG = 378, + T_WHITESPACE = 379, + T_START_HEREDOC = 380, + T_END_HEREDOC = 381, + T_DOLLAR_OPEN_CURLY_BRACES = 382, + T_CURLY_OPEN = 383, + T_PAAMAYIM_NEKUDOTAYIM = 384, + T_NAMESPACE = 385, + T_NS_C = 386, + T_DIR = 387, + T_NS_SEPARATOR = 388, + T_ELLIPSIS = 389 }; #endif /* Tokens. */ @@ -302,126 +304,128 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); #define T_LOGICAL_AND 265 #define T_PRINT 266 #define T_YIELD 267 -#define T_SR_EQUAL 268 -#define T_SL_EQUAL 269 -#define T_XOR_EQUAL 270 -#define T_OR_EQUAL 271 -#define T_AND_EQUAL 272 -#define T_MOD_EQUAL 273 -#define T_CONCAT_EQUAL 274 -#define T_DIV_EQUAL 275 -#define T_MUL_EQUAL 276 -#define T_MINUS_EQUAL 277 -#define T_PLUS_EQUAL 278 -#define T_BOOLEAN_OR 279 -#define T_BOOLEAN_AND 280 -#define T_IS_NOT_IDENTICAL 281 -#define T_IS_IDENTICAL 282 -#define T_IS_NOT_EQUAL 283 -#define T_IS_EQUAL 284 -#define T_IS_GREATER_OR_EQUAL 285 -#define T_IS_SMALLER_OR_EQUAL 286 -#define T_SR 287 -#define T_SL 288 -#define T_INSTANCEOF 289 -#define T_UNSET_CAST 290 -#define T_BOOL_CAST 291 -#define T_OBJECT_CAST 292 -#define T_ARRAY_CAST 293 -#define T_STRING_CAST 294 -#define T_DOUBLE_CAST 295 -#define T_INT_CAST 296 -#define T_DEC 297 -#define T_INC 298 -#define T_CLONE 299 -#define T_NEW 300 -#define T_EXIT 301 -#define T_IF 302 -#define T_ELSEIF 303 -#define T_ELSE 304 -#define T_ENDIF 305 -#define T_LNUMBER 306 -#define T_DNUMBER 307 -#define T_STRING 308 -#define T_STRING_VARNAME 309 -#define T_VARIABLE 310 -#define T_NUM_STRING 311 -#define T_INLINE_HTML 312 -#define T_CHARACTER 313 -#define T_BAD_CHARACTER 314 -#define T_ENCAPSED_AND_WHITESPACE 315 -#define T_CONSTANT_ENCAPSED_STRING 316 -#define T_ECHO 317 -#define T_DO 318 -#define T_WHILE 319 -#define T_ENDWHILE 320 -#define T_FOR 321 -#define T_ENDFOR 322 -#define T_FOREACH 323 -#define T_ENDFOREACH 324 -#define T_DECLARE 325 -#define T_ENDDECLARE 326 -#define T_AS 327 -#define T_SWITCH 328 -#define T_ENDSWITCH 329 -#define T_CASE 330 -#define T_DEFAULT 331 -#define T_BREAK 332 -#define T_CONTINUE 333 -#define T_GOTO 334 -#define T_FUNCTION 335 -#define T_CONST 336 -#define T_RETURN 337 -#define T_TRY 338 -#define T_CATCH 339 -#define T_FINALLY 340 -#define T_THROW 341 -#define T_USE 342 -#define T_INSTEADOF 343 -#define T_GLOBAL 344 -#define T_PUBLIC 345 -#define T_PROTECTED 346 -#define T_PRIVATE 347 -#define T_FINAL 348 -#define T_ABSTRACT 349 -#define T_STATIC 350 -#define T_VAR 351 -#define T_UNSET 352 -#define T_ISSET 353 -#define T_EMPTY 354 -#define T_HALT_COMPILER 355 -#define T_CLASS 356 -#define T_TRAIT 357 -#define T_INTERFACE 358 -#define T_EXTENDS 359 -#define T_IMPLEMENTS 360 -#define T_OBJECT_OPERATOR 361 -#define T_DOUBLE_ARROW 362 -#define T_LIST 363 -#define T_ARRAY 364 -#define T_CALLABLE 365 -#define T_CLASS_C 366 -#define T_TRAIT_C 367 -#define T_METHOD_C 368 -#define T_FUNC_C 369 -#define T_LINE 370 -#define T_FILE 371 -#define T_COMMENT 372 -#define T_DOC_COMMENT 373 -#define T_OPEN_TAG 374 -#define T_OPEN_TAG_WITH_ECHO 375 -#define T_CLOSE_TAG 376 -#define T_WHITESPACE 377 -#define T_START_HEREDOC 378 -#define T_END_HEREDOC 379 -#define T_DOLLAR_OPEN_CURLY_BRACES 380 -#define T_CURLY_OPEN 381 -#define T_PAAMAYIM_NEKUDOTAYIM 382 -#define T_NAMESPACE 383 -#define T_NS_C 384 -#define T_DIR 385 -#define T_NS_SEPARATOR 386 -#define T_ELLIPSIS 387 +#define T_POW_EQUAL 268 +#define T_SR_EQUAL 269 +#define T_SL_EQUAL 270 +#define T_XOR_EQUAL 271 +#define T_OR_EQUAL 272 +#define T_AND_EQUAL 273 +#define T_MOD_EQUAL 274 +#define T_CONCAT_EQUAL 275 +#define T_DIV_EQUAL 276 +#define T_MUL_EQUAL 277 +#define T_MINUS_EQUAL 278 +#define T_PLUS_EQUAL 279 +#define T_BOOLEAN_OR 280 +#define T_BOOLEAN_AND 281 +#define T_IS_NOT_IDENTICAL 282 +#define T_IS_IDENTICAL 283 +#define T_IS_NOT_EQUAL 284 +#define T_IS_EQUAL 285 +#define T_IS_GREATER_OR_EQUAL 286 +#define T_IS_SMALLER_OR_EQUAL 287 +#define T_SR 288 +#define T_SL 289 +#define T_INSTANCEOF 290 +#define T_UNSET_CAST 291 +#define T_BOOL_CAST 292 +#define T_OBJECT_CAST 293 +#define T_ARRAY_CAST 294 +#define T_STRING_CAST 295 +#define T_DOUBLE_CAST 296 +#define T_INT_CAST 297 +#define T_DEC 298 +#define T_INC 299 +#define T_POW 300 +#define T_CLONE 301 +#define T_NEW 302 +#define T_EXIT 303 +#define T_IF 304 +#define T_ELSEIF 305 +#define T_ELSE 306 +#define T_ENDIF 307 +#define T_LNUMBER 308 +#define T_DNUMBER 309 +#define T_STRING 310 +#define T_STRING_VARNAME 311 +#define T_VARIABLE 312 +#define T_NUM_STRING 313 +#define T_INLINE_HTML 314 +#define T_CHARACTER 315 +#define T_BAD_CHARACTER 316 +#define T_ENCAPSED_AND_WHITESPACE 317 +#define T_CONSTANT_ENCAPSED_STRING 318 +#define T_ECHO 319 +#define T_DO 320 +#define T_WHILE 321 +#define T_ENDWHILE 322 +#define T_FOR 323 +#define T_ENDFOR 324 +#define T_FOREACH 325 +#define T_ENDFOREACH 326 +#define T_DECLARE 327 +#define T_ENDDECLARE 328 +#define T_AS 329 +#define T_SWITCH 330 +#define T_ENDSWITCH 331 +#define T_CASE 332 +#define T_DEFAULT 333 +#define T_BREAK 334 +#define T_CONTINUE 335 +#define T_GOTO 336 +#define T_FUNCTION 337 +#define T_CONST 338 +#define T_RETURN 339 +#define T_TRY 340 +#define T_CATCH 341 +#define T_FINALLY 342 +#define T_THROW 343 +#define T_USE 344 +#define T_INSTEADOF 345 +#define T_GLOBAL 346 +#define T_PUBLIC 347 +#define T_PROTECTED 348 +#define T_PRIVATE 349 +#define T_FINAL 350 +#define T_ABSTRACT 351 +#define T_STATIC 352 +#define T_VAR 353 +#define T_UNSET 354 +#define T_ISSET 355 +#define T_EMPTY 356 +#define T_HALT_COMPILER 357 +#define T_CLASS 358 +#define T_TRAIT 359 +#define T_INTERFACE 360 +#define T_EXTENDS 361 +#define T_IMPLEMENTS 362 +#define T_OBJECT_OPERATOR 363 +#define T_DOUBLE_ARROW 364 +#define T_LIST 365 +#define T_ARRAY 366 +#define T_CALLABLE 367 +#define T_CLASS_C 368 +#define T_TRAIT_C 369 +#define T_METHOD_C 370 +#define T_FUNC_C 371 +#define T_LINE 372 +#define T_FILE 373 +#define T_COMMENT 374 +#define T_DOC_COMMENT 375 +#define T_OPEN_TAG 376 +#define T_OPEN_TAG_WITH_ECHO 377 +#define T_CLOSE_TAG 378 +#define T_WHITESPACE 379 +#define T_START_HEREDOC 380 +#define T_END_HEREDOC 381 +#define T_DOLLAR_OPEN_CURLY_BRACES 382 +#define T_CURLY_OPEN 383 +#define T_PAAMAYIM_NEKUDOTAYIM 384 +#define T_NAMESPACE 385 +#define T_NS_C 386 +#define T_DIR 387 +#define T_NS_SEPARATOR 388 +#define T_ELLIPSIS 389 @@ -651,20 +655,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 5848 +#define YYLAST 6195 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 161 +#define YYNTOKENS 163 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 226 /* YYNRULES -- Number of rules. */ -#define YYNRULES 590 +#define YYNRULES 592 /* YYNRULES -- Number of states. */ -#define YYNSTATES 1088 +#define YYNSTATES 1092 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 387 +#define YYMAXUTOK 389 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -675,16 +679,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 49, 160, 2, 157, 48, 32, 2, - 152, 153, 46, 43, 8, 44, 45, 47, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 27, 154, - 37, 14, 38, 26, 52, 2, 2, 2, 2, 2, + 2, 2, 2, 50, 162, 2, 159, 49, 33, 2, + 154, 155, 47, 44, 8, 45, 46, 48, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 28, 156, + 38, 14, 39, 27, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 62, 2, 158, 31, 2, 159, 2, 2, 2, + 2, 64, 2, 160, 32, 2, 161, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 155, 30, 156, 51, 2, 2, 2, + 2, 2, 2, 157, 31, 158, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -699,10 +703,10 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, - 29, 33, 34, 35, 36, 39, 40, 41, 42, 50, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 29, 30, 34, 35, 36, 37, 40, 41, 42, 43, + 51, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, @@ -710,7 +714,7 @@ static const yytype_uint8 yytranslate[] = 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151 + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153 }; #if YYDEBUG @@ -747,296 +751,297 @@ static const yytype_uint16 yyprhs[] = 826, 828, 829, 834, 836, 839, 841, 846, 850, 851, 855, 857, 859, 860, 861, 864, 865, 870, 871, 879, 883, 888, 889, 897, 900, 904, 908, 912, 916, 920, - 924, 928, 932, 936, 940, 944, 947, 950, 953, 956, - 957, 962, 963, 968, 969, 974, 975, 980, 984, 988, + 924, 928, 932, 936, 940, 944, 948, 951, 954, 957, + 960, 961, 966, 967, 972, 973, 978, 979, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, - 1031, 1034, 1037, 1040, 1044, 1048, 1052, 1056, 1060, 1064, - 1068, 1072, 1076, 1078, 1080, 1081, 1087, 1088, 1089, 1097, - 1098, 1104, 1106, 1109, 1112, 1115, 1118, 1121, 1124, 1127, - 1130, 1131, 1135, 1137, 1139, 1141, 1145, 1148, 1150, 1151, - 1162, 1163, 1175, 1178, 1181, 1186, 1191, 1196, 1201, 1206, - 1211, 1215, 1217, 1218, 1223, 1227, 1232, 1234, 1237, 1238, - 1242, 1243, 1249, 1250, 1255, 1256, 1262, 1263, 1269, 1270, - 1276, 1277, 1283, 1284, 1288, 1290, 1292, 1296, 1299, 1301, - 1305, 1308, 1310, 1312, 1313, 1314, 1321, 1323, 1326, 1327, - 1330, 1331, 1334, 1336, 1337, 1339, 1341, 1342, 1344, 1346, - 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1368, - 1371, 1375, 1377, 1382, 1386, 1388, 1390, 1392, 1396, 1399, - 1401, 1403, 1405, 1409, 1413, 1417, 1421, 1425, 1428, 1431, - 1435, 1439, 1443, 1447, 1451, 1455, 1459, 1463, 1467, 1471, - 1475, 1479, 1483, 1487, 1491, 1495, 1499, 1503, 1507, 1512, - 1518, 1521, 1524, 1528, 1530, 1532, 1534, 1536, 1540, 1543, - 1545, 1549, 1553, 1555, 1556, 1559, 1560, 1562, 1568, 1572, - 1576, 1578, 1580, 1582, 1586, 1590, 1592, 1594, 1596, 1597, - 1598, 1606, 1608, 1611, 1612, 1613, 1618, 1623, 1628, 1629, - 1632, 1634, 1636, 1637, 1639, 1642, 1646, 1650, 1652, 1657, - 1658, 1664, 1666, 1668, 1670, 1672, 1675, 1677, 1682, 1687, - 1689, 1691, 1696, 1697, 1699, 1701, 1702, 1705, 1710, 1715, - 1717, 1719, 1723, 1725, 1728, 1732, 1734, 1736, 1737, 1743, - 1744, 1745, 1748, 1754, 1758, 1762, 1764, 1771, 1776, 1781, - 1784, 1787, 1790, 1792, 1795, 1797, 1798, 1804, 1808, 1812, - 1819, 1823, 1825, 1827, 1829, 1834, 1839, 1844, 1847, 1850, - 1855, 1858, 1861, 1863, 1864, 1869, 1871, 1873, 1877, 1881, - 1885 + 1032, 1036, 1039, 1042, 1045, 1048, 1052, 1056, 1060, 1064, + 1068, 1072, 1076, 1080, 1084, 1086, 1088, 1089, 1095, 1096, + 1097, 1105, 1106, 1112, 1114, 1117, 1120, 1123, 1126, 1129, + 1132, 1135, 1138, 1139, 1143, 1145, 1147, 1149, 1153, 1156, + 1158, 1159, 1170, 1171, 1183, 1186, 1189, 1194, 1199, 1204, + 1209, 1214, 1219, 1223, 1225, 1226, 1231, 1235, 1240, 1242, + 1245, 1246, 1250, 1251, 1257, 1258, 1263, 1264, 1270, 1271, + 1277, 1278, 1284, 1285, 1291, 1292, 1296, 1298, 1300, 1304, + 1307, 1309, 1313, 1316, 1318, 1320, 1321, 1322, 1329, 1331, + 1334, 1335, 1338, 1339, 1342, 1344, 1345, 1347, 1349, 1350, + 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, + 1372, 1376, 1379, 1383, 1385, 1390, 1394, 1396, 1398, 1400, + 1404, 1407, 1409, 1411, 1413, 1417, 1421, 1425, 1429, 1433, + 1436, 1439, 1443, 1447, 1451, 1455, 1459, 1463, 1467, 1471, + 1475, 1479, 1483, 1487, 1491, 1495, 1499, 1503, 1507, 1511, + 1515, 1520, 1526, 1529, 1532, 1536, 1538, 1540, 1542, 1544, + 1548, 1551, 1553, 1557, 1561, 1563, 1564, 1567, 1568, 1570, + 1576, 1580, 1584, 1586, 1588, 1590, 1594, 1598, 1600, 1602, + 1604, 1605, 1606, 1614, 1616, 1619, 1620, 1621, 1626, 1631, + 1636, 1637, 1640, 1642, 1644, 1645, 1647, 1650, 1654, 1658, + 1660, 1665, 1666, 1672, 1674, 1676, 1678, 1680, 1683, 1685, + 1690, 1695, 1697, 1699, 1704, 1705, 1707, 1709, 1710, 1713, + 1718, 1723, 1725, 1727, 1731, 1733, 1736, 1740, 1742, 1744, + 1745, 1751, 1752, 1753, 1756, 1762, 1766, 1770, 1772, 1779, + 1784, 1789, 1792, 1795, 1798, 1800, 1803, 1805, 1806, 1812, + 1816, 1820, 1827, 1831, 1833, 1835, 1837, 1842, 1847, 1852, + 1855, 1858, 1863, 1866, 1869, 1871, 1872, 1877, 1879, 1881, + 1885, 1889, 1893 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 162, 0, -1, 163, -1, -1, 163, 164, 166, -1, - -1, 72, -1, 165, 150, 72, -1, 179, -1, 214, - -1, 215, -1, 119, 152, 153, 154, -1, 147, 165, - 154, -1, -1, 147, 165, 155, 167, 163, 156, -1, - -1, 147, 155, 168, 163, 156, -1, 106, 169, 154, - -1, 106, 99, 171, 154, -1, 106, 100, 173, 154, - -1, 175, 154, -1, 169, 8, 170, -1, 170, -1, - 165, -1, 165, 91, 72, -1, 150, 165, -1, 150, - 165, 91, 72, -1, 171, 8, 172, -1, 172, -1, - 165, -1, 165, 91, 72, -1, 150, 165, -1, 150, - 165, 91, 72, -1, 173, 8, 174, -1, 174, -1, - 165, -1, 165, 91, 72, -1, 150, 165, -1, 150, - 165, 91, 72, -1, 175, 8, 72, 14, 334, -1, - 100, 72, 14, 334, -1, -1, 176, 177, 178, -1, - -1, 179, -1, 214, -1, 215, -1, 119, 152, 153, - 154, -1, 180, -1, 72, 27, -1, 155, 176, 156, - -1, -1, -1, 66, 342, 181, 179, 182, 242, 246, - -1, -1, -1, 66, 342, 27, 183, 176, 184, 244, - 247, 69, 154, -1, -1, -1, 83, 185, 342, 186, - 241, -1, -1, -1, 82, 187, 179, 83, 188, 342, - 154, -1, -1, -1, -1, 85, 152, 281, 154, 189, - 281, 154, 190, 281, 153, 191, 232, -1, -1, 92, - 342, 192, 236, -1, 96, 154, -1, 96, 341, 154, - -1, 97, 154, -1, 97, 341, 154, -1, 101, 154, - -1, 101, 292, 154, -1, 101, 346, 154, -1, 306, - 154, -1, 108, 254, 154, -1, 114, 256, 154, -1, - 81, 280, 154, -1, 76, -1, 341, 154, -1, 116, - 152, 212, 153, 154, -1, -1, -1, 87, 152, 346, - 91, 193, 230, 229, 153, 194, 233, -1, -1, -1, - 87, 152, 292, 91, 195, 230, 229, 153, 196, 233, - -1, -1, 89, 197, 152, 235, 153, 234, -1, 154, - -1, -1, -1, 102, 198, 155, 176, 156, 200, 199, - 205, -1, 105, 341, 154, -1, 98, 72, 154, -1, - -1, -1, -1, -1, -1, 103, 152, 201, 322, 202, - 74, 153, 203, 155, 176, 156, 204, 207, -1, -1, - -1, 104, 206, 155, 176, 156, -1, 208, -1, -1, - 209, -1, 208, 209, -1, -1, -1, 103, 152, 322, - 210, 74, 153, 211, 155, 176, 156, -1, 213, -1, - 212, 8, 213, -1, 346, -1, 218, -1, 220, -1, - -1, 32, -1, -1, 151, -1, -1, 309, 216, 72, - 219, 152, 248, 153, 155, 176, 156, -1, -1, 223, - 72, 224, 221, 227, 155, 257, 156, -1, -1, 225, - 72, 222, 226, 155, 257, 156, -1, 120, -1, 113, - 120, -1, 121, -1, 112, 120, -1, -1, 123, 322, - -1, 122, -1, -1, 123, 228, -1, -1, 124, 228, - -1, 322, -1, 228, 8, 322, -1, -1, 126, 230, - -1, 346, -1, 32, 346, -1, -1, 127, 152, 231, - 371, 153, -1, 179, -1, 27, 176, 86, 154, -1, - 179, -1, 27, 176, 88, 154, -1, 179, -1, 27, - 176, 90, 154, -1, 72, 14, 334, -1, 235, 8, - 72, 14, 334, -1, 155, 237, 156, -1, 155, 154, - 237, 156, -1, 27, 237, 93, 154, -1, 27, 154, - 237, 93, 154, -1, -1, -1, 237, 94, 341, 240, - 238, 176, -1, -1, 237, 95, 240, 239, 176, -1, - 27, -1, 154, -1, 179, -1, 27, 176, 84, 154, - -1, -1, -1, 242, 67, 342, 243, 179, -1, -1, - -1, 244, 67, 342, 27, 245, 176, -1, -1, 68, - 179, -1, -1, 68, 27, 176, -1, 249, -1, -1, - 250, -1, 249, 8, 250, -1, 251, 216, 217, 74, - -1, 251, 216, 217, 74, 14, 334, -1, -1, 128, - -1, 129, -1, 322, -1, 152, 153, -1, 152, 253, - 153, -1, 152, 306, 153, -1, 292, -1, 346, -1, - 32, 344, -1, 151, 341, -1, 253, 8, 292, -1, - 253, 8, 346, -1, 253, 8, 32, 344, -1, 253, - 8, 151, 341, -1, 254, 8, 255, -1, 255, -1, - 74, -1, 157, 343, -1, 157, 155, 341, 156, -1, - 256, 8, 74, -1, 256, 8, 74, 14, 334, -1, - 74, -1, 74, 14, 334, -1, 257, 258, -1, -1, - -1, 274, 259, 278, 154, -1, 279, 154, -1, 261, - -1, -1, 275, 309, 216, 72, 260, 152, 248, 153, - 273, -1, 106, 262, 263, -1, 322, -1, 262, 8, - 322, -1, 154, -1, 155, 264, 156, -1, -1, 265, - -1, 266, -1, 265, 266, -1, 267, 154, -1, 271, - 154, -1, 270, 107, 268, -1, 322, -1, 268, 8, - 322, -1, 72, -1, 270, -1, 322, 146, 72, -1, - 269, 91, 272, 72, -1, 269, 91, 277, -1, -1, - 277, -1, 154, -1, 155, 176, 156, -1, 276, -1, - 115, -1, -1, 276, -1, 277, -1, 276, 277, -1, - 109, -1, 110, -1, 111, -1, 114, -1, 113, -1, - 112, -1, 278, 8, 74, -1, 278, 8, 74, 14, - 334, -1, 74, -1, 74, 14, 334, -1, 279, 8, - 72, 14, 334, -1, 100, 72, 14, 334, -1, 280, - 8, 341, -1, 341, -1, -1, 282, -1, -1, 282, - 8, 283, 341, -1, 341, -1, 284, 350, -1, 350, - -1, 285, 62, 365, 158, -1, 62, 365, 158, -1, - -1, 285, 287, 284, -1, 285, -1, 284, -1, -1, - -1, 289, 286, -1, -1, 64, 323, 291, 331, -1, - -1, 127, 152, 293, 371, 153, 14, 341, -1, 346, - 14, 341, -1, 346, 14, 32, 346, -1, -1, 346, - 14, 32, 64, 323, 294, 331, -1, 63, 341, -1, - 346, 25, 341, -1, 346, 24, 341, -1, 346, 23, - 341, -1, 346, 22, 341, -1, 346, 21, 341, -1, - 346, 20, 341, -1, 346, 19, 341, -1, 346, 18, - 341, -1, 346, 17, 341, -1, 346, 16, 341, -1, - 346, 15, 341, -1, 345, 61, -1, 61, 345, -1, - 345, 60, -1, 60, 345, -1, -1, 341, 28, 295, - 341, -1, -1, 341, 29, 296, 341, -1, -1, 341, - 9, 297, 341, -1, -1, 341, 11, 298, 341, -1, - 341, 10, 341, -1, 341, 30, 341, -1, 341, 32, - 341, -1, 341, 31, 341, -1, 341, 45, 341, -1, - 341, 43, 341, -1, 341, 44, 341, -1, 341, 46, - 341, -1, 341, 47, 341, -1, 341, 48, 341, -1, - 341, 42, 341, -1, 341, 41, 341, -1, 43, 341, - -1, 44, 341, -1, 49, 341, -1, 51, 341, -1, - 341, 34, 341, -1, 341, 33, 341, -1, 341, 36, - 341, -1, 341, 35, 341, -1, 341, 37, 341, -1, - 341, 40, 341, -1, 341, 38, 341, -1, 341, 39, - 341, -1, 341, 50, 323, -1, 342, -1, 290, -1, - -1, 152, 290, 153, 299, 288, -1, -1, -1, 341, - 26, 300, 341, 27, 301, 341, -1, -1, 341, 26, - 27, 302, 341, -1, 380, -1, 59, 341, -1, 58, - 341, -1, 57, 341, -1, 56, 341, -1, 55, 341, - -1, 54, 341, -1, 53, 341, -1, 65, 329, -1, - -1, 52, 303, 341, -1, 337, -1, 307, -1, 308, - -1, 159, 330, 159, -1, 12, 341, -1, 13, -1, - -1, 309, 216, 304, 152, 248, 153, 310, 155, 176, - 156, -1, -1, 114, 309, 216, 305, 152, 248, 153, - 310, 155, 176, 156, -1, 13, 292, -1, 13, 346, - -1, 13, 341, 126, 292, -1, 13, 341, 126, 346, - -1, 308, 62, 365, 158, -1, 307, 62, 365, 158, - -1, 80, 62, 365, 158, -1, 128, 152, 374, 153, - -1, 62, 374, 158, -1, 99, -1, -1, 106, 152, - 311, 153, -1, 311, 8, 74, -1, 311, 8, 32, - 74, -1, 74, -1, 32, 74, -1, -1, 165, 313, - 252, -1, -1, 147, 150, 165, 314, 252, -1, -1, - 150, 165, 315, 252, -1, -1, 321, 146, 369, 316, - 252, -1, -1, 321, 146, 356, 317, 252, -1, -1, - 358, 146, 369, 318, 252, -1, -1, 358, 146, 356, - 319, 252, -1, -1, 356, 320, 252, -1, 114, -1, - 165, -1, 147, 150, 165, -1, 150, 165, -1, 165, - -1, 147, 150, 165, -1, 150, 165, -1, 321, -1, - 324, -1, -1, -1, 362, 125, 325, 366, 326, 327, - -1, 362, -1, 327, 328, -1, -1, 125, 366, -1, - -1, 152, 153, -1, 342, -1, -1, 79, -1, 376, - -1, -1, 252, -1, 70, -1, 71, -1, 80, -1, - 134, -1, 135, -1, 149, -1, 131, -1, 132, -1, - 133, -1, 148, -1, 142, 79, 143, -1, 142, 143, - -1, 321, 146, 72, -1, 335, -1, 128, 152, 338, - 153, -1, 62, 338, 158, -1, 332, -1, 385, -1, - 165, -1, 147, 150, 165, -1, 150, 165, -1, 333, - -1, 130, -1, 336, -1, 335, 43, 335, -1, 335, - 44, 335, -1, 335, 46, 335, -1, 335, 47, 335, - -1, 335, 48, 335, -1, 49, 335, -1, 51, 335, - -1, 335, 30, 335, -1, 335, 32, 335, -1, 335, - 31, 335, -1, 335, 42, 335, -1, 335, 41, 335, - -1, 335, 45, 335, -1, 335, 10, 335, -1, 335, - 11, 335, -1, 335, 9, 335, -1, 335, 29, 335, - -1, 335, 28, 335, -1, 335, 34, 335, -1, 335, - 33, 335, -1, 335, 36, 335, -1, 335, 35, 335, - -1, 335, 37, 335, -1, 335, 38, 335, -1, 335, - 40, 335, -1, 335, 39, 335, -1, 335, 26, 27, - 335, -1, 335, 26, 335, 27, 335, -1, 43, 335, - -1, 44, 335, -1, 152, 335, 153, -1, 73, -1, - 386, -1, 384, -1, 165, -1, 147, 150, 165, -1, - 150, 165, -1, 332, -1, 160, 376, 160, -1, 142, - 376, 143, -1, 130, -1, -1, 340, 339, -1, -1, - 8, -1, 340, 8, 334, 126, 334, -1, 340, 8, - 334, -1, 334, 126, 334, -1, 334, -1, 343, -1, - 292, -1, 152, 341, 153, -1, 152, 306, 153, -1, - 346, -1, 346, -1, 346, -1, -1, -1, 361, 125, - 347, 366, 348, 355, 349, -1, 361, -1, 349, 350, - -1, -1, -1, 125, 366, 351, 355, -1, 352, 62, - 365, 158, -1, 353, 62, 365, 158, -1, -1, 354, - 252, -1, 353, -1, 352, -1, -1, 363, -1, 370, - 363, -1, 321, 146, 356, -1, 358, 146, 356, -1, - 363, -1, 359, 62, 365, 158, -1, -1, 312, 360, - 62, 365, 158, -1, 362, -1, 359, -1, 312, -1, - 363, -1, 370, 363, -1, 357, -1, 363, 62, 365, - 158, -1, 363, 155, 341, 156, -1, 364, -1, 74, - -1, 157, 155, 341, 156, -1, -1, 341, -1, 368, - -1, -1, 356, 367, -1, 368, 62, 365, 158, -1, - 368, 155, 341, 156, -1, 369, -1, 72, -1, 155, - 341, 156, -1, 157, -1, 370, 157, -1, 371, 8, - 372, -1, 372, -1, 346, -1, -1, 127, 152, 373, - 371, 153, -1, -1, -1, 375, 339, -1, 375, 8, - 341, 126, 341, -1, 375, 8, 341, -1, 341, 126, - 341, -1, 341, -1, 375, 8, 341, 126, 32, 344, - -1, 375, 8, 32, 344, -1, 341, 126, 32, 344, - -1, 32, 344, -1, 376, 377, -1, 376, 79, -1, - 377, -1, 79, 377, -1, 74, -1, -1, 74, 62, - 378, 379, 158, -1, 74, 125, 72, -1, 144, 341, - 156, -1, 144, 73, 62, 341, 158, 156, -1, 145, - 346, 156, -1, 72, -1, 75, -1, 74, -1, 117, - 152, 381, 153, -1, 118, 152, 346, 153, -1, 118, - 152, 292, 153, -1, 7, 341, -1, 6, 341, -1, - 5, 152, 341, 153, -1, 4, 341, -1, 3, 341, - -1, 383, -1, -1, 381, 8, 382, 383, -1, 346, - -1, 292, -1, 321, 146, 72, -1, 358, 146, 72, - -1, 321, 146, 120, -1, 321, 146, 120, -1 + 164, 0, -1, 165, -1, -1, 165, 166, 168, -1, + -1, 74, -1, 167, 152, 74, -1, 181, -1, 216, + -1, 217, -1, 121, 154, 155, 156, -1, 149, 167, + 156, -1, -1, 149, 167, 157, 169, 165, 158, -1, + -1, 149, 157, 170, 165, 158, -1, 108, 171, 156, + -1, 108, 101, 173, 156, -1, 108, 102, 175, 156, + -1, 177, 156, -1, 171, 8, 172, -1, 172, -1, + 167, -1, 167, 93, 74, -1, 152, 167, -1, 152, + 167, 93, 74, -1, 173, 8, 174, -1, 174, -1, + 167, -1, 167, 93, 74, -1, 152, 167, -1, 152, + 167, 93, 74, -1, 175, 8, 176, -1, 176, -1, + 167, -1, 167, 93, 74, -1, 152, 167, -1, 152, + 167, 93, 74, -1, 177, 8, 74, 14, 336, -1, + 102, 74, 14, 336, -1, -1, 178, 179, 180, -1, + -1, 181, -1, 216, -1, 217, -1, 121, 154, 155, + 156, -1, 182, -1, 74, 28, -1, 157, 178, 158, + -1, -1, -1, 68, 344, 183, 181, 184, 244, 248, + -1, -1, -1, 68, 344, 28, 185, 178, 186, 246, + 249, 71, 156, -1, -1, -1, 85, 187, 344, 188, + 243, -1, -1, -1, 84, 189, 181, 85, 190, 344, + 156, -1, -1, -1, -1, 87, 154, 283, 156, 191, + 283, 156, 192, 283, 155, 193, 234, -1, -1, 94, + 344, 194, 238, -1, 98, 156, -1, 98, 343, 156, + -1, 99, 156, -1, 99, 343, 156, -1, 103, 156, + -1, 103, 294, 156, -1, 103, 348, 156, -1, 308, + 156, -1, 110, 256, 156, -1, 116, 258, 156, -1, + 83, 282, 156, -1, 78, -1, 343, 156, -1, 118, + 154, 214, 155, 156, -1, -1, -1, 89, 154, 348, + 93, 195, 232, 231, 155, 196, 235, -1, -1, -1, + 89, 154, 294, 93, 197, 232, 231, 155, 198, 235, + -1, -1, 91, 199, 154, 237, 155, 236, -1, 156, + -1, -1, -1, 104, 200, 157, 178, 158, 202, 201, + 207, -1, 107, 343, 156, -1, 100, 74, 156, -1, + -1, -1, -1, -1, -1, 105, 154, 203, 324, 204, + 76, 155, 205, 157, 178, 158, 206, 209, -1, -1, + -1, 106, 208, 157, 178, 158, -1, 210, -1, -1, + 211, -1, 210, 211, -1, -1, -1, 105, 154, 324, + 212, 76, 155, 213, 157, 178, 158, -1, 215, -1, + 214, 8, 215, -1, 348, -1, 220, -1, 222, -1, + -1, 33, -1, -1, 153, -1, -1, 311, 218, 74, + 221, 154, 250, 155, 157, 178, 158, -1, -1, 225, + 74, 226, 223, 229, 157, 259, 158, -1, -1, 227, + 74, 224, 228, 157, 259, 158, -1, 122, -1, 115, + 122, -1, 123, -1, 114, 122, -1, -1, 125, 324, + -1, 124, -1, -1, 125, 230, -1, -1, 126, 230, + -1, 324, -1, 230, 8, 324, -1, -1, 128, 232, + -1, 348, -1, 33, 348, -1, -1, 129, 154, 233, + 373, 155, -1, 181, -1, 28, 178, 88, 156, -1, + 181, -1, 28, 178, 90, 156, -1, 181, -1, 28, + 178, 92, 156, -1, 74, 14, 336, -1, 237, 8, + 74, 14, 336, -1, 157, 239, 158, -1, 157, 156, + 239, 158, -1, 28, 239, 95, 156, -1, 28, 156, + 239, 95, 156, -1, -1, -1, 239, 96, 343, 242, + 240, 178, -1, -1, 239, 97, 242, 241, 178, -1, + 28, -1, 156, -1, 181, -1, 28, 178, 86, 156, + -1, -1, -1, 244, 69, 344, 245, 181, -1, -1, + -1, 246, 69, 344, 28, 247, 178, -1, -1, 70, + 181, -1, -1, 70, 28, 178, -1, 251, -1, -1, + 252, -1, 251, 8, 252, -1, 253, 218, 219, 76, + -1, 253, 218, 219, 76, 14, 336, -1, -1, 130, + -1, 131, -1, 324, -1, 154, 155, -1, 154, 255, + 155, -1, 154, 308, 155, -1, 294, -1, 348, -1, + 33, 346, -1, 153, 343, -1, 255, 8, 294, -1, + 255, 8, 348, -1, 255, 8, 33, 346, -1, 255, + 8, 153, 343, -1, 256, 8, 257, -1, 257, -1, + 76, -1, 159, 345, -1, 159, 157, 343, 158, -1, + 258, 8, 76, -1, 258, 8, 76, 14, 336, -1, + 76, -1, 76, 14, 336, -1, 259, 260, -1, -1, + -1, 276, 261, 280, 156, -1, 281, 156, -1, 263, + -1, -1, 277, 311, 218, 74, 262, 154, 250, 155, + 275, -1, 108, 264, 265, -1, 324, -1, 264, 8, + 324, -1, 156, -1, 157, 266, 158, -1, -1, 267, + -1, 268, -1, 267, 268, -1, 269, 156, -1, 273, + 156, -1, 272, 109, 270, -1, 324, -1, 270, 8, + 324, -1, 74, -1, 272, -1, 324, 148, 74, -1, + 271, 93, 274, 74, -1, 271, 93, 279, -1, -1, + 279, -1, 156, -1, 157, 178, 158, -1, 278, -1, + 117, -1, -1, 278, -1, 279, -1, 278, 279, -1, + 111, -1, 112, -1, 113, -1, 116, -1, 115, -1, + 114, -1, 280, 8, 76, -1, 280, 8, 76, 14, + 336, -1, 76, -1, 76, 14, 336, -1, 281, 8, + 74, 14, 336, -1, 102, 74, 14, 336, -1, 282, + 8, 343, -1, 343, -1, -1, 284, -1, -1, 284, + 8, 285, 343, -1, 343, -1, 286, 352, -1, 352, + -1, 287, 64, 367, 160, -1, 64, 367, 160, -1, + -1, 287, 289, 286, -1, 287, -1, 286, -1, -1, + -1, 291, 288, -1, -1, 66, 325, 293, 333, -1, + -1, 129, 154, 295, 373, 155, 14, 343, -1, 348, + 14, 343, -1, 348, 14, 33, 348, -1, -1, 348, + 14, 33, 66, 325, 296, 333, -1, 65, 343, -1, + 348, 26, 343, -1, 348, 25, 343, -1, 348, 24, + 343, -1, 348, 15, 343, -1, 348, 23, 343, -1, + 348, 22, 343, -1, 348, 21, 343, -1, 348, 20, + 343, -1, 348, 19, 343, -1, 348, 18, 343, -1, + 348, 17, 343, -1, 348, 16, 343, -1, 347, 62, + -1, 62, 347, -1, 347, 61, -1, 61, 347, -1, + -1, 343, 29, 297, 343, -1, -1, 343, 30, 298, + 343, -1, -1, 343, 9, 299, 343, -1, -1, 343, + 11, 300, 343, -1, 343, 10, 343, -1, 343, 31, + 343, -1, 343, 33, 343, -1, 343, 32, 343, -1, + 343, 46, 343, -1, 343, 44, 343, -1, 343, 45, + 343, -1, 343, 47, 343, -1, 343, 63, 343, -1, + 343, 48, 343, -1, 343, 49, 343, -1, 343, 43, + 343, -1, 343, 42, 343, -1, 44, 343, -1, 45, + 343, -1, 50, 343, -1, 52, 343, -1, 343, 35, + 343, -1, 343, 34, 343, -1, 343, 37, 343, -1, + 343, 36, 343, -1, 343, 38, 343, -1, 343, 41, + 343, -1, 343, 39, 343, -1, 343, 40, 343, -1, + 343, 51, 325, -1, 344, -1, 292, -1, -1, 154, + 292, 155, 301, 290, -1, -1, -1, 343, 27, 302, + 343, 28, 303, 343, -1, -1, 343, 27, 28, 304, + 343, -1, 382, -1, 60, 343, -1, 59, 343, -1, + 58, 343, -1, 57, 343, -1, 56, 343, -1, 55, + 343, -1, 54, 343, -1, 67, 331, -1, -1, 53, + 305, 343, -1, 339, -1, 309, -1, 310, -1, 161, + 332, 161, -1, 12, 343, -1, 13, -1, -1, 311, + 218, 306, 154, 250, 155, 312, 157, 178, 158, -1, + -1, 116, 311, 218, 307, 154, 250, 155, 312, 157, + 178, 158, -1, 13, 294, -1, 13, 348, -1, 13, + 343, 128, 294, -1, 13, 343, 128, 348, -1, 310, + 64, 367, 160, -1, 309, 64, 367, 160, -1, 82, + 64, 367, 160, -1, 130, 154, 376, 155, -1, 64, + 376, 160, -1, 101, -1, -1, 108, 154, 313, 155, + -1, 313, 8, 76, -1, 313, 8, 33, 76, -1, + 76, -1, 33, 76, -1, -1, 167, 315, 254, -1, + -1, 149, 152, 167, 316, 254, -1, -1, 152, 167, + 317, 254, -1, -1, 323, 148, 371, 318, 254, -1, + -1, 323, 148, 358, 319, 254, -1, -1, 360, 148, + 371, 320, 254, -1, -1, 360, 148, 358, 321, 254, + -1, -1, 358, 322, 254, -1, 116, -1, 167, -1, + 149, 152, 167, -1, 152, 167, -1, 167, -1, 149, + 152, 167, -1, 152, 167, -1, 323, -1, 326, -1, + -1, -1, 364, 127, 327, 368, 328, 329, -1, 364, + -1, 329, 330, -1, -1, 127, 368, -1, -1, 154, + 155, -1, 344, -1, -1, 81, -1, 378, -1, -1, + 254, -1, 72, -1, 73, -1, 82, -1, 136, -1, + 137, -1, 151, -1, 133, -1, 134, -1, 135, -1, + 150, -1, 144, 81, 145, -1, 144, 145, -1, 323, + 148, 74, -1, 337, -1, 130, 154, 340, 155, -1, + 64, 340, 160, -1, 334, -1, 387, -1, 167, -1, + 149, 152, 167, -1, 152, 167, -1, 335, -1, 132, + -1, 338, -1, 337, 44, 337, -1, 337, 45, 337, + -1, 337, 47, 337, -1, 337, 48, 337, -1, 337, + 49, 337, -1, 50, 337, -1, 52, 337, -1, 337, + 31, 337, -1, 337, 33, 337, -1, 337, 32, 337, + -1, 337, 43, 337, -1, 337, 42, 337, -1, 337, + 46, 337, -1, 337, 10, 337, -1, 337, 11, 337, + -1, 337, 9, 337, -1, 337, 30, 337, -1, 337, + 29, 337, -1, 337, 35, 337, -1, 337, 34, 337, + -1, 337, 37, 337, -1, 337, 36, 337, -1, 337, + 38, 337, -1, 337, 39, 337, -1, 337, 41, 337, + -1, 337, 40, 337, -1, 337, 27, 28, 337, -1, + 337, 27, 337, 28, 337, -1, 44, 337, -1, 45, + 337, -1, 154, 337, 155, -1, 75, -1, 388, -1, + 386, -1, 167, -1, 149, 152, 167, -1, 152, 167, + -1, 334, -1, 162, 378, 162, -1, 144, 378, 145, + -1, 132, -1, -1, 342, 341, -1, -1, 8, -1, + 342, 8, 336, 128, 336, -1, 342, 8, 336, -1, + 336, 128, 336, -1, 336, -1, 345, -1, 294, -1, + 154, 343, 155, -1, 154, 308, 155, -1, 348, -1, + 348, -1, 348, -1, -1, -1, 363, 127, 349, 368, + 350, 357, 351, -1, 363, -1, 351, 352, -1, -1, + -1, 127, 368, 353, 357, -1, 354, 64, 367, 160, + -1, 355, 64, 367, 160, -1, -1, 356, 254, -1, + 355, -1, 354, -1, -1, 365, -1, 372, 365, -1, + 323, 148, 358, -1, 360, 148, 358, -1, 365, -1, + 361, 64, 367, 160, -1, -1, 314, 362, 64, 367, + 160, -1, 364, -1, 361, -1, 314, -1, 365, -1, + 372, 365, -1, 359, -1, 365, 64, 367, 160, -1, + 365, 157, 343, 158, -1, 366, -1, 76, -1, 159, + 157, 343, 158, -1, -1, 343, -1, 370, -1, -1, + 358, 369, -1, 370, 64, 367, 160, -1, 370, 157, + 343, 158, -1, 371, -1, 74, -1, 157, 343, 158, + -1, 159, -1, 372, 159, -1, 373, 8, 374, -1, + 374, -1, 348, -1, -1, 129, 154, 375, 373, 155, + -1, -1, -1, 377, 341, -1, 377, 8, 343, 128, + 343, -1, 377, 8, 343, -1, 343, 128, 343, -1, + 343, -1, 377, 8, 343, 128, 33, 346, -1, 377, + 8, 33, 346, -1, 343, 128, 33, 346, -1, 33, + 346, -1, 378, 379, -1, 378, 81, -1, 379, -1, + 81, 379, -1, 76, -1, -1, 76, 64, 380, 381, + 160, -1, 76, 127, 74, -1, 146, 343, 158, -1, + 146, 75, 64, 343, 160, 158, -1, 147, 348, 158, + -1, 74, -1, 77, -1, 76, -1, 119, 154, 383, + 155, -1, 120, 154, 348, 155, -1, 120, 154, 294, + 155, -1, 7, 343, -1, 6, 343, -1, 5, 154, + 343, 155, -1, 4, 343, -1, 3, 343, -1, 385, + -1, -1, 383, 8, 384, 385, -1, 348, -1, 294, + -1, 323, 148, 74, -1, 360, 148, 74, -1, 323, + 148, 122, -1, 323, 148, 122, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 220, 220, 224, 224, 225, 229, 230, 234, 235, - 236, 237, 238, 239, 239, 241, 241, 243, 244, 245, - 246, 250, 251, 255, 256, 257, 258, 262, 263, 267, - 268, 269, 270, 274, 275, 279, 280, 281, 282, 286, - 287, 291, 291, 292, 297, 298, 299, 300, 305, 306, - 310, 311, 311, 311, 312, 312, 312, 313, 313, 313, - 314, 314, 314, 318, 320, 322, 315, 324, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 340, 341, 339, 344, 345, 343, 347, - 347, 348, 349, 350, 349, 352, 353, 357, 358, 359, - 360, 361, 358, 365, 366, 366, 370, 371, 375, 376, - 380, 380, 380, 384, 385, 389, 393, 397, 401, 402, - 406, 407, 411, 411, 418, 417, 424, 423, 433, 434, - 435, 436, 440, 441, 445, 448, 450, 453, 455, 459, - 460, 464, 465, 469, 470, 471, 471, 475, 476, 481, - 482, 487, 488, 493, 494, 499, 500, 501, 502, 507, - 508, 508, 509, 509, 514, 515, 520, 521, 526, 528, - 528, 532, 534, 534, 538, 540, 544, 546, 551, 552, - 557, 558, 562, 564, 570, 571, 572, 573, 578, 579, - 580, 585, 586, 587, 588, 589, 590, 591, 592, 596, - 597, 602, 603, 604, 609, 610, 611, 612, 618, 619, - 624, 624, 625, 626, 627, 627, 633, 637, 638, 642, - 643, 646, 648, 652, 653, 657, 658, 662, 666, 667, - 671, 672, 676, 680, 681, 685, 686, 690, 691, 695, - 696, 700, 701, 705, 706, 710, 711, 712, 713, 714, - 715, 719, 720, 721, 722, 726, 727, 731, 732, 737, - 738, 742, 742, 743, 747, 748, 752, 753, 757, 757, - 758, 759, 763, 764, 764, 769, 769, 773, 773, 774, - 775, 776, 776, 777, 778, 779, 780, 781, 782, 783, - 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, - 793, 794, 794, 795, 795, 796, 796, 797, 798, 799, - 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, - 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, - 820, 821, 822, 823, 824, 824, 825, 826, 825, 828, - 828, 830, 831, 832, 833, 834, 835, 836, 837, 838, - 839, 839, 840, 841, 842, 843, 844, 845, 846, 846, - 849, 849, 855, 856, 857, 858, 862, 863, 864, 867, - 868, 871, 874, 876, 880, 881, 882, 883, 887, 887, - 889, 889, 891, 891, 893, 893, 895, 895, 897, 897, - 899, 899, 901, 901, 906, 907, 908, 909, 913, 914, - 915, 921, 922, 927, 928, 927, 930, 935, 936, 941, - 945, 946, 947, 951, 952, 953, 958, 959, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - 979, 983, 984, 985, 989, 990, 991, 992, 993, 994, - 995, 996, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, - 1028, 1029, 1030, 1035, 1036, 1037, 1038, 1039, 1040, 1041, - 1042, 1043, 1044, 1049, 1050, 1053, 1055, 1059, 1060, 1061, - 1062, 1066, 1067, 1071, 1072, 1077, 1082, 1087, 1092, 1093, - 1092, 1095, 1099, 1100, 1105, 1105, 1109, 1110, 1114, 1114, - 1119, 1120, 1121, 1125, 1126, 1130, 1131, 1136, 1140, 1141, - 1141, 1146, 1147, 1148, 1153, 1154, 1155, 1159, 1160, 1161, - 1166, 1167, 1171, 1172, 1177, 1178, 1178, 1182, 1183, 1184, - 1188, 1189, 1193, 1194, 1198, 1199, 1204, 1205, 1205, 1206, - 1211, 1212, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1227, 1228, 1229, 1230, 1236, 1237, 1237, 1238, 1239, 1240, - 1241, 1246, 1247, 1248, 1253, 1254, 1255, 1256, 1257, 1258, - 1259, 1260, 1264, 1265, 1265, 1269, 1270, 1274, 1275, 1279, - 1283 + 0, 223, 223, 227, 227, 228, 232, 233, 237, 238, + 239, 240, 241, 242, 242, 244, 244, 246, 247, 248, + 249, 253, 254, 258, 259, 260, 261, 265, 266, 270, + 271, 272, 273, 277, 278, 282, 283, 284, 285, 289, + 290, 294, 294, 295, 300, 301, 302, 303, 308, 309, + 313, 314, 314, 314, 315, 315, 315, 316, 316, 316, + 317, 317, 317, 321, 323, 325, 318, 327, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 343, 344, 342, 347, 348, 346, 350, + 350, 351, 352, 353, 352, 355, 356, 360, 361, 362, + 363, 364, 361, 368, 369, 369, 373, 374, 378, 379, + 383, 383, 383, 387, 388, 392, 396, 400, 404, 405, + 409, 410, 414, 414, 421, 420, 427, 426, 436, 437, + 438, 439, 443, 444, 448, 451, 453, 456, 458, 462, + 463, 467, 468, 472, 473, 474, 474, 478, 479, 484, + 485, 490, 491, 496, 497, 502, 503, 504, 505, 510, + 511, 511, 512, 512, 517, 518, 523, 524, 529, 531, + 531, 535, 537, 537, 541, 543, 547, 549, 554, 555, + 560, 561, 565, 567, 573, 574, 575, 576, 581, 582, + 583, 588, 589, 590, 591, 592, 593, 594, 595, 599, + 600, 605, 606, 607, 612, 613, 614, 615, 621, 622, + 627, 627, 628, 629, 630, 630, 636, 640, 641, 645, + 646, 649, 651, 655, 656, 660, 661, 665, 669, 670, + 674, 675, 679, 683, 684, 688, 689, 693, 694, 698, + 699, 703, 704, 708, 709, 713, 714, 715, 716, 717, + 718, 722, 723, 724, 725, 729, 730, 734, 735, 740, + 741, 745, 745, 746, 750, 751, 755, 756, 760, 760, + 761, 762, 766, 767, 767, 772, 772, 776, 776, 777, + 778, 779, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 797, 798, 798, 799, 799, 800, 800, 801, 802, + 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 829, 830, 831, + 830, 833, 833, 835, 836, 837, 838, 839, 840, 841, + 842, 843, 844, 844, 845, 846, 847, 848, 849, 850, + 851, 851, 854, 854, 860, 861, 862, 863, 867, 868, + 869, 872, 873, 876, 879, 881, 885, 886, 887, 888, + 892, 892, 894, 894, 896, 896, 898, 898, 900, 900, + 902, 902, 904, 904, 906, 906, 911, 912, 913, 914, + 918, 919, 920, 926, 927, 932, 933, 932, 935, 940, + 941, 946, 950, 951, 952, 956, 957, 958, 963, 964, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 984, 988, 989, 990, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1040, 1041, 1042, 1043, 1044, + 1045, 1046, 1047, 1048, 1049, 1054, 1055, 1058, 1060, 1064, + 1065, 1066, 1067, 1071, 1072, 1076, 1077, 1082, 1087, 1092, + 1097, 1098, 1097, 1100, 1104, 1105, 1110, 1110, 1114, 1115, + 1119, 1119, 1124, 1125, 1126, 1130, 1131, 1135, 1136, 1141, + 1145, 1146, 1146, 1151, 1152, 1153, 1158, 1159, 1160, 1164, + 1165, 1166, 1171, 1172, 1176, 1177, 1182, 1183, 1183, 1187, + 1188, 1189, 1193, 1194, 1198, 1199, 1203, 1204, 1209, 1210, + 1210, 1211, 1216, 1217, 1221, 1222, 1223, 1224, 1225, 1226, + 1227, 1228, 1232, 1233, 1234, 1235, 1241, 1242, 1242, 1243, + 1244, 1245, 1246, 1251, 1252, 1253, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1269, 1270, 1270, 1274, 1275, 1279, + 1280, 1284, 1288 }; #endif @@ -1051,10 +1056,10 @@ static const char *const yytname[] = "\"include (T_INCLUDE)\"", "','", "\"or (T_LOGICAL_OR)\"", "\"xor (T_LOGICAL_XOR)\"", "\"and (T_LOGICAL_AND)\"", "\"print (T_PRINT)\"", "\"yield (T_YIELD)\"", "'='", - "\">>= (T_SR_EQUAL)\"", "\"<<= (T_SL_EQUAL)\"", "\"^= (T_XOR_EQUAL)\"", - "\"|= (T_OR_EQUAL)\"", "\"&= (T_AND_EQUAL)\"", "\"%= (T_MOD_EQUAL)\"", - "\".= (T_CONCAT_EQUAL)\"", "\"/= (T_DIV_EQUAL)\"", - "\"*= (T_MUL_EQUAL)\"", "\"-= (T_MINUS_EQUAL)\"", + "\"**= (T_POW_EQUAL)\"", "\">>= (T_SR_EQUAL)\"", "\"<<= (T_SL_EQUAL)\"", + "\"^= (T_XOR_EQUAL)\"", "\"|= (T_OR_EQUAL)\"", "\"&= (T_AND_EQUAL)\"", + "\"%= (T_MOD_EQUAL)\"", "\".= (T_CONCAT_EQUAL)\"", + "\"/= (T_DIV_EQUAL)\"", "\"*= (T_MUL_EQUAL)\"", "\"-= (T_MINUS_EQUAL)\"", "\"+= (T_PLUS_EQUAL)\"", "'?'", "':'", "\"|| (T_BOOLEAN_OR)\"", "\"&& (T_BOOLEAN_AND)\"", "'|'", "'^'", "'&'", "\"!== (T_IS_NOT_IDENTICAL)\"", "\"=== (T_IS_IDENTICAL)\"", @@ -1065,10 +1070,11 @@ static const char *const yytname[] = "\"(unset) (T_UNSET_CAST)\"", "\"(bool) (T_BOOL_CAST)\"", "\"(object) (T_OBJECT_CAST)\"", "\"(array) (T_ARRAY_CAST)\"", "\"(string) (T_STRING_CAST)\"", "\"(double) (T_DOUBLE_CAST)\"", - "\"(int) (T_INT_CAST)\"", "\"-- (T_DEC)\"", "\"++ (T_INC)\"", "'['", - "\"clone (T_CLONE)\"", "\"new (T_NEW)\"", "\"exit (T_EXIT)\"", - "\"if (T_IF)\"", "\"elseif (T_ELSEIF)\"", "\"else (T_ELSE)\"", - "\"endif (T_ENDIF)\"", "\"integer number (T_LNUMBER)\"", + "\"(int) (T_INT_CAST)\"", "\"-- (T_DEC)\"", "\"++ (T_INC)\"", + "\"** (T_POW)\"", "'['", "\"clone (T_CLONE)\"", "\"new (T_NEW)\"", + "\"exit (T_EXIT)\"", "\"if (T_IF)\"", "\"elseif (T_ELSEIF)\"", + "\"else (T_ELSE)\"", "\"endif (T_ENDIF)\"", + "\"integer number (T_LNUMBER)\"", "\"floating-point number (T_DNUMBER)\"", "\"identifier (T_STRING)\"", "\"variable name (T_STRING_VARNAME)\"", "\"variable (T_VARIABLE)\"", "\"number (T_NUM_STRING)\"", "T_INLINE_HTML", "T_CHARACTER", @@ -1180,11 +1186,11 @@ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 44, 263, 264, 265, 266, 267, 61, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 63, 58, 279, 280, - 124, 94, 38, 281, 282, 283, 284, 60, 62, 285, - 286, 287, 288, 43, 45, 46, 42, 47, 37, 33, - 289, 126, 64, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 91, 299, 300, 301, 302, 303, 304, 305, + 273, 274, 275, 276, 277, 278, 279, 63, 58, 280, + 281, 124, 94, 38, 282, 283, 284, 285, 60, 62, + 286, 287, 288, 289, 43, 45, 46, 42, 47, 37, + 33, 290, 126, 64, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 91, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, @@ -1193,74 +1199,74 @@ static const yytype_uint16 yytoknum[] = 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 40, 41, 59, 123, 125, 36, 93, 96, - 34 + 386, 387, 388, 389, 40, 41, 59, 123, 125, 36, + 93, 96, 34 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 161, 162, 164, 163, 163, 165, 165, 166, 166, - 166, 166, 166, 167, 166, 168, 166, 166, 166, 166, - 166, 169, 169, 170, 170, 170, 170, 171, 171, 172, - 172, 172, 172, 173, 173, 174, 174, 174, 174, 175, - 175, 177, 176, 176, 178, 178, 178, 178, 179, 179, - 180, 181, 182, 180, 183, 184, 180, 185, 186, 180, - 187, 188, 180, 189, 190, 191, 180, 192, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 193, 194, 180, 195, 196, 180, 197, - 180, 180, 198, 199, 180, 180, 180, 200, 201, 202, - 203, 204, 200, 205, 206, 205, 207, 207, 208, 208, - 210, 211, 209, 212, 212, 213, 214, 215, 216, 216, - 217, 217, 219, 218, 221, 220, 222, 220, 223, 223, - 223, 223, 224, 224, 225, 226, 226, 227, 227, 228, - 228, 229, 229, 230, 230, 231, 230, 232, 232, 233, - 233, 234, 234, 235, 235, 236, 236, 236, 236, 237, - 238, 237, 239, 237, 240, 240, 241, 241, 242, 243, - 242, 244, 245, 244, 246, 246, 247, 247, 248, 248, - 249, 249, 250, 250, 251, 251, 251, 251, 252, 252, - 252, 253, 253, 253, 253, 253, 253, 253, 253, 254, - 254, 255, 255, 255, 256, 256, 256, 256, 257, 257, - 259, 258, 258, 258, 260, 258, 261, 262, 262, 263, - 263, 264, 264, 265, 265, 266, 266, 267, 268, 268, - 269, 269, 270, 271, 271, 272, 272, 273, 273, 274, - 274, 275, 275, 276, 276, 277, 277, 277, 277, 277, - 277, 278, 278, 278, 278, 279, 279, 280, 280, 281, - 281, 283, 282, 282, 284, 284, 285, 285, 287, 286, - 286, 286, 288, 289, 288, 291, 290, 293, 292, 292, - 292, 294, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 295, - 292, 296, 292, 297, 292, 298, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 299, 292, 300, 301, 292, 302, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 303, 292, 292, 292, 292, 292, 292, 292, 304, 292, - 305, 292, 306, 306, 306, 306, 307, 307, 307, 308, - 308, 309, 310, 310, 311, 311, 311, 311, 313, 312, - 314, 312, 315, 312, 316, 312, 317, 312, 318, 312, - 319, 312, 320, 312, 321, 321, 321, 321, 322, 322, - 322, 323, 323, 325, 326, 324, 324, 327, 327, 328, - 329, 329, 329, 330, 330, 330, 331, 331, 332, 332, - 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, - 333, 334, 334, 334, 335, 335, 335, 335, 335, 335, - 335, 335, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 337, 337, 337, 337, 337, 337, 337, - 337, 337, 337, 338, 338, 339, 339, 340, 340, 340, - 340, 341, 341, 342, 342, 343, 344, 345, 347, 348, - 346, 346, 349, 349, 351, 350, 352, 352, 354, 353, - 355, 355, 355, 356, 356, 357, 357, 358, 359, 360, - 359, 361, 361, 361, 362, 362, 362, 363, 363, 363, - 364, 364, 365, 365, 366, 367, 366, 368, 368, 368, - 369, 369, 370, 370, 371, 371, 372, 373, 372, 372, - 374, 374, 375, 375, 375, 375, 375, 375, 375, 375, - 376, 376, 376, 376, 377, 378, 377, 377, 377, 377, - 377, 379, 379, 379, 380, 380, 380, 380, 380, 380, - 380, 380, 381, 382, 381, 383, 383, 384, 384, 385, - 386 + 0, 163, 164, 166, 165, 165, 167, 167, 168, 168, + 168, 168, 168, 169, 168, 170, 168, 168, 168, 168, + 168, 171, 171, 172, 172, 172, 172, 173, 173, 174, + 174, 174, 174, 175, 175, 176, 176, 176, 176, 177, + 177, 179, 178, 178, 180, 180, 180, 180, 181, 181, + 182, 183, 184, 182, 185, 186, 182, 187, 188, 182, + 189, 190, 182, 191, 192, 193, 182, 194, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 195, 196, 182, 197, 198, 182, 199, + 182, 182, 200, 201, 182, 182, 182, 202, 203, 204, + 205, 206, 202, 207, 208, 207, 209, 209, 210, 210, + 212, 213, 211, 214, 214, 215, 216, 217, 218, 218, + 219, 219, 221, 220, 223, 222, 224, 222, 225, 225, + 225, 225, 226, 226, 227, 228, 228, 229, 229, 230, + 230, 231, 231, 232, 232, 233, 232, 234, 234, 235, + 235, 236, 236, 237, 237, 238, 238, 238, 238, 239, + 240, 239, 241, 239, 242, 242, 243, 243, 244, 245, + 244, 246, 247, 246, 248, 248, 249, 249, 250, 250, + 251, 251, 252, 252, 253, 253, 253, 253, 254, 254, + 254, 255, 255, 255, 255, 255, 255, 255, 255, 256, + 256, 257, 257, 257, 258, 258, 258, 258, 259, 259, + 261, 260, 260, 260, 262, 260, 263, 264, 264, 265, + 265, 266, 266, 267, 267, 268, 268, 269, 270, 270, + 271, 271, 272, 273, 273, 274, 274, 275, 275, 276, + 276, 277, 277, 278, 278, 279, 279, 279, 279, 279, + 279, 280, 280, 280, 280, 281, 281, 282, 282, 283, + 283, 285, 284, 284, 286, 286, 287, 287, 289, 288, + 288, 288, 290, 291, 290, 293, 292, 295, 294, 294, + 294, 296, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 297, 294, 298, 294, 299, 294, 300, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 301, 294, 302, 303, + 294, 304, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 305, 294, 294, 294, 294, 294, 294, 294, + 306, 294, 307, 294, 308, 308, 308, 308, 309, 309, + 309, 310, 310, 311, 312, 312, 313, 313, 313, 313, + 315, 314, 316, 314, 317, 314, 318, 314, 319, 314, + 320, 314, 321, 314, 322, 314, 323, 323, 323, 323, + 324, 324, 324, 325, 325, 327, 328, 326, 326, 329, + 329, 330, 331, 331, 331, 332, 332, 332, 333, 333, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 335, 336, 336, 336, 337, 337, 337, 337, + 337, 337, 337, 337, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 340, 340, 341, 341, 342, + 342, 342, 342, 343, 343, 344, 344, 345, 346, 347, + 349, 350, 348, 348, 351, 351, 353, 352, 354, 354, + 356, 355, 357, 357, 357, 358, 358, 359, 359, 360, + 361, 362, 361, 363, 363, 363, 364, 364, 364, 365, + 365, 365, 366, 366, 367, 367, 368, 369, 368, 370, + 370, 370, 371, 371, 372, 372, 373, 373, 374, 375, + 374, 374, 376, 376, 377, 377, 377, 377, 377, 377, + 377, 377, 378, 378, 378, 378, 379, 380, 379, 379, + 379, 379, 379, 381, 381, 381, 382, 382, 382, 382, + 382, 382, 382, 382, 383, 384, 383, 385, 385, 386, + 386, 387, 388 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1295,37 +1301,37 @@ static const yytype_uint8 yyr2[] = 1, 0, 4, 1, 2, 1, 4, 3, 0, 3, 1, 1, 0, 0, 2, 0, 4, 0, 7, 3, 4, 0, 7, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 2, 0, - 4, 0, 4, 0, 4, 0, 4, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 0, 5, 0, 0, 7, 0, - 5, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 0, 3, 1, 1, 1, 3, 2, 1, 0, 10, - 0, 11, 2, 2, 4, 4, 4, 4, 4, 4, - 3, 1, 0, 4, 3, 4, 1, 2, 0, 3, - 0, 5, 0, 4, 0, 5, 0, 5, 0, 5, - 0, 5, 0, 3, 1, 1, 3, 2, 1, 3, - 2, 1, 1, 0, 0, 6, 1, 2, 0, 2, - 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, - 3, 1, 4, 3, 1, 1, 1, 3, 2, 1, - 1, 1, 3, 3, 3, 3, 3, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, + 0, 4, 0, 4, 0, 4, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, - 2, 2, 3, 1, 1, 1, 1, 3, 2, 1, - 3, 3, 1, 0, 2, 0, 1, 5, 3, 3, - 1, 1, 1, 3, 3, 1, 1, 1, 0, 0, - 7, 1, 2, 0, 0, 4, 4, 4, 0, 2, - 1, 1, 0, 1, 2, 3, 3, 1, 4, 0, - 5, 1, 1, 1, 1, 2, 1, 4, 4, 1, - 1, 4, 0, 1, 1, 0, 2, 4, 4, 1, - 1, 3, 1, 2, 3, 1, 1, 0, 5, 0, - 0, 2, 5, 3, 3, 1, 6, 4, 4, 2, - 2, 2, 1, 2, 1, 0, 5, 3, 3, 6, - 3, 1, 1, 1, 4, 4, 4, 2, 2, 4, - 2, 2, 1, 0, 4, 1, 1, 3, 3, 3, - 3 + 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 1, 1, 0, 5, 0, 0, + 7, 0, 5, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 3, 1, 1, 1, 3, 2, 1, + 0, 10, 0, 11, 2, 2, 4, 4, 4, 4, + 4, 4, 3, 1, 0, 4, 3, 4, 1, 2, + 0, 3, 0, 5, 0, 4, 0, 5, 0, 5, + 0, 5, 0, 5, 0, 3, 1, 1, 3, 2, + 1, 3, 2, 1, 1, 0, 0, 6, 1, 2, + 0, 2, 0, 2, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 2, 3, 1, 4, 3, 1, 1, 1, 3, + 2, 1, 1, 1, 3, 3, 3, 3, 3, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 5, 2, 2, 3, 1, 1, 1, 1, 3, + 2, 1, 3, 3, 1, 0, 2, 0, 1, 5, + 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, + 0, 0, 7, 1, 2, 0, 0, 4, 4, 4, + 0, 2, 1, 1, 0, 1, 2, 3, 3, 1, + 4, 0, 5, 1, 1, 1, 1, 2, 1, 4, + 4, 1, 1, 4, 0, 1, 1, 0, 2, 4, + 4, 1, 1, 3, 1, 2, 3, 1, 1, 0, + 5, 0, 0, 2, 5, 3, 3, 1, 6, 4, + 4, 2, 2, 2, 1, 2, 1, 0, 5, 3, + 3, 6, 3, 1, 1, 1, 4, 4, 4, 2, + 2, 4, 2, 2, 1, 0, 4, 1, 1, 3, + 3, 3, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1334,555 +1340,565 @@ static const yytype_uint8 yyr2[] = static const yytype_uint16 yydefact[] = { 5, 0, 3, 1, 0, 0, 0, 0, 0, 0, - 0, 357, 0, 0, 0, 0, 350, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 550, 0, 0, 410, - 0, 418, 419, 6, 473, 530, 80, 420, 0, 60, - 57, 0, 0, 89, 0, 0, 0, 0, 371, 0, - 0, 92, 0, 0, 0, 0, 0, 394, 0, 0, - 0, 0, 128, 130, 134, 0, 0, 482, 424, 425, - 426, 421, 422, 0, 0, 427, 423, 0, 0, 91, - 43, 542, 413, 0, 476, 4, 0, 8, 48, 9, - 10, 116, 117, 0, 0, 333, 492, 0, 353, 354, - 118, 523, 0, 479, 352, 0, 332, 491, 0, 495, - 392, 526, 0, 522, 501, 521, 524, 529, 0, 341, - 475, 474, 357, 6, 394, 0, 118, 581, 580, 0, - 578, 577, 356, 492, 0, 495, 319, 320, 321, 322, - 0, 348, 347, 346, 345, 344, 343, 342, 394, 0, - 0, 378, 0, 298, 497, 0, 296, 0, 555, 0, - 485, 283, 0, 0, 395, 401, 275, 402, 0, 406, - 524, 0, 0, 349, 412, 0, 51, 49, 532, 0, + 0, 359, 0, 0, 0, 0, 352, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 552, 0, 0, 412, + 0, 420, 421, 6, 475, 532, 80, 422, 0, 60, + 57, 0, 0, 89, 0, 0, 0, 0, 373, 0, + 0, 92, 0, 0, 0, 0, 0, 396, 0, 0, + 0, 0, 128, 130, 134, 0, 0, 484, 426, 427, + 428, 423, 424, 0, 0, 429, 425, 0, 0, 91, + 43, 544, 415, 0, 478, 4, 0, 8, 48, 9, + 10, 116, 117, 0, 0, 335, 494, 0, 355, 356, + 118, 525, 0, 481, 354, 0, 334, 493, 0, 497, + 394, 528, 0, 524, 503, 523, 526, 531, 0, 343, + 477, 476, 359, 6, 396, 0, 118, 583, 582, 0, + 580, 579, 358, 494, 0, 497, 321, 322, 323, 324, + 0, 350, 349, 348, 347, 346, 345, 344, 396, 0, + 0, 380, 0, 299, 499, 0, 297, 0, 557, 0, + 487, 283, 0, 0, 397, 403, 275, 404, 0, 408, + 526, 0, 0, 351, 414, 0, 51, 49, 534, 0, 258, 0, 0, 259, 0, 0, 67, 69, 0, 71, - 0, 0, 0, 73, 492, 0, 495, 0, 0, 0, + 0, 0, 0, 73, 494, 0, 497, 0, 0, 0, 0, 0, 23, 0, 22, 201, 0, 0, 200, 131, - 129, 206, 0, 118, 0, 0, 0, 0, 277, 550, - 564, 0, 429, 0, 0, 0, 562, 0, 15, 0, - 478, 333, 0, 0, 41, 0, 414, 0, 415, 0, - 0, 0, 0, 0, 20, 132, 126, 76, 532, 532, - 119, 358, 0, 0, 303, 0, 305, 336, 299, 301, + 129, 206, 0, 118, 0, 0, 0, 0, 277, 552, + 566, 0, 431, 0, 0, 0, 564, 0, 15, 0, + 480, 335, 0, 0, 41, 0, 416, 0, 417, 0, + 0, 0, 0, 0, 20, 132, 126, 76, 534, 534, + 119, 360, 0, 0, 304, 0, 306, 338, 300, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 81, 297, 295, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 532, 498, 532, - 0, 543, 525, 358, 0, 0, 351, 0, 382, 0, - 0, 559, 496, 0, 370, 486, 551, 0, 397, 0, - 416, 0, 403, 525, 411, 54, 0, 533, 0, 0, - 79, 0, 58, 0, 260, 263, 492, 495, 0, 0, - 70, 72, 96, 0, 74, 75, 43, 95, 0, 29, - 0, 28, 0, 35, 0, 34, 25, 0, 0, 17, - 0, 202, 495, 0, 77, 0, 0, 78, 360, 0, - 113, 115, 492, 495, 0, 582, 492, 495, 0, 549, - 0, 565, 0, 428, 563, 473, 0, 0, 561, 481, - 560, 477, 5, 12, 13, 0, 334, 494, 493, 50, - 0, 0, 355, 480, 7, 0, 379, 0, 0, 124, - 135, 0, 0, 122, 0, 532, 587, 590, 0, 515, - 513, 384, 0, 0, 307, 0, 339, 0, 0, 0, - 308, 310, 309, 324, 323, 326, 325, 327, 329, 330, - 328, 318, 317, 312, 313, 311, 314, 315, 316, 331, - 0, 279, 294, 293, 292, 291, 290, 289, 288, 287, - 286, 285, 284, 393, 588, 516, 388, 0, 0, 0, - 0, 579, 492, 495, 380, 540, 0, 554, 0, 553, - 396, 515, 417, 276, 516, 0, 43, 52, 368, 257, - 61, 0, 63, 261, 86, 83, 0, 0, 159, 159, - 68, 0, 0, 0, 0, 483, 420, 0, 440, 0, - 0, 0, 0, 436, 0, 434, 439, 40, 431, 441, - 435, 41, 31, 0, 0, 18, 37, 0, 0, 19, - 0, 24, 21, 0, 199, 207, 204, 0, 0, 0, - 583, 574, 576, 575, 11, 0, 546, 0, 545, 369, - 0, 567, 0, 568, 570, 0, 3, 5, 383, 272, - 0, 42, 44, 45, 46, 531, 0, 0, 188, 0, - 492, 0, 495, 0, 0, 0, 398, 133, 137, 0, - 0, 367, 366, 0, 184, 0, 0, 0, 0, 514, - 304, 306, 0, 0, 300, 302, 0, 280, 0, 0, - 518, 535, 499, 534, 539, 527, 528, 558, 557, 0, - 404, 41, 168, 0, 43, 166, 59, 259, 0, 0, - 0, 0, 0, 0, 159, 0, 159, 0, 470, 471, - 447, 448, 490, 0, 485, 483, 0, 0, 438, 0, + 0, 81, 298, 296, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, + 500, 534, 0, 545, 527, 360, 0, 0, 353, 0, + 384, 0, 0, 561, 498, 0, 372, 488, 553, 0, + 399, 0, 418, 0, 405, 527, 413, 54, 0, 535, + 0, 0, 79, 0, 58, 0, 260, 263, 494, 497, + 0, 0, 70, 72, 96, 0, 74, 75, 43, 95, + 0, 29, 0, 28, 0, 35, 0, 34, 25, 0, + 0, 17, 0, 202, 497, 0, 77, 0, 0, 78, + 362, 0, 113, 115, 494, 497, 0, 584, 494, 497, + 0, 551, 0, 567, 0, 430, 565, 475, 0, 0, + 563, 483, 562, 479, 5, 12, 13, 0, 336, 496, + 495, 50, 0, 0, 357, 482, 7, 0, 381, 0, + 0, 124, 135, 0, 0, 122, 0, 534, 589, 592, + 0, 517, 515, 386, 0, 0, 308, 0, 341, 0, + 0, 0, 309, 311, 310, 326, 325, 328, 327, 329, + 331, 332, 330, 320, 319, 313, 314, 312, 315, 317, + 318, 333, 316, 0, 279, 287, 295, 294, 293, 292, + 291, 290, 289, 288, 286, 285, 284, 395, 590, 518, + 390, 0, 0, 0, 0, 581, 494, 497, 382, 542, + 0, 556, 0, 555, 398, 517, 419, 276, 518, 0, + 43, 52, 370, 257, 61, 0, 63, 261, 86, 83, + 0, 0, 159, 159, 68, 0, 0, 0, 0, 485, + 422, 0, 442, 0, 0, 0, 0, 438, 0, 436, + 441, 40, 433, 443, 437, 41, 31, 0, 0, 18, + 37, 0, 0, 19, 0, 24, 21, 0, 199, 207, + 204, 0, 0, 0, 585, 576, 578, 577, 11, 0, + 548, 0, 547, 371, 0, 569, 0, 570, 572, 0, + 3, 5, 385, 272, 0, 42, 44, 45, 46, 533, + 0, 0, 188, 0, 494, 0, 497, 0, 0, 0, + 400, 133, 137, 0, 0, 369, 368, 0, 184, 0, + 0, 0, 0, 516, 305, 307, 0, 0, 301, 303, + 0, 280, 0, 0, 520, 537, 501, 536, 541, 529, + 530, 560, 559, 0, 406, 41, 168, 0, 43, 166, + 59, 259, 0, 0, 0, 0, 0, 0, 159, 0, + 159, 0, 472, 473, 449, 450, 492, 0, 487, 485, + 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 30, 27, - 0, 36, 33, 26, 203, 0, 184, 114, 82, 0, - 547, 549, 0, 571, 573, 572, 0, 0, 381, 16, - 3, 335, 0, 0, 193, 194, 0, 189, 190, 39, - 0, 400, 0, 0, 136, 139, 209, 184, 185, 186, - 0, 178, 180, 118, 187, 520, 541, 387, 385, 340, - 337, 281, 391, 389, 536, 512, 532, 0, 0, 552, - 408, 171, 174, 0, 41, 0, 262, 0, 0, 141, - 143, 141, 153, 0, 43, 151, 90, 0, 0, 0, - 0, 0, 155, 0, 433, 486, 484, 0, 437, 472, - 430, 589, 457, 455, 456, 0, 0, 459, 458, 449, - 451, 450, 461, 460, 463, 462, 464, 465, 467, 466, - 453, 452, 442, 443, 454, 444, 445, 446, 0, 93, - 32, 38, 205, 0, 584, 549, 544, 0, 566, 0, - 14, 532, 0, 271, 270, 274, 265, 0, 0, 0, - 492, 495, 399, 138, 209, 0, 241, 0, 372, 184, - 120, 0, 416, 511, 510, 0, 503, 0, 0, 556, - 405, 176, 0, 0, 53, 62, 0, 64, 144, 145, - 0, 0, 0, 0, 41, 0, 157, 0, 164, 165, - 162, 156, 489, 488, 432, 468, 0, 98, 103, 372, - 0, 278, 569, 0, 504, 264, 532, 0, 47, 197, - 198, 241, 140, 0, 0, 245, 246, 247, 250, 249, - 248, 240, 127, 208, 213, 210, 0, 239, 243, 0, - 0, 0, 0, 181, 121, 0, 338, 282, 532, 532, - 509, 500, 537, 538, 0, 407, 0, 0, 0, 169, - 175, 167, 259, 549, 142, 87, 84, 154, 0, 158, - 160, 43, 0, 469, 0, 104, 94, 0, 548, 267, - 512, 0, 269, 125, 0, 0, 217, 0, 118, 244, - 0, 212, 43, 0, 43, 182, 0, 0, 502, 409, - 0, 43, 0, 0, 0, 0, 0, 0, 152, 43, - 41, 487, 99, 0, 43, 505, 266, 0, 0, 219, - 221, 216, 253, 0, 0, 0, 41, 0, 376, 0, - 41, 0, 506, 507, 172, 41, 56, 170, 65, 146, - 43, 149, 88, 85, 41, 0, 43, 41, 256, 218, - 6, 0, 222, 223, 0, 0, 231, 0, 0, 0, - 0, 211, 214, 0, 123, 377, 0, 373, 359, 183, - 43, 0, 41, 0, 41, 361, 220, 224, 225, 235, - 0, 226, 0, 254, 251, 0, 255, 0, 374, 41, - 43, 147, 66, 0, 100, 105, 0, 234, 227, 228, - 232, 0, 184, 375, 41, 150, 0, 233, 0, 252, - 0, 0, 43, 229, 0, 148, 41, 237, 43, 215, - 101, 41, 107, 238, 0, 102, 106, 108, 0, 109, - 110, 0, 0, 111, 0, 43, 41, 112 + 97, 0, 30, 27, 0, 36, 33, 26, 203, 0, + 184, 114, 82, 0, 549, 551, 0, 573, 575, 574, + 0, 0, 383, 16, 3, 337, 0, 0, 193, 194, + 0, 189, 190, 39, 0, 402, 0, 0, 136, 139, + 209, 184, 185, 186, 0, 178, 180, 118, 187, 522, + 543, 389, 387, 342, 339, 281, 393, 391, 538, 514, + 534, 0, 0, 554, 410, 171, 174, 0, 41, 0, + 262, 0, 0, 141, 143, 141, 153, 0, 43, 151, + 90, 0, 0, 0, 0, 0, 155, 0, 435, 488, + 486, 0, 439, 474, 432, 591, 459, 457, 458, 0, + 0, 461, 460, 451, 453, 452, 463, 462, 465, 464, + 466, 467, 469, 468, 455, 454, 444, 445, 456, 446, + 447, 448, 0, 93, 32, 38, 205, 0, 586, 551, + 546, 0, 568, 0, 14, 534, 0, 271, 270, 274, + 265, 0, 0, 0, 494, 497, 401, 138, 209, 0, + 241, 0, 374, 184, 120, 0, 418, 513, 512, 0, + 505, 0, 0, 558, 407, 176, 0, 0, 53, 62, + 0, 64, 144, 145, 0, 0, 0, 0, 41, 0, + 157, 0, 164, 165, 162, 156, 491, 490, 434, 470, + 0, 98, 103, 374, 0, 278, 571, 0, 506, 264, + 534, 0, 47, 197, 198, 241, 140, 0, 0, 245, + 246, 247, 250, 249, 248, 240, 127, 208, 213, 210, + 0, 239, 243, 0, 0, 0, 0, 181, 121, 0, + 340, 282, 534, 534, 511, 502, 539, 540, 0, 409, + 0, 0, 0, 169, 175, 167, 259, 551, 142, 87, + 84, 154, 0, 158, 160, 43, 0, 471, 0, 104, + 94, 0, 550, 267, 514, 0, 269, 125, 0, 0, + 217, 0, 118, 244, 0, 212, 43, 0, 43, 182, + 0, 0, 504, 411, 0, 43, 0, 0, 0, 0, + 0, 0, 152, 43, 41, 489, 99, 0, 43, 507, + 266, 0, 0, 219, 221, 216, 253, 0, 0, 0, + 41, 0, 378, 0, 41, 0, 508, 509, 172, 41, + 56, 170, 65, 146, 43, 149, 88, 85, 41, 0, + 43, 41, 256, 218, 6, 0, 222, 223, 0, 0, + 231, 0, 0, 0, 0, 211, 214, 0, 123, 379, + 0, 375, 361, 183, 43, 0, 41, 0, 41, 363, + 220, 224, 225, 235, 0, 226, 0, 254, 251, 0, + 255, 0, 376, 41, 43, 147, 66, 0, 100, 105, + 0, 234, 227, 228, 232, 0, 184, 377, 41, 150, + 0, 233, 0, 252, 0, 0, 43, 229, 0, 148, + 41, 237, 43, 215, 101, 41, 107, 238, 0, 102, + 106, 108, 0, 109, 110, 0, 0, 111, 0, 43, + 41, 112 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 2, 4, 84, 85, 557, 392, 203, 204, - 350, 351, 354, 355, 86, 234, 400, 561, 991, 88, - 326, 612, 486, 731, 182, 491, 181, 613, 617, 912, - 1021, 339, 620, 957, 619, 956, 185, 197, 858, 789, - 924, 995, 1056, 1072, 926, 963, 1075, 1076, 1077, 1081, - 1084, 369, 370, 89, 90, 251, 895, 91, 583, 92, - 578, 410, 93, 409, 94, 580, 703, 704, 841, 739, - 913, 1042, 992, 746, 497, 500, 625, 959, 921, 850, - 616, 732, 953, 831, 1020, 834, 908, 710, 711, 712, - 713, 482, 569, 207, 208, 212, 816, 883, 937, 1035, - 884, 935, 971, 1001, 1002, 1003, 1004, 1048, 1005, 1006, - 1007, 1046, 1069, 885, 886, 887, 888, 973, 889, 179, - 333, 334, 618, 803, 804, 805, 867, 691, 692, 95, - 320, 96, 379, 822, 428, 429, 423, 425, 559, 427, - 821, 592, 140, 414, 537, 97, 98, 99, 126, 892, - 979, 101, 242, 555, 395, 588, 587, 599, 598, 295, - 102, 714, 166, 167, 485, 730, 830, 905, 173, 237, - 483, 103, 516, 632, 518, 519, 104, 633, 316, 634, - 105, 106, 107, 311, 108, 109, 468, 725, 901, 806, - 930, 823, 824, 825, 826, 110, 111, 112, 113, 252, - 114, 115, 116, 117, 328, 602, 724, 603, 604, 118, - 547, 548, 795, 159, 160, 225, 226, 550, 686, 119, - 374, 679, 375, 120, 520, 121 + -1, 1, 2, 4, 84, 85, 561, 394, 203, 204, + 352, 353, 356, 357, 86, 234, 402, 565, 995, 88, + 328, 616, 490, 735, 182, 495, 181, 617, 621, 916, + 1025, 341, 624, 961, 623, 960, 185, 197, 862, 793, + 928, 999, 1060, 1076, 930, 967, 1079, 1080, 1081, 1085, + 1088, 371, 372, 89, 90, 251, 899, 91, 587, 92, + 582, 412, 93, 411, 94, 584, 707, 708, 845, 743, + 917, 1046, 996, 750, 501, 504, 629, 963, 925, 854, + 620, 736, 957, 835, 1024, 838, 912, 714, 715, 716, + 717, 486, 573, 207, 208, 212, 820, 887, 941, 1039, + 888, 939, 975, 1005, 1006, 1007, 1008, 1052, 1009, 1010, + 1011, 1050, 1073, 889, 890, 891, 892, 977, 893, 179, + 335, 336, 622, 807, 808, 809, 871, 695, 696, 95, + 322, 96, 381, 826, 430, 431, 425, 427, 563, 429, + 825, 596, 140, 416, 541, 97, 98, 99, 126, 896, + 983, 101, 242, 559, 397, 592, 591, 603, 602, 297, + 102, 718, 166, 167, 489, 734, 834, 909, 173, 237, + 487, 103, 520, 636, 522, 523, 104, 637, 318, 638, + 105, 106, 107, 313, 108, 109, 472, 729, 905, 810, + 934, 827, 828, 829, 830, 110, 111, 112, 113, 252, + 114, 115, 116, 117, 330, 606, 728, 607, 608, 118, + 551, 552, 799, 159, 160, 225, 226, 554, 690, 119, + 376, 683, 377, 120, 524, 121 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -833 +#define YYPACT_NINF -872 static const yytype_int16 yypact[] = { - -833, 75, 82, -833, 1632, 3993, 3993, -58, 3993, 3993, - 3993, 3993, 3993, 3993, 3993, 3993, -833, 3993, 3993, 3993, - 3993, 3993, 3993, 3993, 119, 119, 2796, 3993, 158, -53, - -47, -833, -833, 211, -833, -833, -833, 123, 3993, -833, - -833, 91, 93, -833, -47, 2929, 3062, 181, -833, 203, - 3195, -833, 3993, 157, -7, 162, 168, 5, 138, 151, - 159, 170, -833, -833, -833, 192, 200, -833, -833, -833, - -833, -833, -833, 279, 86, -833, -833, 248, 4126, -833, - -833, 206, 326, 394, -60, -833, 12, -833, -833, -833, - -833, -833, -833, 349, 355, -833, -833, 244, 370, 373, - 431, 391, 377, -833, -833, 4740, -833, -833, 198, 1001, - -833, -833, 380, 466, 420, -833, 70, -833, 10, -833, - -833, -833, -833, -833, 465, 407, 431, 5388, 5388, 3993, - 5388, 5388, 5651, 185, 5083, 1193, -833, -833, 524, -833, - 3993, -833, -833, -833, -833, -833, -833, -833, -833, 434, - 248, -74, 442, -833, -833, 446, -833, 119, 5145, 448, - 586, -833, 450, 248, 454, 461, -833, -833, 463, 487, - -28, 10, 3328, -833, -833, 4126, 583, -833, 3993, 15, - 5388, 2530, -47, 3993, 3993, 492, -833, -833, 4783, -833, - 4825, 491, 632, -833, 493, 5388, 1419, 498, 4867, 89, - 146, 248, -13, 18, -833, -833, 147, 24, -833, -833, - -833, 641, 25, 431, 119, 3993, 3993, 505, -833, 2796, - -27, 458, -833, 4259, 119, 422, -833, 248, -833, 421, - -59, 506, 512, 4910, 510, 3993, 79, 508, 424, 79, - 67, 596, 519, 602, -833, 554, -833, -833, 3993, 3993, - -833, 608, 619, 178, -833, 3993, -833, 658, -833, -833, - 3993, 3993, 3993, 3993, 3993, 3993, 3993, 3993, 3993, 3993, - 3993, 3993, 3993, 3993, 3993, 3993, 3993, 3993, 3993, 158, - -833, -833, -833, 3461, 3993, 3993, 3993, 3993, 3993, 3993, - 3993, 3993, 3993, 3993, 3993, 519, 190, 3993, -833, 3993, - 3993, 206, -17, -833, 4952, 3993, -833, 248, -50, 199, - 199, -833, -833, 3594, -833, 3727, -833, 248, 454, 11, - 519, 11, -833, -4, -833, -833, 2530, 5388, 528, 3993, - -833, 599, -833, 536, 683, 5388, 604, 1390, 621, 0, - -833, -833, -833, 5195, -833, -833, -833, -833, 248, -8, - 29, -833, 248, 149, 30, -833, 163, 634, 156, -833, - 3993, -833, -833, -7, -833, 5195, 633, -833, -833, 17, - -833, -833, 35, 425, 36, -833, 555, 1640, 558, 342, - 556, -833, 645, -833, -833, 654, 4436, 565, -833, -833, - -833, 356, -833, -833, -833, 519, -833, -833, -833, -833, - 1765, 4478, -833, -833, -833, 1471, -833, 711, -44, -833, - 603, 570, 572, -833, 580, 3993, 587, -833, 3993, 588, - -4, -833, 10, 3993, 5549, 3993, -833, 3993, 3993, 3993, - 1521, 2713, 2977, 3110, 3110, 3110, 3110, 1086, 1086, 1086, - 1086, 730, 730, 699, 699, 699, 524, 524, 524, -833, - 134, 5651, 5651, 5651, 5651, 5651, 5651, 5651, 5651, 5651, - 5651, 5651, 5651, -833, 587, 590, -833, 585, 199, 593, - 4525, -833, 257, 1241, 288, -833, 119, 5388, 119, 5187, - 454, -833, -833, -833, -833, 199, -833, -833, -833, 5388, - -833, 1923, -833, -833, -833, -833, 746, 41, 607, 610, - -833, 5219, 5219, 5219, 5219, 5195, -833, 613, -833, 1, - 612, 248, 5219, -74, 620, -833, -833, -833, 5511, -833, - -833, 611, 176, 697, 89, -833, 177, 698, 146, -833, - 700, -833, -833, 4567, -833, -833, 768, 631, 119, 635, - -833, -833, -833, -833, -833, 636, -833, 43, -833, -833, - 507, -833, 3993, -833, -833, 519, 629, -833, -833, -23, - 640, -833, -833, -833, -833, -833, 119, 3993, -833, 46, - 49, 646, 910, 5195, 637, 248, 454, -833, 662, -44, - 639, -833, -833, 650, 365, 647, 4609, 519, 519, -4, - 5429, 5651, 3993, 5346, 5717, 5759, 158, -833, 519, 519, - -833, -833, -833, 4, -833, -833, -833, -833, -833, 3860, - -833, 263, -833, -47, -833, -833, -833, 3993, 3993, 423, - 423, 5195, 731, 2081, -833, 389, -833, 184, 488, 488, - -833, -833, 678, 648, 800, 5195, 666, 248, -50, 4994, - 16, 5219, 5219, 5219, 5018, 5219, 5219, 5219, 5219, 5219, - 5219, 5219, 5219, 5219, 5219, 5219, 5219, 5219, 5219, 5219, - 5219, 5219, 5219, 5219, 5219, 5219, 709, 745, -833, -833, - 748, -833, -833, -833, -833, 5195, 365, -833, -833, 3993, - -833, 342, 804, -833, -833, -833, 672, 4394, -833, -833, - 675, -833, 164, 682, -833, 5388, 2663, -833, -833, -833, - 248, 454, -44, 681, 829, -833, -833, 365, -833, -833, - 685, 832, -833, 431, -833, -833, -833, -833, -833, 5674, - -833, -833, -833, -833, -833, 689, 3993, 3993, 119, 5388, - -833, -833, 351, 688, 760, 691, 5388, 119, 694, 721, - -833, 721, -833, 835, -833, -833, -833, 521, 701, 3993, - 3, 363, -833, 5195, -833, 5195, -833, 703, 288, -833, - -833, -833, 5590, 5628, 5697, 5219, 5471, 5781, 5800, 2846, - 3244, 3376, 3509, 3509, 3509, 3509, 1423, 1423, 1423, 1423, - 655, 655, 488, 488, 488, -833, -833, -833, 702, -833, - -833, -833, -833, 704, -833, 342, -833, 3993, -833, 696, - -833, 3993, 199, 733, 189, -833, -833, 705, 119, 3993, - 51, 1135, 454, 829, -833, -44, 644, 708, 757, 393, - 714, 3993, 519, 802, 805, 519, -833, 710, 4654, -833, - 741, 399, -47, 2530, -833, -833, 715, -833, -833, -833, - 423, 718, 719, 5195, 783, 720, -833, 4698, -833, -833, - -833, -833, -833, 749, -833, 5740, 5219, -833, 772, 757, - 52, 5651, -833, 725, -833, -833, 3993, 733, -833, -833, - 5388, 849, -833, 810, -44, -833, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -833, 465, 624, -833, 32, - 722, 735, 736, -833, -833, 811, 5674, -833, 3993, 3993, - -833, 733, -833, -833, 199, -833, -47, 863, 824, -833, - -833, -833, 3993, 342, -833, -833, -833, -833, 740, -833, - -833, -833, 5195, 5740, -44, -833, -833, 742, -833, -833, - 689, 738, 733, -833, 887, 9, -833, 828, 431, -833, - 833, -833, -833, 160, -833, 890, 750, 751, -833, -833, - 879, -833, 753, 2530, 762, 56, 2239, 2239, -833, -833, - -25, -833, -833, 755, -833, -833, -833, 5195, -44, -833, - 145, -833, 899, 33, 844, 903, 763, 847, -833, 57, - 780, 5195, -833, -833, -833, 873, -833, -833, -833, -833, - -833, -833, -833, -833, 335, 871, -833, 791, -833, -833, - 860, 796, 145, -833, 799, 865, 858, 812, 808, 5195, - 893, -833, -833, 5195, -833, -833, 175, -833, -833, -833, - -833, 2397, 884, 822, 820, -833, -833, -833, -833, 713, - -44, -833, 905, -833, 967, 830, -833, 909, -833, 314, - -833, -833, -833, 834, -833, -833, 912, 914, 979, -833, - -833, 5195, 365, -833, 904, -833, 836, -833, -44, -833, - 839, 840, -833, -833, 320, -833, 837, -833, -833, -833, - -833, 841, 892, -833, 846, -833, 892, -833, -44, -833, - -833, 922, 854, -833, 855, -833, 843, -833 + -872, 78, 94, -872, 1933, 4363, 4363, -53, 4363, 4363, + 4363, 4363, 4363, 4363, 4363, 4363, -872, 4363, 4363, 4363, + 4363, 4363, 4363, 4363, 166, 166, 3148, 4363, 258, -48, + -40, -872, -872, 92, -872, -872, -872, 177, 4363, -872, + -872, -31, -20, -872, -40, 3283, 3418, 170, -872, 185, + 3553, -872, 4363, 161, 10, 128, 162, 7, 137, 143, + 145, 154, -872, -872, -872, 190, 201, -872, -872, -872, + -872, -872, -872, 304, -28, -872, -872, 289, 4498, -872, + -872, 218, 212, 322, -56, -872, 17, -872, -872, -872, + -872, -872, -872, 314, 346, -872, -872, 213, 318, 359, + 400, 376, 309, -872, -872, 5074, -872, -872, 216, 1880, + -872, -872, 311, 398, 350, -872, 73, -872, 40, -872, + -872, -872, -872, -872, 395, 327, 400, 5682, 5682, 4363, + 5682, 5682, 5949, -71, 5376, 1414, 435, 435, 30, 435, + 4363, 435, 435, 435, 435, 435, 435, 435, -872, 355, + 289, -61, 363, -872, -872, 369, -872, 166, 5420, 360, + 516, -872, 396, 289, 397, 399, -872, -872, 402, 418, + -36, 40, 3688, -872, -872, 4498, 524, -872, 4363, 18, + 5682, 2743, -40, 4363, 4363, 403, -872, -872, 5117, -872, + 5161, 404, 540, -872, 405, 5682, 980, 401, 5204, 70, + 91, 289, -17, 23, -872, -872, 240, 25, -872, -872, + -872, 542, 27, 400, 166, 4363, 4363, 407, -872, 3148, + 84, 292, -872, 4633, 166, 319, -872, 289, -872, 123, + -49, 408, 412, 5247, 411, 4363, 295, 409, 340, 295, + 176, 497, 419, 500, -872, 452, -872, -872, 4363, 4363, + -872, 504, 515, 220, -872, 4363, -872, 552, -872, -872, + 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, + 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 258, + 4363, -872, -872, -872, 3823, 4363, 4363, 4363, 4363, 4363, + 4363, 4363, 4363, 4363, 4363, 4363, 4363, 419, 21, 4363, + -872, 4363, 4363, 218, 82, -872, 5291, 4363, 435, 289, + 85, 182, 182, -872, -872, 3958, -872, 4093, -872, 289, + 397, 64, 419, 64, -872, -16, -872, -872, 2743, 5682, + 429, 4363, -872, 505, -872, 436, 583, 5682, 502, 1204, + 522, 13, -872, -872, -872, 5485, -872, -872, -872, -872, + 289, 259, 32, -872, 289, 291, 35, -872, 308, 523, + 151, -872, 4363, -872, -872, 10, -872, 5485, 530, -872, + -872, 39, -872, -872, 43, 135, 47, -872, 443, 1562, + 451, 224, 454, -872, 536, -872, -872, 547, 4769, 456, + -872, -872, -872, 99, -872, -872, -872, 419, -872, -872, + -872, -872, 2068, 4812, -872, -872, -872, 2878, -872, 598, + 134, -872, 491, 459, 460, -872, 492, 4363, 494, -872, + 4363, 496, -16, -872, 40, 4363, 5763, 4363, -872, 4363, + 4363, 4363, 2929, 1690, 1881, 3062, 3062, 3062, 3062, 1466, + 1466, 1466, 1466, 720, 720, 62, 62, 62, 30, 30, + 30, -872, 435, 158, 5949, 5949, 5949, 5949, 5949, 5949, + 5949, 5949, 5949, 5949, 5949, 5949, 5949, -872, 494, 498, + -872, 493, 182, 503, 4855, -872, 275, 1441, 284, -872, + 166, 5682, 166, 5476, 397, -872, -872, -872, -872, 182, + -872, -872, -872, 5682, -872, 2203, -872, -872, -872, -872, + 640, 52, 501, 509, -872, 5510, 5510, 5510, 5510, 5485, + -872, 506, -872, -23, 517, 289, 5510, -61, 520, -872, + -872, -872, 5847, -872, -872, 512, 315, 597, 70, -872, + 326, 599, 91, -872, 601, -872, -872, 4899, -872, -872, + 662, 527, 166, 521, -872, -872, -872, -872, -872, 529, + -872, 54, -872, -872, 328, -872, 4363, -872, -872, 419, + 526, -872, -872, 140, 532, -872, -872, -872, -872, -872, + 166, 4363, -872, 55, 57, 533, 950, 5485, 537, 289, + 397, -872, 564, 134, 538, -872, -872, 539, 263, 518, + 4942, 419, 419, -16, 5724, 5949, 4363, 5639, 6018, 6051, + 258, -872, 419, 419, -872, -872, -872, -15, -872, -872, + -872, -872, -872, 4228, -872, 384, -872, -40, -872, -872, + -872, 4363, 4363, 152, 152, 5485, 620, 2338, -872, 375, + -872, 169, 427, 427, -872, -872, 569, 545, 690, 5485, + 554, 289, 85, 5334, 5, 5510, 5510, 5510, 1561, 5510, + 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, + 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, 5510, + 602, 632, -872, -872, 635, -872, -872, -872, -872, 5485, + 263, -872, -872, 4363, -872, 224, 696, -872, -872, -872, + 551, 1799, -872, -872, 556, -872, 165, 557, -872, 5682, + 3013, -872, -872, -872, 289, 397, 134, 558, 708, -872, + -872, 263, -872, -872, 563, 711, -872, 400, -872, -872, + -872, -872, -872, 5984, -872, -872, -872, -872, -872, 566, + 4363, 4363, 166, 5682, -872, -872, 378, 565, 637, 575, + 5682, 166, 571, 604, -872, 604, -872, 722, -872, -872, + -872, 393, 578, 4363, 28, 294, -872, 5485, -872, 5485, + -872, 584, 284, -872, -872, -872, 5887, 5926, 6086, 5510, + 5806, 6127, 6146, 3199, 3333, 2062, 2737, 2737, 2737, 2737, + 884, 884, 884, 884, 495, 495, 427, 427, 427, -872, + -872, -872, 586, -872, -872, -872, -872, 588, -872, 224, + -872, 4363, -872, 580, -872, 4363, 182, 614, 301, -872, + -872, 590, 166, 4363, 58, 1146, 397, 708, -872, 134, + 414, 592, 641, 215, 595, 4363, 419, 687, 697, 419, + -872, 600, 4985, -872, 643, 424, -40, 2743, -872, -872, + 606, -872, -872, -872, 152, 618, 619, 5485, 684, 621, + -872, 5031, -872, -872, -872, -872, -872, 650, -872, 6107, + 5510, -872, 673, 641, 59, 5949, -872, 622, -872, -872, + 4363, 614, -872, -872, 5682, 642, -872, 707, 134, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + 395, 715, -872, 36, 627, 631, 629, -872, -872, 713, + 5984, -872, 4363, 4363, -872, 614, -872, -872, 182, -872, + -40, 759, 719, -872, -872, -872, 4363, 224, -872, -872, + -872, -872, 636, -872, -872, -872, 5485, 6107, 134, -872, + -872, 639, -872, -872, 566, 634, 614, -872, 783, 15, + -872, 725, 400, -872, 728, -872, -872, 26, -872, 789, + 644, 645, -872, -872, 778, -872, 652, 2743, 654, 60, + 2473, 2473, -872, -872, -22, -872, -872, 653, -872, -872, + -872, 5485, 134, -872, 202, -872, 797, 37, 738, 799, + 657, 741, -872, 61, 661, 5485, -872, -872, -872, 753, + -872, -872, -872, -872, -872, -872, -872, -872, 175, 756, + -872, 675, -872, -872, 742, 676, 202, -872, 681, 745, + 730, 685, 692, 5485, 766, -872, -872, 5485, -872, -872, + 71, -872, -872, -872, -872, 2608, 757, 688, 691, -872, + -872, -872, -872, 471, 134, -872, 774, -872, 836, 698, + -872, 775, -872, 432, -872, -872, -872, 700, -872, -872, + 779, 784, 851, -872, -872, 5485, 263, -872, 773, -872, + 705, -872, 134, -872, 709, 735, -872, -872, 349, -872, + 734, -872, -872, -872, -872, 737, 758, -872, 743, -872, + 758, -872, 134, -872, -872, 823, 710, -872, 744, -872, + 747, -872 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -833, -833, -376, -833, -24, -833, -833, -833, -833, 653, - -833, 489, -833, 484, -833, -272, -833, -833, 20, -833, - -833, -833, -833, -833, -833, -833, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -833, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -833, -833, -833, -45, -833, - -833, -833, 495, 638, 642, -124, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -833, -833, 333, 295, -605, - -833, -833, 80, -833, -833, -833, -481, -833, -833, 193, - -833, -833, -833, -833, -833, -833, -833, -655, -833, 225, - -833, -239, -833, -833, 684, -833, 231, -833, -833, -833, - -833, -833, -833, -833, -833, 44, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -833, -832, -833, -833, -833, - -603, -833, -833, 182, -833, -833, -833, -833, -833, 970, - -833, 31, -833, -833, -833, -833, -833, -833, -833, -833, - -833, -833, -833, -833, -833, -1, -833, -833, 6, 191, - -833, -833, -833, -833, -833, -833, -833, -833, -833, -833, - 436, 105, -267, -833, -833, -833, -833, -833, -833, -833, - 229, 665, -833, -170, 724, -833, -833, 417, 419, -833, - 102, -22, 852, -465, 485, 664, -833, -833, -833, -767, - -833, -833, -833, -833, 129, -248, -833, 384, -833, -833, - -833, -19, -9, -833, -202, -479, -833, -833, 352, 237, - -764, 379, -833, 845, -833, 470, 323, -833, -833, -833, - -833, -833, 387, -833, -833, -833 + -872, -872, -372, -872, -24, -872, -872, -872, -872, 543, + -872, 379, -872, 377, -872, 189, -872, -872, 20, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -172, -872, + -872, -872, 368, 510, 511, -124, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, 205, 172, -606, + -872, -872, -47, -872, -872, -872, -464, -872, -872, 67, + -872, -872, -872, -872, -872, -872, -872, -669, -872, 96, + -872, -178, -872, -872, 550, -872, 102, -872, -872, -872, + -872, -872, -872, -872, -872, -70, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -871, -872, -872, -872, + -611, -872, -872, 68, -872, -872, -872, -872, -872, 860, + -872, 2, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -57, -872, -872, 4, 77, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + 221, -310, -265, -872, -872, -872, -872, -872, -872, -872, + 115, 896, -872, -313, 1122, -872, -872, 303, 305, -872, + 1065, -14, 739, -463, 508, 910, -872, -872, -872, -773, + -872, -872, -872, -872, 12, -241, -872, -19, -872, -872, + -872, -25, 49, -872, -211, -482, -872, -872, -181, 8, + -772, 264, -872, 732, -872, 453, 274, -872, -872, -872, + -872, -872, 261, -872, -872, -872 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -587 +#define YYTABLE_NINF -589 static const yytype_int16 yytable[] = { - 151, 151, 303, 406, 164, 419, 610, 174, 176, 169, - 100, 607, 449, 608, 735, 741, 556, 968, 627, 170, - 243, 793, 186, 329, 87, 538, 358, 498, 123, 202, - 848, 860, 363, 366, 299, 381, 865, 524, 528, -273, - 940, 1010, 133, -586, 540, 299, 411, 412, 465, 622, - 229, 681, 817, 230, 696, 939, 463, -191, 299, -195, - 681, 419, 465, 213, 681, 1016, 726, 205, -163, -163, - -163, 481, -395, 484, 521, 3, 241, 232, 357, 211, - 636, 194, -2, 523, 35, 35, -395, -397, 760, 368, - 241, 241, -378, -382, 129, 467, -397, 469, 382, 172, - 241, 694, -273, 574, 48, 175, 575, 127, 128, 302, - 130, 131, 132, 134, 136, 137, 138, 139, -517, 141, - 142, 143, 144, 145, 146, 147, 308, 300, 158, 161, - 213, -163, 299, 151, 948, -514, 761, 241, 300, 318, - 180, 220, 241, 747, 222, 751, 388, 188, 190, 955, - 206, 300, 195, 220, 198, 499, 558, 849, 123, 727, - 332, 123, 323, 969, 970, 865, 244, 301, 81, 330, - 539, 232, 359, 517, 232, 349, 353, 356, 364, 367, - 233, 690, 151, 525, 529, 178, 941, 1011, -586, 541, - 151, 123, 977, 35, 623, 535, 682, 1047, 596, 697, - 151, 331, -191, 391, -195, 928, 123, 1037, 35, 989, - 1017, 223, 224, 585, 611, 336, -517, 1000, 123, 123, - 601, 35, -513, 223, 224, 300, 801, 403, 123, 123, - 123, 304, 35, 148, 978, 914, 227, 601, 177, 348, - 527, 228, 306, 183, 420, 184, 372, 376, 148, 1038, - 416, 866, 35, 191, 530, 164, 199, 200, 281, 282, - 169, 148, 464, 829, 35, 171, 149, 667, 670, 150, - 170, 475, 148, 35, 233, 192, 81, 233, 749, 750, - 327, 149, 209, 474, 150, 335, 195, 420, 210, 802, - 214, 81, 574, 480, 149, 575, 352, 150, 417, 241, - 420, 420, 360, 215, 81, 162, 201, 201, 163, 954, - 420, 216, 420, 241, -268, 81, 688, 195, 195, 513, - 123, 158, 217, 864, 522, 386, 241, 241, 526, 721, - -55, -55, -55, 418, 202, 81, 472, 401, -362, -362, - 752, 513, 734, 869, 218, 418, 487, 81, 717, 718, - 327, 327, 219, 220, 418, 151, 81, 424, 221, 722, - 723, 235, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, - 448, -173, -173, -173, 576, 451, 452, 453, 454, 455, - 456, 457, 458, 459, 460, 461, 462, 1060, 247, 327, - 220, 327, 470, 699, 571, 236, 100, 195, 155, 155, - -364, -364, 168, 589, 123, 477, 35, 479, 832, 833, - 562, 245, 222, 223, 224, 949, 151, 246, -161, -161, - -161, 489, 248, -585, -396, 249, 570, 123, 241, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 742, 151, -519, 151, 737, 148, 749, 750, 420, - 152, 152, 533, 250, 165, 123, 906, 907, 220, 545, - 223, 224, 844, 239, 1067, 1068, 420, 513, 513, 513, - 513, 513, 748, 749, 750, -497, -497, 638, 513, 149, - 422, -161, 150, 708, 709, 123, 220, 35, 220, 81, - 349, 388, -396, 388, 353, 792, 241, 195, -380, 153, - 156, 615, 574, 577, 151, 575, 171, 327, -179, 851, - 586, 708, 709, 253, 827, 590, 296, 591, 297, 593, - 594, 595, 220, 422, 663, 664, 665, 148, 223, 224, - 574, 155, 151, 575, 384, 298, 422, 422, 390, 513, - 738, 701, 238, 240, 601, 576, 422, 227, 422, 384, - 576, 390, 384, 390, 48, 389, 223, 224, 223, 224, - 149, 241, 164, 150, 279, 393, 394, 169, -585, 683, - 81, 684, 685, 852, 307, 853, 900, 170, 309, 820, - 155, 733, 310, 152, 315, 151, 151, 513, 155, 863, - 317, 383, 223, 224, 241, 421, 314, 319, 155, 321, - 325, 513, 322, 758, 845, 749, 750, 513, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 152, 745, 338, 342, 343, 344, 466, 960, - 152, 513, 576, 346, 687, 365, 601, 151, 378, 396, - 152, 421, 466, 168, 931, 397, 399, 402, 404, 695, - 976, 405, 980, 917, 407, 135, 812, 408, 576, 985, - 413, 415, 490, 576, 705, 426, 488, 994, 154, 154, - 492, 493, 997, 496, 719, 494, 946, 947, 660, 661, - 662, 663, 664, 665, 151, 422, 531, 536, 542, 549, - 372, 729, 544, 151, 196, 165, 552, 551, 1022, 335, - 736, 554, 422, -242, 1024, 573, 579, 810, 581, 513, - 582, 513, 584, 875, 876, 877, 878, 879, 880, -540, - -386, 513, -390, 600, 873, 276, 277, 278, 1039, 279, - 874, 605, 961, 875, 876, 877, 878, 879, 880, 881, - 621, 624, 637, 155, 626, 635, 640, 666, 1054, 668, - 671, 151, 673, 273, 274, 275, 276, 277, 278, 514, - 279, 195, 675, 676, 151, 689, 702, 700, 680, 678, - 1066, 576, 693, 420, 706, 576, 1071, 998, 195, 698, - 882, 514, 707, 743, 753, 715, 754, 705, 755, 383, - 909, 1019, 788, 1086, 974, 152, 151, 790, 797, 513, - 791, 312, 875, 876, 877, 878, 879, 880, 327, 828, - 798, 800, 513, 171, 155, 807, 814, 815, 818, 1033, - 819, -508, 835, 1036, 836, 837, 839, 840, 337, 843, - 576, 847, 862, 910, 857, 846, 854, 859, 802, 868, - 155, 890, 155, 891, 898, 894, 904, 899, 902, 911, - 362, 915, 916, 918, 919, 922, 925, 942, 371, 373, - 377, 1059, 934, 929, 950, 945, 152, 943, 387, 151, - 951, 944, 938, 952, 958, 420, 966, 964, 513, 861, - 576, 967, 972, 327, 981, 975, 984, 986, 982, 983, - 996, 870, 152, 1009, 152, 988, 1012, 1013, -192, 1014, - 872, 1015, 155, 896, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 1018, 514, 514, 514, - 514, 514, -177, 513, 576, 1023, 576, 1025, 514, 873, - 155, -230, 1026, 1028, 1032, 874, 1029, 513, 875, 876, - 877, 878, 879, 880, 881, 1030, 1031, 1034, 327, 473, - -497, -497, 1043, 987, 152, 1044, 1045, 1050, 576, 936, - 168, 1051, 1052, 1053, 1057, 513, -236, 1058, 1055, 513, - 1061, 1062, 1064, 1070, 1065, 1074, 1082, 1073, 1078, 1087, - 327, 327, 152, 155, 155, 933, 576, 1083, 515, 514, - 1085, 532, 672, 669, 335, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 513, 576, 962, - 515, 1079, 165, 677, 576, 813, 842, 993, 563, 422, - 920, 1041, 564, 546, 893, 871, 1027, 534, 231, 932, - 927, 897, 757, 756, 576, 152, 152, 514, 361, 965, - 796, -497, -497, -192, 380, 155, 794, 0, 0, 572, - 0, 514, 0, 999, 0, 1008, 0, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 0, 0, 0, 0, 0, 1008, 0, 0, - 0, 514, 155, 0, 597, 0, 0, 152, 0, 0, - 0, 155, 0, -587, -587, -587, -587, 271, 272, 273, - 274, 275, 276, 277, 278, 1049, 279, 0, 0, 0, - 312, 422, 312, -196, 0, 0, 0, 0, 0, 283, + 151, 151, 305, 169, 164, 155, 155, 614, 100, 168, + 739, 797, 421, 133, 451, 174, 176, 611, 745, 612, + 943, 232, 560, 972, 87, 243, 331, 864, 301, 202, + 186, 360, 521, 365, 869, 368, 171, 413, 414, 631, + 528, 502, 821, 532, 944, 1014, 123, 542, 301, 730, + 229, -588, 194, 230, 539, 544, 852, 469, 640, 981, + 626, 213, 685, 700, 408, -191, -195, 685, 685, 1020, + 421, 469, 423, -163, -163, -163, 359, 170, 3, 764, + 485, 279, 488, 211, -364, -364, 205, -397, 471, 370, + 473, 241, -397, 280, -2, 468, 241, 35, -380, -399, + 581, 129, 982, 241, 1041, -384, 172, 698, 48, 276, + 277, 278, -519, 279, 175, 232, 35, 470, 232, 467, + 177, 302, 222, 183, 227, 280, 310, 765, 213, 228, + 423, 470, 952, 151, 184, 241, -163, 301, 155, 320, + 35, 302, 731, -587, 123, 959, 301, 1042, 383, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 1051, 869, 751, 123, 755, 304, 334, 206, + 503, 973, 974, 244, 332, 351, 355, 358, 420, 361, + 81, 366, 151, 369, 853, 741, 338, 155, 529, 694, + 151, 533, 945, 1015, 543, 155, -499, -499, -588, 303, + 151, 333, 545, 393, -273, 155, 589, 627, 123, 686, + 701, 384, -191, -195, 932, 993, 1021, 374, 378, 562, + 325, -519, 350, 81, 600, 123, 123, -515, 35, 805, + 302, 605, 123, -399, 35, 123, -516, 241, 918, 302, + 123, 178, 35, 354, 191, 152, 152, -398, 605, 165, + 209, 241, 220, -382, 169, 164, 479, 390, 35, 192, + 168, 424, 199, 200, 703, 753, 754, -273, 148, 833, + -161, -161, -161, 709, 148, 241, 1004, 282, 283, 395, + 396, 742, 148, 578, 210, 478, 579, 171, 220, 123, + -587, 214, 806, 236, 418, 484, 35, 215, 123, 216, + 35, 149, 422, 201, 150, 958, 424, 149, 217, 476, + 150, 81, 746, 201, 123, 149, 35, 81, 150, 424, + 424, 517, 223, 224, 868, 81, 526, 756, 170, 424, + 530, 424, 123, -161, 35, 725, 202, 123, 405, 420, + 148, 81, 419, 517, 218, 712, 713, 422, 491, 873, + 575, 578, 527, 549, 579, 219, 148, 151, 223, 224, + 422, 422, 155, 123, 578, 870, 796, 579, 220, 247, + 422, 220, 422, 149, 148, 235, 150, 420, 152, 81, + 220, 692, 248, 81, 531, 221, 580, 1064, 245, 149, + 753, 754, 150, 712, 713, 220, 709, 362, 220, 81, + 390, 534, 687, 239, 688, 689, 100, 162, 671, 574, + 163, 241, 578, 721, 722, 579, 220, 81, -179, 674, + 246, 390, 566, 249, 726, 727, 953, 152, -268, 151, + -366, -366, -398, 250, 155, 152, 241, 385, 223, 224, + -521, 223, 224, 241, 856, 152, 857, 836, 837, 222, + 223, 224, 855, -55, -55, -55, 151, 253, 151, 298, + 241, 155, 299, 155, 391, 223, 224, 241, 223, 224, + 752, 753, 754, 593, 667, 668, 669, 300, 241, 227, + 424, 517, 517, 517, 517, 517, 223, 224, 849, 753, + 754, 642, 517, 910, 911, 386, 48, 424, 280, 392, + 165, -173, -173, -173, 351, 1071, 1072, 309, 355, 876, + 386, 311, 392, 386, 392, 619, 877, 312, 151, 831, + 316, 422, 878, 155, 317, 879, 880, 881, 882, 883, + 884, 885, 153, 156, 921, 238, 240, 525, 422, 664, + 665, 666, 667, 668, 669, 324, 151, 321, 319, 241, + 323, 155, 327, 517, 345, 705, 367, 340, 348, 580, + 344, 346, 380, 398, 580, 605, 518, 399, 940, 401, + 404, 406, 886, 407, 409, 169, 164, 410, 415, 417, + 428, 168, 879, 880, 881, 882, 883, 884, 518, 492, + 494, 497, 496, 824, 867, 498, 500, 535, 546, 151, + 151, 517, 152, 737, 155, 155, 540, 548, 171, 553, + 555, 556, 577, 965, 558, 517, 583, 762, 966, 585, + 586, 517, 517, 517, 517, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 588, 749, -542, 170, + -388, 904, -392, 604, 625, 517, 580, 628, 1002, 935, + 639, 151, 1003, 609, 1012, 630, 155, 605, 644, 641, + 670, 672, 1023, 675, 152, 677, 679, 682, 719, 615, + 816, 680, 580, 684, 693, 374, 697, 580, 702, 704, + 706, 950, 951, 711, 747, 710, 1012, 757, 759, 385, + 1037, 152, 814, 152, 1040, 758, 794, 792, 151, 795, + 801, 802, 811, 155, 804, 818, 819, 151, 822, 823, + -510, 839, 155, 840, 1053, 843, 518, 518, 518, 518, + 518, 841, 844, 517, 850, 517, 847, 518, 866, 858, + 861, 806, 1063, 863, 877, 517, 872, 894, 898, 895, + 878, 902, 1067, 879, 880, 881, 882, 883, 884, 885, + 906, 903, 915, 152, 273, 274, 275, 276, 277, 278, + 908, 279, 1084, 919, 920, 151, 922, 923, 926, 929, + 155, 938, 933, 280, 946, 947, 948, 955, 151, 949, + 956, 152, 962, 155, 970, 580, 968, 971, 518, 580, + 937, 976, 979, 985, 986, 987, 988, 738, 990, 992, + 1000, 1013, 1016, 1017, 424, 1018, -242, 1019, 978, 1022, + 151, 165, 913, 517, -177, 155, 879, 880, 881, 882, + 883, 884, 1027, 1029, 1030, -230, 517, 1032, 1033, 1034, + 1036, 1035, 1038, 1048, 152, 152, 518, 1047, 1054, 1049, + 1055, 1057, 1056, 1061, 580, 422, 1059, 914, -236, 1062, + 518, 1065, 1066, 1078, 1068, 1087, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 1069, 1074, 151, 942, 1077, 954, 1082, 155, 1086, + 518, 1089, 517, 536, 580, 1091, 152, 673, 1083, 676, + 681, 817, 567, 568, 997, 538, 424, 846, 924, 897, + 875, 135, -589, -589, -589, -589, 662, 663, 664, 665, + 666, 667, 668, 669, 154, 154, 1031, 848, 231, 936, + 931, 901, 761, 760, 798, 363, 969, 517, 580, 800, + 580, 382, 0, 152, 0, 0, 0, 422, -192, 0, + 196, 517, 152, 0, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 991, 518, 0, + 518, 0, 580, 0, 0, 0, 0, 0, 0, 517, + 518, 0, 0, 517, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 0, 0, 0, + 580, -499, -499, 0, 0, 0, 0, 0, 0, 0, + 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 517, 580, 152, 0, 0, 0, 0, 580, 0, + 0, -499, -499, 0, 0, 1045, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, + 0, 0, 0, 0, 0, 152, 0, 314, 518, 0, + 127, 128, 0, 130, 131, 132, 134, 136, 137, 138, + 139, 518, 141, 142, 143, 144, 145, 146, 147, 0, + 0, 158, 161, 0, 339, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, -192, 0, 0, 0, 0, + 188, 190, 0, 0, 964, 195, 364, 198, 0, 0, + 0, 0, 0, 0, 373, 375, 379, 0, 0, 0, + 0, 0, 0, 0, 389, 980, 347, 984, 152, 0, + 0, 0, 0, 233, 989, 0, 0, 518, 0, 0, + 0, 0, 998, 0, -196, 0, 0, 1001, 0, 0, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 0, 0, 1063, 152, 0, 515, 515, 515, 515, - 515, 0, 0, 152, 0, 0, 0, 515, 0, 155, - 0, 0, 0, 1080, 0, 0, 0, 0, 0, 514, - 0, 514, 155, 0, 0, -497, -497, 0, 0, 0, - 0, 514, 371, 0, 0, 0, 0, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 0, - 0, 0, 0, 0, 155, 628, 629, 630, 631, 0, - 312, 152, 0, 0, 0, 0, 639, 0, 515, 0, - 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, - 0, 0, 0, -497, -497, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 152, 0, 0, 514, - 0, 0, 0, 740, 740, 0, 515, 0, -196, 0, - 0, 0, 514, 0, 0, 0, 0, 155, 0, 0, - 515, -497, -497, 0, 0, 0, 515, 515, 515, 515, - 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, - 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, - 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 373, 0, 546, -363, -363, 0, 152, - 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, - 811, 0, 0, 0, 0, 762, 763, 764, 766, 767, - 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, - 0, 0, 312, 0, -365, -365, 0, 0, 0, 0, - 0, 838, 0, 514, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 0, 514, 515, 0, - 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 514, 0, 0, 0, 514, - -497, -497, 0, 0, 0, 0, 0, 0, 0, 546, - -587, -587, -587, -587, 658, 659, 660, 661, 662, 663, - 664, 665, 312, 0, 5, 6, 7, 8, 9, -497, - -497, 495, 0, 10, 11, 0, 0, 514, 0, 855, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 566, 740, 0, 0, 0, 515, 0, - 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, - 14, 515, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, - 0, 31, 32, 123, 34, 35, 0, 0, 0, 0, - 0, 37, 261, 262, 263, 264, 265, 266, 267, 268, + 294, 295, 296, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1026, 0, 0, 0, 0, 0, 1028, + 0, 0, 518, 0, 306, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 308, 518, -499, -499, 0, + 0, 0, 0, 1043, 0, 0, 0, 477, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 0, 0, 1058, 518, 0, 0, 233, 518, 0, + 233, 519, 0, 329, 0, 0, 0, 0, 337, 195, + 0, 0, 0, 0, 0, 1070, 0, 0, 0, 0, + 0, 1075, 0, 519, 0, -499, -499, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 1090, 0, + 195, 195, 0, 0, 158, 0, 0, 0, 388, 0, + 0, 550, 0, 0, 0, 0, 0, 499, 0, 0, + 403, -196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 329, 329, 0, 0, 576, 0, 0, + 426, 0, 0, 0, 0, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 0, 452, 0, 0, 0, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 0, 601, 329, 0, 329, 474, 0, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 481, 0, 483, 0, 0, 0, 0, 0, 0, 0, + 314, 0, 314, 0, 0, 0, 493, 0, 0, 0, + 0, 519, 519, 519, 519, 519, 0, 0, 0, 0, + 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 537, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 373, 0, 0, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 0, 0, + 0, 0, 195, 519, 0, -499, -499, 0, 0, 0, + 314, 0, 329, 0, 0, 590, 0, 0, 0, 0, + 594, 0, 595, 0, 597, 598, 599, 0, 0, 0, + 0, 0, -499, -499, -589, -589, -589, -589, 271, 272, + 273, 274, 275, 276, 277, 278, 0, 279, 0, 0, + 0, 519, 0, 0, 0, 0, 0, 0, 0, 280, + 0, 0, 0, 744, 744, 519, 0, 0, 0, 0, + 0, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 0, 0, 0, -365, + -365, 0, 0, 0, 0, 519, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 769, + 0, 0, 0, 375, 0, 550, -367, -367, 0, 0, + 0, 0, 0, 0, 0, 505, 506, 0, 0, 0, + 815, 507, 0, 508, 0, 0, 0, 0, 0, 0, + 0, 691, 0, -499, -499, 0, 0, 632, 633, 634, + 635, 0, 0, 31, 32, 123, 699, 0, 643, 0, + 0, 0, 314, 510, 0, 0, 0, 0, 0, 0, + 0, 842, 0, 519, 0, 519, 0, 0, 0, 0, + 0, 723, 0, 0, 0, 519, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 148, 733, 0, + 0, 0, 0, 0, 0, 0, 337, 740, 0, 0, + 0, 0, 0, 512, 68, 69, 70, 71, 72, 0, + 0, 0, 0, 0, 0, 513, 0, 0, 0, 550, + 514, 75, 76, 515, 0, 516, 0, 547, 0, 0, + 0, 0, 314, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 48, 279, 0, 345, 0, 0, 0, 546, 0, 0, - 923, 0, 0, 0, 0, 124, 0, 515, 59, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, - 0, 67, 68, 69, 70, 71, 72, 0, 0, 0, - 0, 0, 0, 73, 0, 0, 0, 0, 125, 75, - 76, 77, 567, 78, 568, 0, 0, 0, 81, 0, - 82, 83, 515, 0, 0, 5, 6, 7, 8, 9, - 0, 0, 0, 0, 10, 11, 515, 0, 0, 0, - 0, 0, 0, 0, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 0, 0, 0, 0, - 0, 0, 0, 0, 515, 12, 13, 0, 515, 0, - 0, 14, 0, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, - -497, -497, 31, 32, 33, 34, 35, 0, 36, 0, - 0, 0, 37, 38, 39, 40, 515, 41, 0, 42, - 0, 43, 0, 0, 44, 0, 0, 0, 45, 46, - 47, 48, 49, 50, 51, 0, 0, 52, 53, 0, - 54, 0, 0, 0, 55, 56, 57, 0, 58, 59, - 60, 61, 62, 63, 64, 0, 0, 0, 0, 65, - 66, 0, 67, 68, 69, 70, 71, 72, 5, 6, - 7, 8, 9, 0, 73, 0, 0, 10, 11, 74, - 75, 76, 77, 0, 78, 0, 79, 80, 0, 81, - 0, 82, 83, 543, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, - 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 279, 0, 519, 0, 0, 0, 0, 195, 0, + 0, 0, 0, 280, 744, 0, 519, 0, 0, 0, + 0, 0, 0, 0, 0, 195, 0, 766, 767, 768, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, + 790, 791, 0, 0, 0, 329, 832, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, + 256, 0, 0, 0, 0, 0, 0, 0, 851, 0, + 0, 0, 519, 0, 0, 0, 257, 550, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, + 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 0, 0, 0, 865, 519, 0, 0, + 329, 0, 0, 0, 0, 0, 0, 0, 874, 0, + 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, + 900, 859, 0, 0, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 0, 0, 519, + 0, 0, 0, 519, 0, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 0, 279, 0, 0, 329, 5, 6, 7, 8, + 9, -499, -499, 0, 280, 10, 11, 0, 0, 0, + 0, 519, 0, 0, 0, 0, 0, 0, 0, 803, + 0, 0, 0, 0, 0, 0, 0, 329, 329, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 337, 927, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 30, 0, 0, 0, 31, 32, 33, 34, 35, + 0, 36, 0, 0, 0, 37, 38, 39, 40, 0, + 41, 0, 42, 0, 43, 0, 0, 44, 0, 0, + 0, 45, 46, 47, 48, 49, 50, 51, 0, 0, + 52, 53, 0, 54, 0, 0, 0, 55, 56, 57, + 0, 58, 59, 60, 61, 62, 63, 64, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 11, 74, 75, 76, 77, 0, 78, 0, 79, + 80, 0, 81, 0, 82, 83, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, + 31, 32, 33, 34, 35, 0, 36, 0, 0, 0, + 37, 38, 39, 40, 0, 41, 0, 42, 0, 43, + 0, 0, 44, 0, 0, 0, 45, 46, 47, 48, + 0, 50, 51, 0, 0, 52, 0, 0, 54, 0, + 0, 0, 55, 56, 57, 0, 58, 59, 60, 564, + 62, 63, 64, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 11, 125, 75, 76, + 77, 0, 78, 0, 79, 80, 0, 81, 0, 82, + 83, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, 31, 32, 33, 34, 35, 0, 36, 0, 0, 0, 37, 38, 39, 40, 0, 41, 0, 42, 0, 43, 0, 0, 44, 0, 0, 0, 45, 46, 47, 48, 0, 50, 51, 0, 0, - 52, 0, 0, 54, 0, 0, 0, 55, 56, 57, - 0, 58, 59, 60, 560, 62, 63, 64, 0, 0, + 52, 0, 0, 54, 0, 0, 0, 0, 0, 57, + 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, - 72, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 0, 0, 125, 75, 76, 77, 0, 78, 0, 79, - 80, 0, 81, 0, 82, 83, 5, 6, 7, 8, - 9, 0, 0, 0, 0, 10, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, - 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 0, 0, 0, 31, 32, 33, 34, 35, 0, 36, - 0, 0, 0, 37, 38, 39, 40, 0, 41, 0, - 42, 0, 43, 0, 0, 44, 0, 0, 0, 45, - 46, 47, 48, 0, 50, 51, 0, 0, 52, 0, - 0, 54, 0, 0, 0, 0, 0, 57, 0, 58, - 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 66, 0, 67, 68, 69, 70, 71, 72, 0, - 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, - 125, 75, 76, 77, 0, 78, 0, 79, 80, 0, - 81, 0, 82, 83, 5, 6, 7, 8, 9, 0, - 0, 0, 0, 10, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 744, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, - 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 0, 0, - 0, 31, 32, 33, 34, 35, 0, 36, 0, 0, - 0, 37, 38, 39, 40, 0, 41, 0, 42, 0, - 43, 0, 0, 44, 0, 0, 0, 45, 46, 47, - 48, 0, 50, 51, 0, 0, 52, 0, 0, 54, - 0, 0, 0, 0, 0, 57, 0, 58, 59, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, - 0, 67, 68, 69, 70, 71, 72, 0, 0, 0, - 0, 0, 0, 73, 0, 0, 0, 0, 125, 75, - 76, 77, 0, 78, 0, 79, 80, 0, 81, 0, - 82, 83, 5, 6, 7, 8, 9, 0, 0, 0, - 0, 10, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 990, 0, 0, 0, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 11, 125, 75, 76, 77, 0, 78, 0, 79, + 80, 0, 81, 0, 82, 83, 748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 0, 0, 0, 31, - 32, 33, 34, 35, 0, 36, 0, 0, 0, 37, - 38, 39, 40, 0, 41, 0, 42, 0, 43, 0, - 0, 44, 0, 0, 0, 45, 46, 47, 48, 0, - 50, 51, 0, 0, 52, 0, 0, 54, 0, 0, - 0, 0, 0, 57, 0, 58, 59, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, - 68, 69, 70, 71, 72, 0, 0, 0, 0, 0, - 0, 73, 0, 0, 0, 0, 125, 75, 76, 77, - 0, 78, 0, 79, 80, 0, 81, 0, 82, 83, - 5, 6, 7, 8, 9, 0, 0, 0, 0, 10, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1040, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 0, 0, 0, 31, 32, 33, - 34, 35, 0, 36, 0, 0, 0, 37, 38, 39, - 40, 0, 41, 0, 42, 0, 43, 0, 0, 44, - 0, 0, 0, 45, 46, 47, 48, 0, 50, 51, - 0, 0, 52, 0, 0, 54, 0, 0, 0, 0, - 0, 57, 0, 58, 59, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 65, 66, 0, 67, 68, 69, - 70, 71, 72, 5, 6, 7, 8, 9, 0, 73, - 0, 0, 10, 11, 125, 75, 76, 77, 0, 78, - 0, 79, 80, 0, 81, 0, 82, 83, 0, 0, + 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, + 31, 32, 33, 34, 35, 0, 36, 0, 0, 0, + 37, 38, 39, 40, 0, 41, 0, 42, 0, 43, + 0, 0, 44, 0, 0, 0, 45, 46, 47, 48, + 0, 50, 51, 0, 0, 52, 0, 0, 54, 0, + 0, 0, 0, 0, 57, 0, 58, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 11, 125, 75, 76, + 77, 0, 78, 0, 79, 80, 0, 81, 0, 82, + 83, 994, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 30, 0, 0, 0, 31, 32, 33, 34, 35, + 0, 36, 0, 0, 0, 37, 38, 39, 40, 0, + 41, 0, 42, 0, 43, 0, 0, 44, 0, 0, + 0, 45, 46, 47, 48, 0, 50, 51, 0, 0, + 52, 0, 0, 54, 0, 0, 0, 0, 0, 57, + 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 11, 125, 75, 76, 77, 0, 78, 0, 79, + 80, 0, 81, 0, 82, 83, 1044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, - 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 30, 0, 0, 0, 31, 32, 33, 34, 35, 0, 36, 0, 0, 0, 37, 38, 39, 40, 0, 41, 0, 42, 0, 43, 0, 0, 44, 0, 0, 0, 45, 46, 47, 48, @@ -1890,69 +1906,97 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 57, 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, - 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 9, 0, 73, 0, 0, 10, 11, 125, 75, 76, 77, 0, 78, 0, 79, 80, 0, 81, 0, 82, - 83, 0, 0, 0, 0, 808, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, - 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, - 0, 0, 0, 31, 32, 123, 34, 35, 0, 0, - 0, 0, 0, 37, 0, 262, 263, 264, 265, 266, + 83, -589, -589, -589, -589, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 30, 0, 0, 0, 31, 32, 33, 34, 35, + 0, 36, 0, 0, 0, 37, 38, 39, 40, 0, + 41, 0, 42, 0, 43, 0, 0, 44, 0, 0, + 0, 45, 46, 47, 48, 0, 50, 51, 0, 0, + 52, 0, 0, 54, 0, 0, 0, 0, 0, 57, + 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 11, 125, 75, 76, 77, 0, 78, 0, 79, + 80, 0, 81, 0, 82, 83, 0, 0, 0, 0, + 0, 570, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 48, + 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 571, 78, 572, 0, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 812, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, + 0, 0, 0, 0, 0, 37, -589, -589, -589, -589, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 48, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, - 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 66, 0, 67, 68, 69, 70, 71, 72, 5, - 6, 7, 8, 9, 0, 73, 0, 0, 10, 122, - 125, 75, 76, 77, 809, 78, 0, 0, 0, 0, - 81, 0, 82, 83, 0, 0, 0, 0, 157, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, - 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 0, 0, 0, 0, 31, 32, 123, 34, - 35, 0, 0, 0, 0, 0, 37, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 665, 48, 0, 0, 0, 0, + 277, 278, 0, 279, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 280, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 122, 125, 75, 76, 77, 813, 78, 0, 0, + 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, + 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124, 0, 0, 59, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 65, 66, 0, 67, 68, 69, 70, - 71, 72, 5, 6, 7, 8, 9, 0, 73, 0, - 0, 10, 122, 125, 75, 76, 77, 0, 78, 0, - 0, 0, 0, 81, 0, 82, 83, 0, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 0, 78, 0, 0, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, + 0, 0, 0, 0, 0, 37, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 122, 125, 75, 76, 77, 0, 78, 0, 187, + 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 0, 0, 0, 0, 31, - 32, 123, 34, 35, 0, 0, 0, 0, 0, 37, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 0, 279, 48, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 124, 0, 0, 59, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, - 68, 69, 70, 71, 72, 5, 6, 7, 8, 9, - 0, 73, 0, 0, 10, 122, 125, 75, 76, 77, - 0, 78, 0, 187, 0, 0, 81, 0, 82, 83, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, - 0, 14, 0, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, - 0, 0, 31, 32, 123, 34, 35, 0, 0, 0, - 0, 0, 37, -587, -587, -587, -587, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, - 279, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 124, 0, 0, 59, - 60, 0, 0, 0, 0, 0, 0, 0, 0, 65, - 66, 0, 67, 68, 69, 70, 71, 72, 5, 6, - 7, 8, 9, 0, 73, 0, 0, 10, 122, 125, - 75, 76, 77, 0, 78, 0, 189, 0, 0, 81, - 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, - 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 0, 78, 0, 189, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, - 0, 0, 0, 0, 0, 37, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 665, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, @@ -1960,62 +2004,63 @@ static const yytype_int16 yytable[] = 10, 11, 125, 75, 76, 77, 0, 78, 0, 193, 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 13, 0, 0, 0, 0, 14, 0, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 0, 0, 0, 0, 31, 32, - 123, 34, 35, 0, 0, 0, 0, 0, 37, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 665, 0, 0, 48, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 124, 0, 0, 59, 60, 0, 0, 0, - 0, 0, 0, 0, 0, 65, 66, 0, 67, 68, - 69, 70, 71, 72, 5, 6, 7, 8, 9, 0, - 73, 0, 0, 10, 122, 125, 75, 76, 77, 0, - 78, 324, 0, 0, 0, 81, 0, 82, 83, 0, - 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, - 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, - 0, 31, 32, 123, 34, 35, 0, 0, 0, 0, - 0, 37, -587, -587, -587, -587, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 124, 0, 0, 59, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, - 0, 67, 68, 69, 70, 71, 72, 5, 6, 7, - 8, 9, 0, 73, 0, 0, 10, 122, 125, 75, - 76, 77, 0, 78, 0, 0, 0, 0, 81, 0, - 82, 83, 0, 0, 0, 0, 476, 0, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 0, 78, 326, 0, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 0, 0, 0, 0, 31, 32, 123, 34, 35, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, - 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, - 0, 65, 66, 0, 67, 68, 69, 70, 71, 72, - 5, 6, 7, 8, 9, 0, 73, 0, 0, 10, - 122, 125, 75, 76, 77, 0, 78, 0, 0, 0, - 0, 81, 0, 82, 83, 0, 0, 0, 0, 478, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 0, 0, 0, 0, 31, 32, 123, - 34, 35, 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 122, 125, 75, 76, 77, 0, 78, 0, 0, + 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, + 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 0, 78, 0, 0, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 482, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 124, 0, 0, 59, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 65, 66, 0, 67, 68, 69, - 70, 71, 72, 5, 6, 7, 8, 9, 0, 73, - 0, 0, 10, 122, 125, 75, 76, 77, 0, 78, - 0, 0, 0, 0, 81, 0, 82, 83, 0, 0, - 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, - 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 122, 125, 75, 76, 77, 0, 78, 0, 0, + 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, + 0, 732, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, @@ -2026,892 +2071,926 @@ static const yytype_int16 yytable[] = 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, 77, 0, 78, 0, 0, 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, - 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, - 0, 0, 0, 31, 32, 123, 34, 35, 0, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, - 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 66, 0, 67, 68, 69, 70, 71, 72, 5, - 6, 7, 8, 9, 0, 73, 0, 0, 10, 11, - 125, 75, 76, 77, 0, 78, 0, 0, 0, 0, - 81, 0, 82, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, - 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 0, 0, 0, 0, 31, 32, 123, 34, - 35, 0, 0, 0, 0, 0, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 34, 35, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124, 0, 0, 59, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 65, 66, 0, 67, 68, 69, 70, - 71, 72, 5, 6, 7, 8, 9, 0, 73, 0, - 0, 10, 122, 125, 75, 76, 77, 0, 78, 0, - 0, 0, 0, 81, 0, 82, 83, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 5, 6, 7, 8, 9, 0, 73, 0, 0, + 10, 11, 125, 75, 76, 77, 0, 78, 0, 0, + 0, 0, 81, 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 0, 0, 0, 0, 31, - 32, 123, 385, 35, 0, 0, 0, 0, 0, 37, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 25, 0, 26, 27, 28, 29, 0, 0, 0, 0, + 31, 32, 123, 34, 35, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 124, 0, 0, 59, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 66, 0, 67, - 68, 69, 70, 71, 72, 0, 0, 0, 0, 0, - 0, 73, 0, 254, 255, 256, 125, 75, 76, 77, - 0, 78, 0, 0, 0, 0, 81, 0, 82, 83, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 0, 279, 254, 255, 256, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 5, 6, 7, 8, + 9, 0, 73, 0, 0, 10, 122, 125, 75, 76, + 77, 0, 78, 0, 0, 0, 0, 81, 0, 82, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, + 0, 0, 0, 14, 0, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 0, 26, 27, 28, + 29, 0, 0, 0, 0, 31, 32, 123, 387, 35, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 0, 67, 68, 69, 70, 71, + 72, 0, 0, 0, 0, 0, 0, 73, 254, 255, + 256, 0, 125, 75, 76, 77, 0, 78, 0, 0, + 0, 0, 81, 0, 82, 83, 257, 0, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, + 279, 254, 255, 256, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 0, 0, 0, 0, 0, 0, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 0, 279, 254, 255, 256, 0, 0, 0, + 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 257, 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 0, 279, 254, 255, 256, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 0, 279, 0, - 0, 0, 0, 0, 254, 255, 256, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 799, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 553, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 0, 279, 254, 255, - 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 565, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, - 0, 0, 0, 254, 255, 256, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 257, 606, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 0, 279, 0, 0, 254, 255, 256, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 674, 257, 848, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 0, 279, 254, - 255, 256, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 716, 257, 0, 258, 259, + 274, 275, 276, 277, 278, 0, 279, 0, 254, 255, + 256, 0, 0, 0, 0, 0, 0, 0, 280, 0, + 0, 0, 0, 0, 0, 0, 257, 557, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, - 279, 0, 254, 255, 256, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 903, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 279, 254, 255, 256, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 0, 0, 0, 0, 0, 0, 257, + 569, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 849, 258, 259, 260, 261, 262, 263, 264, + 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, + 0, 0, 257, 610, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 0, 279, 0, 0, 0, + 254, 255, 256, 0, 0, 0, 0, 0, 280, 0, + 0, 0, 0, 0, 0, 0, 0, 678, 257, 852, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 0, 279, 254, 255, 256, 0, 0, 0, 0, + 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, + 720, 257, 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, + 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, + 0, 0, 0, 907, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 0, 279, 0, + 254, 255, 256, 0, 0, 0, 0, 0, 0, 0, + 280, 0, 0, 0, 0, 0, 0, 853, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 0, 279, 254, 255, 256, 0, 0, 0, 0, + 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, + 281, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, + 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, + 0, 0, 0, 342, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 0, 279, 0, + 254, 255, 256, 0, 0, 0, 0, 0, 0, 0, + 280, 0, 0, 0, 0, 0, 0, 343, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 0, 279, 645, 646, 647, 0, 0, 0, 0, + 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, + 349, 648, 0, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 0, 254, 255, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 257, 280, 258, 259, 260, 261, 262, + 0, 0, 400, 257, 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, 0, 254, - 255, 256, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 257, 340, 258, 259, + 255, 256, 0, 0, 0, 0, 0, 0, 0, 280, + 0, 0, 0, 0, 0, 0, 475, 257, 0, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 280, 0, 254, 255, 256, 0, 763, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 257, 307, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 0, 279, 0, 505, + 506, 0, 0, 0, 0, 507, 0, 508, 0, 280, + 0, 0, 0, 0, 0, 0, 0, 0, 315, 509, + 0, 0, 0, 0, 505, 506, 0, 31, 32, 123, + 507, 0, 508, 0, 0, 0, 0, 510, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 32, 123, 0, 0, 0, 0, 0, + 0, 0, 510, 0, 0, 0, 0, 0, 0, 0, + 0, 148, 0, 0, 613, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 511, 0, 512, 68, 69, + 70, 71, 72, 0, 0, 0, 148, 0, 0, 513, + 0, 0, 0, 0, 514, 75, 76, 515, 0, 516, + 0, 0, 512, 68, 69, 70, 71, 72, 254, 255, + 256, 0, 0, 0, 513, 0, 0, 0, 0, 514, + 75, 76, 515, 0, 516, 0, 257, 724, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 341, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 0, 279, 641, 642, 643, 0, 0, 0, 0, + 0, 0, 280, 0, 0, 0, 0, 0, 0, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 0, 279, 255, 256, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, + 0, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 256, 279, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, + 257, 0, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 0, 279, 645, 646, 647, 0, 0, + 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, + 0, 0, 0, 648, 860, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 645, 646, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 644, 347, 645, 646, 647, 648, 649, 650, 651, 652, + 0, 0, 0, 0, 648, 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 665, 0, 0, 765, 0, 0, 0, 0, + 663, 664, 665, 666, 667, 668, 669, 646, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 501, 502, 398, 0, 0, 0, 503, 0, 504, + 0, 0, 0, 0, 648, 0, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, - 123, 0, 254, 255, 256, 0, 0, 0, 506, 0, - 0, 0, 0, 0, 0, 471, 0, 0, 0, 257, - 0, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 148, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 508, 68, - 69, 70, 71, 72, 254, 255, 256, 0, 0, 0, - 509, 0, 0, 0, 0, 510, 75, 76, 511, 0, - 512, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 0, 0, 648, 0, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 257, 0, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, + 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 0, 279, 254, 255, 256, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, - 0, 0, 0, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 0, 279, 501, 502, - 0, 0, 0, 0, 503, 0, 504, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, - 0, 0, 501, 502, 0, 31, 32, 123, 503, 0, - 504, 313, 0, 0, 0, 506, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 32, 123, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, - 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 507, 0, 508, 68, 69, 70, 71, - 72, 0, 0, 148, 0, 0, 0, 509, 0, 0, - 0, 0, 510, 75, 76, 511, 0, 512, 0, 508, - 68, 69, 70, 71, 72, 254, 255, 256, 0, 0, - 0, 509, 0, 0, 0, 0, 510, 75, 76, 511, - 0, 512, 257, 720, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 0, 279, 254, 255, 256, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 0, 279, 255, - 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 257, 0, 258, 259, 260, + 275, 276, 277, 278, 0, 279, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 280, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, - 641, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 644, 856, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 641, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 644, 0, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, - 642, 643, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 644, 0, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 644, 0, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 665, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 0, 279, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 644, 279, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 0, 279, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 0, 279, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665 + 0, 280, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 0, 279, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 280, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669 }; static const yytype_int16 yycheck[] = { - 24, 25, 126, 242, 28, 253, 485, 29, 30, 28, - 4, 476, 279, 478, 617, 620, 392, 8, 499, 28, - 8, 676, 44, 8, 4, 8, 8, 27, 72, 53, - 27, 795, 8, 8, 62, 62, 803, 8, 8, 62, - 8, 8, 11, 8, 8, 62, 248, 249, 296, 8, - 74, 8, 707, 77, 8, 887, 295, 8, 62, 8, - 8, 309, 310, 57, 8, 8, 62, 74, 93, 94, - 95, 319, 146, 321, 346, 0, 150, 78, 91, 74, - 79, 50, 0, 91, 74, 74, 146, 146, 72, 213, - 150, 150, 152, 152, 152, 297, 146, 299, 125, 152, - 150, 566, 125, 147, 99, 152, 150, 5, 6, 118, - 8, 9, 10, 11, 12, 13, 14, 15, 146, 17, - 18, 19, 20, 21, 22, 23, 150, 155, 26, 27, - 124, 156, 62, 157, 901, 152, 120, 150, 155, 163, - 38, 74, 150, 624, 143, 626, 79, 45, 46, 913, - 157, 155, 50, 74, 52, 155, 395, 154, 72, 155, - 182, 72, 171, 154, 155, 932, 154, 157, 157, 154, - 153, 172, 154, 343, 175, 199, 200, 201, 154, 154, - 78, 557, 206, 154, 154, 62, 154, 154, 153, 153, - 214, 72, 32, 74, 153, 365, 153, 1029, 64, 153, - 224, 181, 153, 227, 153, 153, 72, 32, 74, 153, - 153, 144, 145, 415, 486, 184, 146, 72, 72, 72, - 468, 74, 152, 144, 145, 155, 62, 160, 72, 72, - 72, 129, 74, 114, 74, 840, 150, 485, 27, 150, - 91, 155, 140, 152, 253, 152, 215, 216, 114, 74, - 72, 62, 74, 72, 91, 279, 99, 100, 60, 61, - 279, 114, 72, 728, 74, 28, 147, 91, 91, 150, - 279, 72, 114, 74, 172, 72, 157, 175, 94, 95, - 178, 147, 120, 307, 150, 183, 184, 296, 120, 125, - 152, 157, 147, 317, 147, 150, 150, 150, 120, 150, - 309, 310, 155, 152, 157, 147, 150, 150, 150, 912, - 319, 152, 321, 150, 125, 157, 555, 215, 216, 343, - 72, 219, 152, 802, 348, 223, 150, 150, 352, 596, - 67, 68, 69, 155, 358, 157, 305, 235, 153, 154, - 156, 365, 614, 808, 152, 155, 326, 157, 587, 588, - 248, 249, 152, 74, 155, 379, 157, 255, 79, 598, - 599, 155, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 67, 68, 69, 408, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 1052, 154, 297, - 74, 299, 300, 573, 405, 79, 400, 305, 24, 25, - 153, 154, 28, 422, 72, 313, 74, 315, 67, 68, - 400, 72, 143, 144, 145, 904, 450, 72, 93, 94, - 95, 329, 62, 8, 146, 62, 405, 72, 150, 14, + 24, 25, 126, 28, 28, 24, 25, 489, 4, 28, + 621, 680, 253, 11, 279, 29, 30, 480, 624, 482, + 891, 78, 394, 8, 4, 8, 8, 799, 64, 53, + 44, 8, 345, 8, 807, 8, 28, 248, 249, 503, + 8, 28, 711, 8, 8, 8, 74, 8, 64, 64, + 74, 8, 50, 77, 367, 8, 28, 298, 81, 33, + 8, 57, 8, 8, 242, 8, 8, 8, 8, 8, + 311, 312, 253, 95, 96, 97, 93, 28, 0, 74, + 321, 51, 323, 76, 155, 156, 76, 148, 299, 213, + 301, 152, 148, 63, 0, 74, 152, 76, 154, 148, + 410, 154, 76, 152, 33, 154, 154, 570, 101, 47, + 48, 49, 148, 51, 154, 172, 76, 298, 175, 297, + 28, 157, 145, 154, 152, 63, 150, 122, 124, 157, + 311, 312, 905, 157, 154, 152, 158, 64, 157, 163, + 76, 157, 157, 8, 74, 917, 64, 76, 64, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 621, 476, 62, 478, 32, 114, 94, 95, 468, - 24, 25, 360, 32, 28, 72, 67, 68, 74, 127, - 144, 145, 744, 79, 154, 155, 485, 501, 502, 503, - 504, 505, 93, 94, 95, 60, 61, 511, 512, 147, - 253, 156, 150, 128, 129, 72, 74, 74, 74, 157, - 524, 79, 146, 79, 528, 675, 150, 405, 152, 24, - 25, 491, 147, 408, 538, 150, 279, 415, 153, 156, - 418, 128, 129, 146, 726, 423, 146, 425, 62, 427, - 428, 429, 74, 296, 46, 47, 48, 114, 144, 145, - 147, 157, 566, 150, 221, 125, 309, 310, 225, 573, - 127, 575, 82, 83, 802, 579, 319, 150, 321, 236, - 584, 238, 239, 240, 99, 143, 144, 145, 144, 145, - 147, 150, 596, 150, 50, 154, 155, 596, 153, 72, - 157, 74, 75, 753, 150, 755, 825, 596, 146, 713, - 206, 613, 146, 157, 8, 619, 620, 621, 214, 801, - 150, 143, 144, 145, 150, 253, 158, 146, 224, 146, - 27, 635, 125, 637, 93, 94, 95, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 25, 26, 1033, 936, 628, 74, 630, 118, 182, 159, + 157, 156, 157, 156, 156, 199, 200, 201, 157, 156, + 159, 156, 206, 156, 156, 33, 184, 206, 156, 561, + 214, 156, 156, 156, 155, 214, 61, 62, 155, 159, + 224, 181, 155, 227, 64, 224, 417, 155, 74, 155, + 155, 127, 155, 155, 155, 155, 155, 215, 216, 397, + 171, 148, 152, 159, 66, 74, 74, 154, 76, 64, + 157, 472, 74, 148, 76, 74, 154, 152, 844, 157, + 74, 64, 76, 152, 74, 24, 25, 148, 489, 28, + 122, 152, 76, 154, 279, 279, 74, 81, 76, 74, + 279, 253, 101, 102, 577, 96, 97, 127, 116, 732, + 95, 96, 97, 583, 116, 152, 74, 61, 62, 156, + 157, 129, 116, 149, 122, 309, 152, 279, 76, 74, + 155, 154, 127, 81, 74, 319, 76, 154, 74, 154, + 76, 149, 253, 152, 152, 916, 298, 149, 154, 307, + 152, 159, 625, 152, 74, 149, 76, 159, 152, 311, + 312, 345, 146, 147, 806, 159, 350, 158, 279, 321, + 354, 323, 74, 158, 76, 600, 360, 74, 162, 157, + 116, 159, 122, 367, 154, 130, 131, 298, 328, 812, + 407, 149, 93, 129, 152, 154, 116, 381, 146, 147, + 311, 312, 381, 74, 149, 64, 679, 152, 76, 156, + 321, 76, 323, 149, 116, 157, 152, 157, 157, 159, + 76, 559, 64, 159, 93, 81, 410, 1056, 74, 149, + 96, 97, 152, 130, 131, 76, 706, 157, 76, 159, + 81, 93, 74, 81, 76, 77, 402, 149, 93, 407, + 152, 152, 149, 591, 592, 152, 76, 159, 155, 93, + 74, 81, 402, 64, 602, 603, 908, 206, 127, 453, + 155, 156, 148, 33, 453, 214, 152, 145, 146, 147, + 64, 146, 147, 152, 757, 224, 759, 69, 70, 145, + 146, 147, 158, 69, 70, 71, 480, 148, 482, 148, + 152, 480, 64, 482, 145, 146, 147, 152, 146, 147, + 95, 96, 97, 424, 47, 48, 49, 127, 152, 152, + 472, 505, 506, 507, 508, 509, 146, 147, 95, 96, + 97, 515, 516, 69, 70, 221, 101, 489, 63, 225, + 279, 69, 70, 71, 528, 156, 157, 152, 532, 819, + 236, 148, 238, 239, 240, 495, 102, 148, 542, 730, + 160, 472, 108, 542, 8, 111, 112, 113, 114, 115, + 116, 117, 24, 25, 847, 82, 83, 348, 489, 44, + 45, 46, 47, 48, 49, 127, 570, 148, 152, 152, + 148, 570, 28, 577, 14, 579, 14, 154, 157, 583, + 156, 156, 155, 155, 588, 806, 345, 155, 878, 158, + 161, 74, 158, 154, 74, 600, 600, 125, 74, 64, + 28, 600, 111, 112, 113, 114, 115, 116, 367, 160, + 85, 8, 156, 717, 805, 93, 74, 74, 155, 623, + 624, 625, 381, 617, 623, 624, 76, 156, 600, 155, + 74, 64, 14, 926, 158, 639, 125, 641, 928, 160, + 160, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 206, 623, 152, 154, 14, 154, 296, 921, - 214, 675, 676, 155, 552, 14, 904, 681, 153, 153, - 224, 309, 310, 279, 866, 153, 156, 159, 72, 567, - 942, 152, 944, 843, 72, 11, 700, 123, 702, 951, - 72, 62, 83, 707, 579, 27, 158, 959, 24, 25, - 154, 8, 964, 72, 592, 91, 898, 899, 43, 44, - 45, 46, 47, 48, 728, 468, 72, 74, 153, 153, - 679, 609, 154, 737, 50, 279, 62, 72, 990, 617, - 618, 156, 485, 99, 996, 14, 123, 696, 158, 753, - 158, 755, 152, 109, 110, 111, 112, 113, 114, 152, - 152, 765, 152, 158, 100, 46, 47, 48, 1020, 50, - 106, 158, 922, 109, 110, 111, 112, 113, 114, 115, - 14, 154, 150, 379, 154, 152, 146, 156, 1040, 72, - 72, 795, 72, 43, 44, 45, 46, 47, 48, 343, - 50, 679, 14, 152, 808, 156, 124, 150, 152, 154, - 1062, 815, 152, 802, 155, 819, 1068, 967, 696, 153, - 156, 365, 152, 72, 126, 158, 158, 702, 8, 143, - 832, 981, 103, 1085, 938, 379, 840, 72, 14, 843, - 72, 157, 109, 110, 111, 112, 113, 114, 726, 727, - 158, 156, 856, 596, 450, 153, 155, 8, 153, 1009, - 8, 152, 154, 1013, 84, 154, 152, 126, 184, 14, - 874, 749, 156, 833, 152, 154, 153, 153, 125, 154, - 476, 153, 478, 106, 62, 151, 125, 62, 158, 154, - 206, 153, 153, 90, 154, 126, 104, 155, 214, 215, - 216, 1051, 72, 158, 906, 74, 450, 152, 224, 913, - 27, 155, 886, 69, 154, 904, 158, 155, 922, 797, - 924, 14, 74, 801, 14, 72, 27, 154, 158, 158, - 155, 809, 476, 14, 478, 153, 72, 14, 8, 156, - 815, 74, 538, 821, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 156, 501, 502, 503, - 504, 505, 69, 967, 968, 74, 970, 156, 512, 100, - 566, 91, 156, 154, 146, 106, 91, 981, 109, 110, - 111, 112, 113, 114, 115, 107, 154, 74, 866, 305, - 60, 61, 88, 953, 538, 153, 156, 72, 1002, 874, - 596, 14, 152, 74, 72, 1009, 72, 8, 154, 1013, - 86, 155, 153, 156, 154, 103, 74, 156, 152, 156, - 898, 899, 566, 619, 620, 156, 1030, 153, 343, 573, - 155, 358, 528, 524, 912, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 1051, 1052, 924, - 365, 1076, 596, 538, 1058, 702, 741, 957, 400, 802, - 847, 1021, 400, 379, 819, 814, 1002, 363, 78, 867, - 859, 822, 635, 634, 1078, 619, 620, 621, 206, 930, - 681, 60, 61, 153, 219, 681, 679, -1, -1, 405, - -1, 635, -1, 968, -1, 970, -1, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 664, 665, 666, 667, 668, 669, 154, 627, 154, 600, + 154, 829, 154, 160, 14, 679, 680, 156, 971, 870, + 154, 685, 972, 160, 974, 156, 685, 908, 148, 152, + 158, 74, 985, 74, 453, 74, 14, 156, 160, 490, + 704, 154, 706, 154, 158, 683, 154, 711, 155, 152, + 126, 902, 903, 154, 74, 157, 1006, 128, 8, 145, + 1013, 480, 700, 482, 1017, 160, 74, 105, 732, 74, + 14, 160, 155, 732, 158, 157, 8, 741, 155, 8, + 154, 156, 741, 86, 1034, 154, 505, 506, 507, 508, + 509, 156, 128, 757, 156, 759, 14, 516, 158, 155, + 154, 127, 1055, 155, 102, 769, 156, 155, 153, 108, + 108, 64, 1062, 111, 112, 113, 114, 115, 116, 117, + 160, 64, 156, 542, 44, 45, 46, 47, 48, 49, + 127, 51, 1082, 155, 155, 799, 92, 156, 128, 106, + 799, 74, 160, 63, 157, 154, 157, 28, 812, 76, + 71, 570, 156, 812, 160, 819, 157, 14, 577, 823, + 158, 76, 74, 14, 160, 160, 28, 618, 156, 155, + 157, 14, 74, 14, 806, 158, 101, 76, 942, 158, + 844, 600, 836, 847, 71, 844, 111, 112, 113, 114, + 115, 116, 76, 158, 158, 93, 860, 156, 93, 109, + 148, 156, 76, 155, 623, 624, 625, 90, 74, 158, + 14, 76, 154, 74, 878, 806, 156, 837, 74, 8, + 639, 88, 157, 105, 155, 155, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 156, 158, 917, 890, 158, 910, 154, 917, 76, + 679, 157, 926, 360, 928, 158, 685, 528, 1080, 532, + 542, 706, 402, 402, 961, 365, 908, 745, 851, 823, + 818, 11, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 24, 25, 1006, 748, 78, 871, + 863, 826, 639, 638, 683, 206, 934, 971, 972, 685, + 974, 219, -1, 732, -1, -1, -1, 908, 8, -1, + 50, 985, 741, -1, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 957, 757, -1, + 759, -1, 1006, -1, -1, -1, -1, -1, -1, 1013, + 769, -1, -1, 1017, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, + 1034, 61, 62, -1, -1, -1, -1, -1, -1, -1, + 799, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1055, 1056, 812, -1, -1, -1, -1, 1062, -1, + -1, 61, 62, -1, -1, 1025, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1082, -1, + -1, -1, -1, -1, -1, 844, -1, 157, 847, -1, + 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, + 15, 860, 17, 18, 19, 20, 21, 22, 23, -1, + -1, 26, 27, -1, 184, -1, -1, -1, -1, -1, + -1, -1, -1, 38, -1, 155, -1, -1, -1, -1, + 45, 46, -1, -1, 925, 50, 206, 52, -1, -1, + -1, -1, -1, -1, 214, 215, 216, -1, -1, -1, + -1, -1, -1, -1, 224, 946, 156, 948, 917, -1, + -1, -1, -1, 78, 955, -1, -1, 926, -1, -1, + -1, -1, 963, -1, 8, -1, -1, 968, -1, -1, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 994, -1, -1, -1, -1, -1, 1000, + -1, -1, 971, -1, 129, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 140, 985, 61, 62, -1, + -1, -1, -1, 1024, -1, -1, -1, 307, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, -1, -1, 1044, 1013, -1, -1, 172, 1017, -1, + 175, 345, -1, 178, -1, -1, -1, -1, 183, 184, + -1, -1, -1, -1, -1, 1066, -1, -1, -1, -1, + -1, 1072, -1, 367, -1, 61, 62, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1055, -1, 1089, -1, + 215, 216, -1, -1, 219, -1, -1, -1, 223, -1, + -1, 381, -1, -1, -1, -1, -1, 93, -1, -1, + 235, 155, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 248, 249, -1, -1, 407, -1, -1, + 255, -1, -1, -1, -1, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, -1, 280, -1, -1, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, -1, 453, 299, -1, 301, 302, -1, -1, + -1, -1, 307, -1, -1, -1, -1, -1, -1, -1, + 315, -1, 317, -1, -1, -1, -1, -1, -1, -1, + 480, -1, 482, -1, -1, -1, 331, -1, -1, -1, + -1, 505, 506, 507, 508, 509, -1, -1, -1, -1, + -1, -1, 516, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 362, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 542, -1, -1, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, + -1, -1, 407, 577, -1, 61, 62, -1, -1, -1, + 570, -1, 417, -1, -1, 420, -1, -1, -1, -1, + 425, -1, 427, -1, 429, 430, 431, -1, -1, -1, + -1, -1, 61, 62, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, -1, -1, + -1, 625, -1, -1, -1, -1, -1, -1, -1, 63, + -1, -1, -1, 623, 624, 639, -1, -1, -1, -1, + -1, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, -1, -1, -1, -1, -1, 1002, -1, -1, - -1, 675, 728, -1, 450, -1, -1, 681, -1, -1, - -1, 737, -1, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 1030, 50, -1, -1, -1, - 476, 904, 478, 8, -1, -1, -1, -1, -1, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -1, -1, 1058, 728, -1, 501, 502, 503, 504, - 505, -1, -1, 737, -1, -1, -1, 512, -1, 795, - -1, -1, -1, 1078, -1, -1, -1, -1, -1, 753, - -1, 755, 808, -1, -1, 60, 61, -1, -1, -1, - -1, 765, 538, -1, -1, -1, -1, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, - -1, -1, -1, -1, 840, 501, 502, 503, 504, -1, - 566, 795, -1, -1, -1, -1, 512, -1, 573, -1, - -1, -1, -1, -1, 808, -1, -1, -1, -1, -1, - -1, -1, -1, 60, 61, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 840, -1, -1, 843, - -1, -1, -1, 619, 620, -1, 621, -1, 153, -1, - -1, -1, 856, -1, -1, -1, -1, 913, -1, -1, - 635, 60, 61, -1, -1, -1, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, - 665, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 675, -1, -1, 679, -1, 681, 153, 154, -1, 913, - -1, -1, -1, -1, -1, -1, -1, -1, 922, -1, - 696, -1, -1, -1, -1, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - -1, -1, 728, -1, 153, 154, -1, -1, -1, -1, - -1, 737, -1, 967, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, -1, 981, 753, -1, - 755, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 765, -1, -1, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 1009, -1, -1, -1, 1013, - 60, 61, -1, -1, -1, -1, -1, -1, -1, 795, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 808, -1, 3, 4, 5, 6, 7, 60, - 61, 91, -1, 12, 13, -1, -1, 1051, -1, 765, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 32, 840, -1, -1, -1, 843, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, - 49, 856, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, -1, -1, -1, - -1, 70, 71, 72, 73, 74, -1, -1, -1, -1, - -1, 80, 31, 32, 33, 34, 35, 36, 37, 38, + 664, 665, 666, 667, 668, 669, -1, -1, -1, 155, + 156, -1, -1, -1, -1, 679, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, + -1, -1, -1, 683, -1, 685, 155, 156, -1, -1, + -1, -1, -1, -1, -1, 44, 45, -1, -1, -1, + 700, 50, -1, 52, -1, -1, -1, -1, -1, -1, + -1, 556, -1, 61, 62, -1, -1, 505, 506, 507, + 508, -1, -1, 72, 73, 74, 571, -1, 516, -1, + -1, -1, 732, 82, -1, -1, -1, -1, -1, -1, + -1, 741, -1, 757, -1, 759, -1, -1, -1, -1, + -1, 596, -1, -1, -1, 769, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, 613, -1, + -1, -1, -1, -1, -1, -1, 621, 622, -1, -1, + -1, -1, -1, 132, 133, 134, 135, 136, 137, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, 799, + 149, 150, 151, 152, -1, 154, -1, 155, -1, -1, + -1, -1, 812, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, -1, 847, -1, -1, -1, -1, 683, -1, + -1, -1, -1, 63, 844, -1, 860, -1, -1, -1, + -1, -1, -1, -1, -1, 700, -1, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, -1, -1, -1, 730, 731, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, 753, -1, + -1, -1, 926, -1, -1, -1, 27, 917, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, -1, 801, 971, -1, -1, + 805, -1, -1, -1, -1, -1, -1, -1, 813, -1, + -1, 985, -1, -1, -1, -1, -1, -1, -1, -1, + 825, 769, -1, -1, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, -1, -1, 1013, + -1, -1, -1, 1017, -1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 99, 50, -1, 154, -1, -1, -1, 913, -1, -1, - 856, -1, -1, -1, -1, 114, -1, 922, 117, 118, - -1, -1, -1, -1, -1, -1, -1, -1, 127, 128, - -1, 130, 131, 132, 133, 134, 135, -1, -1, -1, - -1, -1, -1, 142, -1, -1, -1, -1, 147, 148, - 149, 150, 151, 152, 153, -1, -1, -1, 157, -1, - 159, 160, 967, -1, -1, 3, 4, 5, 6, 7, - -1, -1, -1, -1, 12, 13, 981, -1, -1, -1, - -1, -1, -1, -1, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, - -1, -1, -1, -1, 1009, 43, 44, -1, 1013, -1, - -1, 49, -1, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, -1, - 60, 61, 70, 71, 72, 73, 74, -1, 76, -1, - -1, -1, 80, 81, 82, 83, 1051, 85, -1, 87, - -1, 89, -1, -1, 92, -1, -1, -1, 96, 97, - 98, 99, 100, 101, 102, -1, -1, 105, 106, -1, - 108, -1, -1, -1, 112, 113, 114, -1, 116, 117, - 118, 119, 120, 121, 122, -1, -1, -1, -1, 127, - 128, -1, 130, 131, 132, 133, 134, 135, 3, 4, - 5, 6, 7, -1, 142, -1, -1, 12, 13, 147, - 148, 149, 150, -1, 152, -1, 154, 155, -1, 157, - -1, 159, 160, 153, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, -1, -1, -1, 49, -1, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, -1, -1, -1, 70, 71, 72, 73, 74, - -1, 76, -1, -1, -1, 80, 81, 82, 83, -1, - 85, -1, 87, -1, 89, -1, -1, 92, -1, -1, - -1, 96, 97, 98, 99, -1, 101, 102, -1, -1, - 105, -1, -1, 108, -1, -1, -1, 112, 113, 114, - -1, 116, 117, 118, 119, 120, 121, 122, -1, -1, - -1, -1, 127, 128, -1, 130, 131, 132, 133, 134, - 135, -1, -1, -1, -1, -1, -1, 142, -1, -1, - -1, -1, 147, 148, 149, 150, -1, 152, -1, 154, - 155, -1, 157, -1, 159, 160, 3, 4, 5, 6, - 7, -1, -1, -1, -1, 12, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, -1, - -1, -1, 49, -1, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - -1, -1, -1, 70, 71, 72, 73, 74, -1, 76, - -1, -1, -1, 80, 81, 82, 83, -1, 85, -1, - 87, -1, 89, -1, -1, 92, -1, -1, -1, 96, - 97, 98, 99, -1, 101, 102, -1, -1, 105, -1, - -1, 108, -1, -1, -1, -1, -1, 114, -1, 116, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, - 127, 128, -1, 130, 131, 132, 133, 134, 135, -1, - -1, -1, -1, -1, -1, 142, -1, -1, -1, -1, - 147, 148, 149, 150, -1, 152, -1, 154, 155, -1, - 157, -1, 159, 160, 3, 4, 5, 6, 7, -1, - -1, -1, -1, 12, 13, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, - 49, -1, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, -1, -1, - -1, 70, 71, 72, 73, 74, -1, 76, -1, -1, - -1, 80, 81, 82, 83, -1, 85, -1, 87, -1, - 89, -1, -1, 92, -1, -1, -1, 96, 97, 98, - 99, -1, 101, 102, -1, -1, 105, -1, -1, 108, - -1, -1, -1, -1, -1, 114, -1, 116, 117, 118, - -1, -1, -1, -1, -1, -1, -1, -1, 127, 128, - -1, 130, 131, 132, 133, 134, 135, -1, -1, -1, - -1, -1, -1, 142, -1, -1, -1, -1, 147, 148, - 149, 150, -1, 152, -1, 154, 155, -1, 157, -1, - 159, 160, 3, 4, 5, 6, 7, -1, -1, -1, - -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 27, -1, -1, -1, + 49, -1, 51, -1, -1, 870, 3, 4, 5, 6, + 7, 61, 62, -1, 63, 12, 13, -1, -1, -1, + -1, 1055, -1, -1, -1, -1, -1, -1, -1, 160, + -1, -1, -1, -1, -1, -1, -1, 902, 903, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, 916, 860, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, 68, -1, -1, -1, 72, 73, 74, 75, 76, + -1, 78, -1, -1, -1, 82, 83, 84, 85, -1, + 87, -1, 89, -1, 91, -1, -1, 94, -1, -1, + -1, 98, 99, 100, 101, 102, 103, 104, -1, -1, + 107, 108, -1, 110, -1, -1, -1, 114, 115, 116, + -1, 118, 119, 120, 121, 122, 123, 124, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + 157, -1, 159, -1, 161, 162, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, 68, -1, -1, -1, + 72, 73, 74, 75, 76, -1, 78, -1, -1, -1, + 82, 83, 84, 85, -1, 87, -1, 89, -1, 91, + -1, -1, 94, -1, -1, -1, 98, 99, 100, 101, + -1, 103, 104, -1, -1, 107, -1, -1, 110, -1, + -1, -1, 114, 115, 116, -1, 118, 119, 120, 121, + 122, 123, 124, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, 156, 157, -1, 159, -1, 161, + 162, 28, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, 68, -1, -1, -1, 72, 73, 74, 75, 76, + -1, 78, -1, -1, -1, 82, 83, 84, 85, -1, + 87, -1, 89, -1, 91, -1, -1, 94, -1, -1, + -1, 98, 99, 100, 101, -1, 103, 104, -1, -1, + 107, -1, -1, 110, -1, -1, -1, -1, -1, 116, + -1, 118, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + 157, -1, 159, -1, 161, 162, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 43, 44, -1, -1, -1, -1, 49, -1, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, -1, -1, -1, 70, - 71, 72, 73, 74, -1, 76, -1, -1, -1, 80, - 81, 82, 83, -1, 85, -1, 87, -1, 89, -1, - -1, 92, -1, -1, -1, 96, 97, 98, 99, -1, - 101, 102, -1, -1, 105, -1, -1, 108, -1, -1, - -1, -1, -1, 114, -1, 116, 117, 118, -1, -1, - -1, -1, -1, -1, -1, -1, 127, 128, -1, 130, - 131, 132, 133, 134, 135, -1, -1, -1, -1, -1, - -1, 142, -1, -1, -1, -1, 147, 148, 149, 150, - -1, 152, -1, 154, 155, -1, 157, -1, 159, 160, - 3, 4, 5, 6, 7, -1, -1, -1, -1, 12, - 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 27, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, 68, -1, -1, -1, + 72, 73, 74, 75, 76, -1, 78, -1, -1, -1, + 82, 83, 84, 85, -1, 87, -1, 89, -1, 91, + -1, -1, 94, -1, -1, -1, 98, 99, 100, 101, + -1, 103, 104, -1, -1, 107, -1, -1, 110, -1, + -1, -1, -1, -1, 116, -1, 118, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, 156, 157, -1, 159, -1, 161, + 162, 28, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, 68, -1, -1, -1, 72, 73, 74, 75, 76, + -1, 78, -1, -1, -1, 82, 83, 84, 85, -1, + 87, -1, 89, -1, 91, -1, -1, 94, -1, -1, + -1, 98, 99, 100, 101, -1, 103, 104, -1, -1, + 107, -1, -1, 110, -1, -1, -1, -1, -1, 116, + -1, 118, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + 157, -1, 159, -1, 161, 162, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 43, 44, -1, -1, -1, -1, 49, -1, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, -1, -1, -1, 70, 71, 72, - 73, 74, -1, 76, -1, -1, -1, 80, 81, 82, - 83, -1, 85, -1, 87, -1, 89, -1, -1, 92, - -1, -1, -1, 96, 97, 98, 99, -1, 101, 102, - -1, -1, 105, -1, -1, 108, -1, -1, -1, -1, - -1, 114, -1, 116, 117, 118, -1, -1, -1, -1, - -1, -1, -1, -1, 127, 128, -1, 130, 131, 132, - 133, 134, 135, 3, 4, 5, 6, 7, -1, 142, - -1, -1, 12, 13, 147, 148, 149, 150, -1, 152, - -1, 154, 155, -1, 157, -1, 159, 160, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, 68, -1, -1, -1, + 72, 73, 74, 75, 76, -1, 78, -1, -1, -1, + 82, 83, 84, 85, -1, 87, -1, 89, -1, 91, + -1, -1, 94, -1, -1, -1, 98, 99, 100, 101, + -1, 103, 104, -1, -1, 107, -1, -1, 110, -1, + -1, -1, -1, -1, 116, -1, 118, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, 156, 157, -1, 159, -1, 161, + 162, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, 68, -1, -1, -1, 72, 73, 74, 75, 76, + -1, 78, -1, -1, -1, 82, 83, 84, 85, -1, + 87, -1, 89, -1, 91, -1, -1, 94, -1, -1, + -1, 98, 99, 100, 101, -1, 103, 104, -1, -1, + 107, -1, -1, 110, -1, -1, -1, -1, -1, 116, + -1, 118, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + 157, -1, 159, -1, 161, 162, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 101, + 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, 153, 154, 155, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, 153, 154, -1, -1, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, -1, -1, -1, -1, 49, - -1, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, -1, -1, -1, - 70, 71, 72, 73, 74, -1, 76, -1, -1, -1, - 80, 81, 82, 83, -1, 85, -1, 87, -1, 89, - -1, -1, 92, -1, -1, -1, 96, 97, 98, 99, - -1, 101, 102, -1, -1, 105, -1, -1, 108, -1, - -1, -1, -1, -1, 114, -1, 116, 117, 118, -1, - -1, -1, -1, -1, -1, -1, -1, 127, 128, -1, - 130, 131, 132, 133, 134, 135, 3, 4, 5, 6, - 7, -1, 142, -1, -1, 12, 13, 147, 148, 149, - 150, -1, 152, -1, 154, 155, -1, 157, -1, 159, - 160, -1, -1, -1, -1, 32, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, -1, - -1, -1, 49, -1, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, -1, - -1, -1, -1, 70, 71, 72, 73, 74, -1, -1, - -1, -1, -1, 80, -1, 32, 33, 34, 35, 36, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 99, 50, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, - 127, 128, -1, 130, 131, 132, 133, 134, 135, 3, - 4, 5, 6, 7, -1, 142, -1, -1, 12, 13, - 147, 148, 149, 150, 151, 152, -1, -1, -1, -1, - 157, -1, 159, 160, -1, -1, -1, -1, 32, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, -1, -1, -1, 49, -1, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, -1, -1, -1, -1, 70, 71, 72, 73, - 74, -1, -1, -1, -1, -1, 80, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 99, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 114, -1, -1, 117, 118, -1, -1, -1, -1, -1, - -1, -1, -1, 127, 128, -1, 130, 131, 132, 133, - 134, 135, 3, 4, 5, 6, 7, -1, 142, -1, - -1, 12, 13, 147, 148, 149, 150, -1, 152, -1, - -1, -1, -1, 157, -1, 159, 160, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 43, 44, -1, -1, -1, -1, 49, -1, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, -1, -1, -1, -1, 70, - 71, 72, 73, 74, -1, -1, -1, -1, -1, 80, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, -1, 50, 99, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 114, -1, -1, 117, 118, -1, -1, - -1, -1, -1, -1, -1, -1, 127, 128, -1, 130, - 131, 132, 133, 134, 135, 3, 4, 5, 6, 7, - -1, 142, -1, -1, 12, 13, 147, 148, 149, 150, - -1, 152, -1, 154, -1, -1, 157, -1, 159, 160, + 47, 48, 49, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 43, 44, -1, -1, -1, - -1, 49, -1, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, -1, -1, - -1, -1, 70, 71, 72, 73, 74, -1, -1, -1, - -1, -1, 80, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - 50, 99, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 114, -1, -1, 117, - 118, -1, -1, -1, -1, -1, -1, -1, -1, 127, - 128, -1, 130, 131, 132, 133, 134, 135, 3, 4, - 5, 6, 7, -1, 142, -1, -1, 12, 13, 147, - 148, 149, 150, -1, 152, -1, 154, -1, -1, 157, - -1, 159, 160, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, -1, -1, -1, 49, -1, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, -1, -1, -1, -1, 70, 71, 72, 73, 74, - -1, -1, -1, -1, -1, 80, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, -1, 99, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, - -1, -1, 117, 118, -1, -1, -1, -1, -1, -1, - -1, -1, 127, 128, -1, 130, 131, 132, 133, 134, - 135, 3, 4, 5, 6, 7, -1, 142, -1, -1, - 12, 13, 147, 148, 149, 150, -1, 152, -1, 154, - -1, -1, 157, -1, 159, 160, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, -1, -1, -1, 49, -1, 51, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, -1, -1, -1, -1, 70, 71, - 72, 73, 74, -1, -1, -1, -1, -1, 80, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, -1, -1, 99, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, -1, -1, 117, 118, -1, -1, -1, - -1, -1, -1, -1, -1, 127, 128, -1, 130, 131, - 132, 133, 134, 135, 3, 4, 5, 6, 7, -1, - 142, -1, -1, 12, 13, 147, 148, 149, 150, -1, - 152, 153, -1, -1, -1, 157, -1, 159, 160, -1, - -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, - 49, -1, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, -1, -1, -1, - -1, 70, 71, 72, 73, 74, -1, -1, -1, -1, - -1, 80, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, -1, -1, - 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 114, -1, -1, 117, 118, - -1, -1, -1, -1, -1, -1, -1, -1, 127, 128, - -1, 130, 131, 132, 133, 134, 135, 3, 4, 5, - 6, 7, -1, 142, -1, -1, 12, 13, 147, 148, - 149, 150, -1, 152, -1, -1, -1, -1, 157, -1, - 159, 160, -1, -1, -1, -1, 32, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, - -1, -1, -1, 49, -1, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - -1, -1, -1, -1, 70, 71, 72, 73, 74, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 114, -1, - -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, - -1, 127, 128, -1, 130, 131, 132, 133, 134, 135, - 3, 4, 5, 6, 7, -1, 142, -1, -1, 12, - 13, 147, 148, 149, 150, -1, 152, -1, -1, -1, - -1, 157, -1, 159, 160, -1, -1, -1, -1, 32, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, 156, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 43, 44, -1, -1, -1, -1, 49, -1, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, -1, -1, -1, -1, 70, 71, 72, - 73, 74, -1, -1, -1, -1, -1, 80, -1, -1, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, 156, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 114, -1, -1, 117, 118, -1, -1, -1, -1, - -1, -1, -1, -1, 127, 128, -1, 130, 131, 132, - 133, 134, 135, 3, 4, 5, 6, 7, -1, 142, - -1, -1, 12, 13, 147, 148, 149, 150, -1, 152, - -1, -1, -1, -1, 157, -1, 159, 160, -1, -1, - -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, -1, -1, -1, -1, 49, - -1, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, -1, -1, -1, -1, - 70, 71, 72, 73, 74, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 114, -1, -1, 117, 118, -1, - -1, -1, -1, -1, -1, -1, -1, 127, 128, -1, - 130, 131, 132, 133, 134, 135, 3, 4, 5, 6, - 7, -1, 142, -1, -1, 12, 13, 147, 148, 149, - 150, -1, 152, -1, -1, -1, -1, 157, -1, 159, - 160, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, -1, - -1, -1, 49, -1, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, -1, - -1, -1, -1, 70, 71, 72, 73, 74, -1, -1, - -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, -1, -1, - 117, 118, -1, -1, -1, -1, -1, -1, -1, -1, - 127, 128, -1, 130, 131, 132, 133, 134, 135, 3, - 4, 5, 6, 7, -1, 142, -1, -1, 12, 13, - 147, 148, 149, 150, -1, 152, -1, -1, -1, -1, - 157, -1, 159, 160, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, -1, -1, -1, 49, -1, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, -1, -1, -1, -1, 70, 71, 72, 73, - 74, -1, -1, -1, -1, -1, 80, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, 155, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, -1, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 114, -1, -1, 117, 118, -1, -1, -1, -1, -1, - -1, -1, -1, 127, 128, -1, 130, 131, 132, 133, - 134, 135, 3, 4, 5, 6, 7, -1, 142, -1, - -1, 12, 13, 147, 148, 149, 150, -1, 152, -1, - -1, -1, -1, 157, -1, 159, 160, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 43, 44, -1, -1, -1, -1, 49, -1, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, -1, -1, -1, -1, 70, - 71, 72, 73, 74, -1, -1, -1, -1, -1, 80, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, -1, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 114, -1, -1, 117, 118, -1, -1, - -1, -1, -1, -1, -1, -1, 127, 128, -1, 130, - 131, 132, 133, 134, 135, -1, -1, -1, -1, -1, - -1, 142, -1, 9, 10, 11, 147, 148, 149, 150, - -1, 152, -1, -1, -1, -1, 157, -1, 159, 160, - 26, -1, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, -1, 50, 9, 10, 11, -1, -1, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, 3, 4, 5, 6, 7, -1, 144, -1, -1, + 12, 13, 149, 150, 151, 152, -1, 154, -1, -1, + -1, -1, 159, -1, 161, 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 26, -1, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, -1, 50, 9, 10, 11, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 26, -1, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, -1, 50, -1, - -1, -1, -1, -1, 9, 10, 11, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, -1, + 132, 133, 134, 135, 136, 137, 3, 4, 5, 6, + 7, -1, 144, -1, -1, 12, 13, 149, 150, 151, + 152, -1, 154, -1, -1, -1, -1, 159, -1, 161, + 162, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, -1, 64, 65, 66, + 67, -1, -1, -1, -1, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 26, 158, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, -1, 50, 9, 10, 11, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 156, 26, -1, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, -1, 50, 9, 10, - 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 156, 26, -1, 28, 29, 30, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, -1, 129, 130, -1, 132, 133, 134, 135, 136, + 137, -1, -1, -1, -1, -1, -1, 144, 9, 10, + 11, -1, 149, 150, 151, 152, -1, 154, -1, -1, + -1, -1, 159, -1, 161, 162, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, -1, 50, - -1, -1, -1, 9, 10, 11, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 26, 156, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, -1, 50, -1, -1, 9, 10, 11, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 156, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, -1, 50, 9, - 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 156, 26, -1, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - 50, -1, 9, 10, 11, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, - 156, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, -1, 50, 9, 10, 11, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 26, 154, 28, 29, 30, 31, 32, 33, 34, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, 27, + -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, 9, 10, 11, -1, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, + -1, -1, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, -1, 50, 9, 10, 11, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 26, 154, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, -1, 50, -1, 9, - 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 26, 154, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - 50, 9, 10, 11, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 26, 154, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 45, 46, 47, 48, 49, -1, 51, -1, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, 63, -1, + -1, -1, -1, -1, -1, -1, 27, 158, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, 27, + 158, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, -1, 50, 9, 10, 11, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 26, 154, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, -1, -1, 27, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, 153, -1, -1, -1, 49, -1, 51, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, -1, 9, 10, 11, -1, -1, -1, 80, -1, - -1, -1, -1, -1, -1, 153, -1, -1, -1, 26, - -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 114, 50, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 153, 130, 131, - 132, 133, 134, 135, 9, 10, 11, -1, -1, -1, - 142, -1, -1, -1, -1, 147, 148, 149, 150, -1, - 152, 26, -1, 28, 29, 30, 31, 32, 33, 34, + 48, 49, -1, 51, 9, 10, 11, -1, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, + -1, -1, 27, 158, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, -1, 50, 9, 10, 11, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 126, - -1, -1, -1, 26, -1, 28, 29, 30, 31, 32, + 45, 46, 47, 48, 49, -1, 51, -1, -1, -1, + 9, 10, 11, -1, -1, -1, -1, -1, 63, -1, + -1, -1, -1, -1, -1, -1, -1, 158, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, -1, 51, 9, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + 158, 27, -1, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, + -1, -1, -1, 158, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, -1, 50, 43, 44, - -1, -1, -1, -1, 49, -1, 51, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - -1, -1, 43, 44, -1, 70, 71, 72, 49, -1, - 51, 126, -1, -1, -1, 80, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, - 71, 72, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, - -1, -1, -1, 126, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 128, -1, 130, 131, 132, 133, 134, - 135, -1, -1, 114, -1, -1, -1, 142, -1, -1, - -1, -1, 147, 148, 149, 150, -1, 152, -1, 130, - 131, 132, 133, 134, 135, 9, 10, 11, -1, -1, - -1, 142, -1, -1, -1, -1, 147, 148, 149, 150, - -1, 152, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, -1, 50, 9, 10, 11, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 26, -1, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, -1, 50, 10, - 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 26, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, -1, 50, + 43, 44, 45, 46, 47, 48, 49, -1, 51, -1, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 63, -1, -1, -1, -1, -1, -1, 156, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, -1, 51, 9, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + 156, 27, -1, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, + -1, -1, -1, 156, 27, -1, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, -1, 51, -1, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 26, -1, 28, + 63, -1, -1, -1, -1, -1, -1, 156, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 26, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, -1, 50, - 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 26, -1, 28, 29, + 49, -1, 51, 9, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + 156, 27, -1, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 155, 27, -1, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, -1, 9, + 10, 11, -1, -1, -1, -1, -1, -1, -1, 63, + -1, -1, -1, -1, -1, -1, 155, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 11, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 63, -1, 9, 10, 11, -1, 155, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 26, -1, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 26, -1, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - -1, 50, 28, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, 27, 128, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, -1, 44, + 45, -1, -1, -1, -1, 50, -1, 52, -1, 63, + -1, -1, -1, -1, -1, -1, -1, -1, 128, 64, + -1, -1, -1, -1, 44, 45, -1, 72, 73, 74, + 50, -1, 52, -1, -1, -1, -1, 82, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 72, 73, 74, -1, -1, -1, -1, -1, + -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, 128, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 130, -1, 132, 133, 134, + 135, 136, 137, -1, -1, -1, 116, -1, -1, 144, + -1, -1, -1, -1, 149, 150, 151, 152, -1, 154, + -1, -1, 132, 133, 134, 135, 136, 137, 9, 10, + 11, -1, -1, -1, 144, -1, -1, -1, -1, 149, + 150, 151, 152, -1, 154, -1, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, 27, + -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, + -1, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 26, 50, 28, 29, 30, 31, 32, + 46, 47, 48, 49, 11, 51, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, + 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, -1, 51, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, + -1, -1, -1, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 29, 30, 31, 32, + 43, 44, 45, 46, 47, 48, 49, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, -1, 50, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 30, + 43, 44, 45, 46, 47, 48, 49, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 27, -1, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, -1, 50, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 63, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 63, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, -1, 51, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 63, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48 + 49, -1, 51, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 27, 63, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 162, 163, 0, 164, 3, 4, 5, 6, 7, - 12, 13, 43, 44, 49, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 70, 71, 72, 73, 74, 76, 80, 81, 82, - 83, 85, 87, 89, 92, 96, 97, 98, 99, 100, - 101, 102, 105, 106, 108, 112, 113, 114, 116, 117, - 118, 119, 120, 121, 122, 127, 128, 130, 131, 132, - 133, 134, 135, 142, 147, 148, 149, 150, 152, 154, - 155, 157, 159, 160, 165, 166, 175, 179, 180, 214, - 215, 218, 220, 223, 225, 290, 292, 306, 307, 308, - 309, 312, 321, 332, 337, 341, 342, 343, 345, 346, - 356, 357, 358, 359, 361, 362, 363, 364, 370, 380, - 384, 386, 13, 72, 114, 147, 309, 341, 341, 152, - 341, 341, 341, 292, 341, 346, 341, 341, 341, 341, - 303, 341, 341, 341, 341, 341, 341, 341, 114, 147, - 150, 165, 321, 345, 346, 358, 345, 32, 341, 374, - 375, 341, 147, 150, 165, 321, 323, 324, 358, 362, - 363, 370, 152, 329, 342, 152, 342, 27, 62, 280, - 341, 187, 185, 152, 152, 197, 342, 154, 341, 154, - 341, 72, 72, 154, 292, 341, 346, 198, 341, 99, - 100, 150, 165, 169, 170, 74, 157, 254, 255, 120, - 120, 74, 256, 309, 152, 152, 152, 152, 152, 152, - 74, 79, 143, 144, 145, 376, 377, 150, 155, 165, - 165, 290, 306, 341, 176, 155, 79, 330, 376, 79, - 376, 150, 313, 8, 154, 72, 72, 154, 62, 62, - 32, 216, 360, 146, 9, 10, 11, 26, 28, 29, + 0, 164, 165, 0, 166, 3, 4, 5, 6, 7, + 12, 13, 44, 45, 50, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, + 68, 72, 73, 74, 75, 76, 78, 82, 83, 84, + 85, 87, 89, 91, 94, 98, 99, 100, 101, 102, + 103, 104, 107, 108, 110, 114, 115, 116, 118, 119, + 120, 121, 122, 123, 124, 129, 130, 132, 133, 134, + 135, 136, 137, 144, 149, 150, 151, 152, 154, 156, + 157, 159, 161, 162, 167, 168, 177, 181, 182, 216, + 217, 220, 222, 225, 227, 292, 294, 308, 309, 310, + 311, 314, 323, 334, 339, 343, 344, 345, 347, 348, + 358, 359, 360, 361, 363, 364, 365, 366, 372, 382, + 386, 388, 13, 74, 116, 149, 311, 343, 343, 154, + 343, 343, 343, 294, 343, 348, 343, 343, 343, 343, + 305, 343, 343, 343, 343, 343, 343, 343, 116, 149, + 152, 167, 323, 347, 348, 360, 347, 33, 343, 376, + 377, 343, 149, 152, 167, 323, 325, 326, 360, 364, + 365, 372, 154, 331, 344, 154, 344, 28, 64, 282, + 343, 189, 187, 154, 154, 199, 344, 156, 343, 156, + 343, 74, 74, 156, 294, 343, 348, 200, 343, 101, + 102, 152, 167, 171, 172, 76, 159, 256, 257, 122, + 122, 76, 258, 311, 154, 154, 154, 154, 154, 154, + 76, 81, 145, 146, 147, 378, 379, 152, 157, 167, + 167, 292, 308, 343, 178, 157, 81, 332, 378, 81, + 378, 152, 315, 8, 156, 74, 74, 156, 64, 64, + 33, 218, 362, 148, 9, 10, 11, 27, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, + 63, 156, 61, 62, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 322, 148, 64, + 127, 64, 157, 159, 365, 218, 343, 128, 343, 152, + 167, 148, 148, 346, 348, 128, 160, 8, 341, 152, + 167, 148, 293, 148, 127, 365, 155, 28, 183, 343, + 367, 8, 156, 181, 344, 283, 284, 343, 294, 348, + 154, 194, 156, 156, 156, 14, 156, 156, 157, 156, + 152, 167, 173, 174, 152, 167, 175, 176, 167, 93, + 8, 156, 157, 345, 348, 8, 156, 14, 8, 156, + 218, 214, 215, 348, 294, 348, 383, 385, 294, 348, + 155, 295, 376, 64, 127, 145, 379, 75, 343, 348, + 81, 145, 379, 167, 170, 156, 157, 317, 155, 155, + 155, 158, 179, 343, 161, 162, 74, 154, 254, 74, + 125, 226, 224, 367, 367, 74, 306, 64, 74, 122, + 157, 358, 365, 371, 372, 299, 343, 300, 28, 302, + 297, 298, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 325, 343, 33, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 254, 74, 358, + 371, 367, 349, 367, 343, 155, 294, 348, 167, 74, + 33, 343, 33, 343, 167, 358, 254, 333, 358, 327, + 185, 181, 160, 343, 85, 188, 156, 8, 93, 93, + 74, 237, 28, 157, 238, 44, 45, 50, 52, 64, + 82, 130, 132, 144, 149, 152, 154, 167, 323, 334, + 335, 336, 337, 338, 387, 178, 167, 93, 8, 156, + 167, 93, 8, 156, 93, 74, 172, 343, 257, 336, + 76, 307, 8, 155, 8, 155, 155, 155, 156, 129, + 348, 373, 374, 155, 380, 74, 64, 158, 158, 316, + 165, 169, 254, 301, 121, 180, 181, 216, 217, 158, + 33, 153, 155, 255, 294, 308, 348, 14, 149, 152, + 167, 324, 223, 125, 228, 160, 160, 221, 154, 367, + 343, 319, 318, 365, 343, 343, 304, 343, 343, 343, + 66, 348, 321, 320, 160, 358, 368, 370, 371, 160, + 158, 346, 346, 128, 368, 178, 184, 190, 28, 181, + 243, 191, 285, 197, 195, 14, 8, 155, 156, 239, + 156, 239, 337, 337, 337, 337, 336, 340, 342, 154, + 81, 152, 167, 337, 148, 9, 10, 11, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, - 154, 60, 61, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 320, 146, 62, 125, 62, - 155, 157, 363, 216, 341, 126, 341, 150, 165, 146, - 146, 344, 346, 126, 158, 8, 339, 150, 165, 146, - 291, 146, 125, 363, 153, 27, 181, 341, 365, 8, - 154, 179, 342, 281, 282, 341, 292, 346, 152, 192, - 154, 154, 154, 14, 154, 154, 155, 154, 150, 165, - 171, 172, 150, 165, 173, 174, 165, 91, 8, 154, - 155, 343, 346, 8, 154, 14, 8, 154, 216, 212, - 213, 346, 292, 346, 381, 383, 292, 346, 153, 293, - 374, 62, 125, 143, 377, 73, 341, 346, 79, 143, - 377, 165, 168, 154, 155, 315, 153, 153, 153, 156, - 177, 341, 159, 160, 72, 152, 252, 72, 123, 224, - 222, 365, 365, 72, 304, 62, 72, 120, 155, 356, - 363, 369, 370, 297, 341, 298, 27, 300, 295, 296, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 323, - 32, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 252, 72, 356, 369, 365, 347, 365, - 341, 153, 292, 346, 165, 72, 32, 341, 32, 341, - 165, 356, 252, 331, 356, 325, 183, 179, 158, 341, - 83, 186, 154, 8, 91, 91, 72, 235, 27, 155, - 236, 43, 44, 49, 51, 62, 80, 128, 130, 142, - 147, 150, 152, 165, 321, 332, 333, 334, 335, 336, - 385, 176, 165, 91, 8, 154, 165, 91, 8, 154, - 91, 72, 170, 341, 255, 334, 74, 305, 8, 153, - 8, 153, 153, 153, 154, 127, 346, 371, 372, 153, - 378, 72, 62, 156, 156, 314, 163, 167, 252, 299, - 119, 178, 179, 214, 215, 156, 32, 151, 153, 253, - 292, 306, 346, 14, 147, 150, 165, 322, 221, 123, - 226, 158, 158, 219, 152, 365, 341, 317, 316, 363, - 341, 341, 302, 341, 341, 341, 64, 346, 319, 318, - 158, 356, 366, 368, 369, 158, 156, 344, 344, 126, - 366, 176, 182, 188, 27, 179, 241, 189, 283, 195, - 193, 14, 8, 153, 154, 237, 154, 237, 335, 335, - 335, 335, 334, 338, 340, 152, 79, 150, 165, 335, - 146, 9, 10, 11, 26, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 156, 91, 72, 172, - 91, 72, 174, 72, 156, 14, 152, 213, 154, 382, - 152, 8, 153, 72, 74, 75, 379, 341, 252, 156, - 163, 288, 289, 152, 344, 341, 8, 153, 153, 334, - 150, 165, 124, 227, 228, 322, 155, 152, 128, 129, - 248, 249, 250, 251, 322, 158, 156, 252, 252, 341, - 27, 323, 252, 252, 367, 348, 62, 155, 32, 341, - 326, 184, 242, 342, 176, 281, 341, 32, 127, 230, - 346, 230, 334, 72, 27, 179, 234, 237, 93, 94, - 95, 237, 156, 126, 158, 8, 339, 338, 165, 153, - 72, 120, 335, 335, 335, 27, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 103, 200, - 72, 72, 334, 248, 383, 373, 372, 14, 158, 158, - 156, 62, 125, 284, 285, 286, 350, 153, 32, 151, - 292, 346, 165, 228, 155, 8, 257, 248, 153, 8, - 216, 301, 294, 352, 353, 354, 355, 365, 341, 344, - 327, 244, 67, 68, 246, 154, 84, 154, 346, 152, - 126, 229, 229, 14, 176, 93, 154, 341, 27, 154, - 240, 156, 334, 334, 153, 335, 27, 152, 199, 153, - 371, 341, 156, 365, 366, 350, 62, 287, 154, 344, - 341, 257, 322, 100, 106, 109, 110, 111, 112, 113, - 114, 115, 156, 258, 261, 274, 275, 276, 277, 279, - 153, 106, 310, 250, 151, 217, 341, 331, 62, 62, - 252, 349, 158, 156, 125, 328, 67, 68, 247, 342, - 179, 154, 190, 231, 230, 153, 153, 334, 90, 154, - 240, 239, 126, 335, 201, 104, 205, 310, 153, 158, - 351, 365, 284, 156, 72, 262, 322, 259, 309, 277, - 8, 154, 155, 152, 155, 74, 365, 365, 350, 366, - 342, 27, 69, 243, 281, 371, 196, 194, 154, 238, - 176, 334, 322, 206, 155, 355, 158, 14, 8, 154, - 155, 263, 74, 278, 216, 72, 176, 32, 74, 311, - 176, 14, 158, 158, 27, 176, 154, 179, 153, 153, - 27, 179, 233, 233, 176, 202, 155, 176, 334, 322, - 72, 264, 265, 266, 267, 269, 270, 271, 322, 14, - 8, 154, 72, 14, 156, 74, 8, 153, 156, 334, - 245, 191, 176, 74, 176, 156, 156, 266, 154, 91, - 107, 154, 146, 334, 74, 260, 334, 32, 74, 176, - 27, 179, 232, 88, 153, 156, 272, 277, 268, 322, - 72, 14, 152, 74, 176, 154, 203, 72, 8, 334, - 248, 86, 155, 322, 153, 154, 176, 154, 155, 273, - 156, 176, 204, 156, 103, 207, 208, 209, 152, 209, - 322, 210, 74, 153, 211, 155, 176, 156 + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 158, 93, 74, 174, 93, 74, 176, 74, 158, 14, + 154, 215, 156, 384, 154, 8, 155, 74, 76, 77, + 381, 343, 254, 158, 165, 290, 291, 154, 346, 343, + 8, 155, 155, 336, 152, 167, 126, 229, 230, 324, + 157, 154, 130, 131, 250, 251, 252, 253, 324, 160, + 158, 254, 254, 343, 28, 325, 254, 254, 369, 350, + 64, 157, 33, 343, 328, 186, 244, 344, 178, 283, + 343, 33, 129, 232, 348, 232, 336, 74, 28, 181, + 236, 239, 95, 96, 97, 239, 158, 128, 160, 8, + 341, 340, 167, 155, 74, 122, 337, 337, 337, 28, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 105, 202, 74, 74, 336, 250, 385, 375, + 374, 14, 160, 160, 158, 64, 127, 286, 287, 288, + 352, 155, 33, 153, 294, 348, 167, 230, 157, 8, + 259, 250, 155, 8, 218, 303, 296, 354, 355, 356, + 357, 367, 343, 346, 329, 246, 69, 70, 248, 156, + 86, 156, 348, 154, 128, 231, 231, 14, 178, 95, + 156, 343, 28, 156, 242, 158, 336, 336, 155, 337, + 28, 154, 201, 155, 373, 343, 158, 367, 368, 352, + 64, 289, 156, 346, 343, 259, 324, 102, 108, 111, + 112, 113, 114, 115, 116, 117, 158, 260, 263, 276, + 277, 278, 279, 281, 155, 108, 312, 252, 153, 219, + 343, 333, 64, 64, 254, 351, 160, 158, 127, 330, + 69, 70, 249, 344, 181, 156, 192, 233, 232, 155, + 155, 336, 92, 156, 242, 241, 128, 337, 203, 106, + 207, 312, 155, 160, 353, 367, 286, 158, 74, 264, + 324, 261, 311, 279, 8, 156, 157, 154, 157, 76, + 367, 367, 352, 368, 344, 28, 71, 245, 283, 373, + 198, 196, 156, 240, 178, 336, 324, 208, 157, 357, + 160, 14, 8, 156, 157, 265, 76, 280, 218, 74, + 178, 33, 76, 313, 178, 14, 160, 160, 28, 178, + 156, 181, 155, 155, 28, 181, 235, 235, 178, 204, + 157, 178, 336, 324, 74, 266, 267, 268, 269, 271, + 272, 273, 324, 14, 8, 156, 74, 14, 158, 76, + 8, 155, 158, 336, 247, 193, 178, 76, 178, 158, + 158, 268, 156, 93, 109, 156, 148, 336, 76, 262, + 336, 33, 76, 178, 28, 181, 234, 90, 155, 158, + 274, 279, 270, 324, 74, 14, 154, 76, 178, 156, + 205, 74, 8, 336, 250, 88, 157, 324, 155, 156, + 178, 156, 157, 275, 158, 178, 206, 158, 105, 209, + 210, 211, 154, 211, 324, 212, 76, 155, 213, 157, + 178, 158 }; #define yyerrok (yyerrstatus = 0) @@ -4863,337 +4942,337 @@ yyreduce: case 287: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_DIV, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_POW, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 288: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_CONCAT, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_DIV, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 289: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MOD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_CONCAT, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 290: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_AND, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MOD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 291: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_OR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_AND, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 292: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_OR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 293: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 294: - { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 295: - { zend_do_post_incdec(&(yyval), &(yyvsp[(1) - (2)]), ZEND_POST_INC TSRMLS_CC); } + { zend_check_writable_variable(&(yyvsp[(1) - (3)])); zend_do_end_variable_parse(&(yyvsp[(1) - (3)]), BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 296: - { zend_do_pre_incdec(&(yyval), &(yyvsp[(2) - (2)]), ZEND_PRE_INC TSRMLS_CC); } + { zend_do_post_incdec(&(yyval), &(yyvsp[(1) - (2)]), ZEND_POST_INC TSRMLS_CC); } break; case 297: - { zend_do_post_incdec(&(yyval), &(yyvsp[(1) - (2)]), ZEND_POST_DEC TSRMLS_CC); } + { zend_do_pre_incdec(&(yyval), &(yyvsp[(2) - (2)]), ZEND_PRE_INC TSRMLS_CC); } break; case 298: - { zend_do_pre_incdec(&(yyval), &(yyvsp[(2) - (2)]), ZEND_PRE_DEC TSRMLS_CC); } + { zend_do_post_incdec(&(yyval), &(yyvsp[(1) - (2)]), ZEND_POST_DEC TSRMLS_CC); } break; case 299: - { zend_do_boolean_or_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_pre_incdec(&(yyval), &(yyvsp[(2) - (2)]), ZEND_PRE_DEC TSRMLS_CC); } break; case 300: - { zend_do_boolean_or_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } + { zend_do_boolean_or_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 301: - { zend_do_boolean_and_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_boolean_or_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } break; case 302: - { zend_do_boolean_and_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } + { zend_do_boolean_and_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 303: - { zend_do_boolean_or_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_boolean_and_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } break; case 304: - { zend_do_boolean_or_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } + { zend_do_boolean_or_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 305: - { zend_do_boolean_and_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_boolean_or_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } break; case 306: - { zend_do_boolean_and_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } + { zend_do_boolean_and_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 307: - { zend_do_binary_op(ZEND_BOOL_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_boolean_and_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } break; case 308: - { zend_do_binary_op(ZEND_BW_OR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_BOOL_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 309: - { zend_do_binary_op(ZEND_BW_AND, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_BW_OR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 310: - { zend_do_binary_op(ZEND_BW_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_BW_AND, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 311: - { zend_do_binary_op(ZEND_CONCAT, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_BW_XOR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 312: - { zend_do_binary_op(ZEND_ADD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_CONCAT, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 313: - { zend_do_binary_op(ZEND_SUB, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_ADD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 314: - { zend_do_binary_op(ZEND_MUL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_SUB, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 315: - { zend_do_binary_op(ZEND_DIV, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_MUL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 316: - { zend_do_binary_op(ZEND_MOD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_POW, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 317: - { zend_do_binary_op(ZEND_SL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_DIV, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 318: - { zend_do_binary_op(ZEND_SR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_MOD, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 319: - { ZVAL_LONG(&(yyvsp[(1) - (2)]).u.constant, 0); if ((yyvsp[(2) - (2)]).op_type == IS_CONST) { add_function(&(yyvsp[(2) - (2)]).u.constant, &(yyvsp[(1) - (2)]).u.constant, &(yyvsp[(2) - (2)]).u.constant TSRMLS_CC); (yyval) = (yyvsp[(2) - (2)]); } else { (yyvsp[(1) - (2)]).op_type = IS_CONST; INIT_PZVAL(&(yyvsp[(1) - (2)]).u.constant); zend_do_binary_op(ZEND_ADD, &(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } } + { zend_do_binary_op(ZEND_SL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 320: - { ZVAL_LONG(&(yyvsp[(1) - (2)]).u.constant, 0); if ((yyvsp[(2) - (2)]).op_type == IS_CONST) { sub_function(&(yyvsp[(2) - (2)]).u.constant, &(yyvsp[(1) - (2)]).u.constant, &(yyvsp[(2) - (2)]).u.constant TSRMLS_CC); (yyval) = (yyvsp[(2) - (2)]); } else { (yyvsp[(1) - (2)]).op_type = IS_CONST; INIT_PZVAL(&(yyvsp[(1) - (2)]).u.constant); zend_do_binary_op(ZEND_SUB, &(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } } + { zend_do_binary_op(ZEND_SR, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 321: - { zend_do_unary_op(ZEND_BOOL_NOT, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { ZVAL_LONG(&(yyvsp[(1) - (2)]).u.constant, 0); if ((yyvsp[(2) - (2)]).op_type == IS_CONST) { add_function(&(yyvsp[(2) - (2)]).u.constant, &(yyvsp[(1) - (2)]).u.constant, &(yyvsp[(2) - (2)]).u.constant TSRMLS_CC); (yyval) = (yyvsp[(2) - (2)]); } else { (yyvsp[(1) - (2)]).op_type = IS_CONST; INIT_PZVAL(&(yyvsp[(1) - (2)]).u.constant); zend_do_binary_op(ZEND_ADD, &(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } } break; case 322: - { zend_do_unary_op(ZEND_BW_NOT, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { ZVAL_LONG(&(yyvsp[(1) - (2)]).u.constant, 0); if ((yyvsp[(2) - (2)]).op_type == IS_CONST) { sub_function(&(yyvsp[(2) - (2)]).u.constant, &(yyvsp[(1) - (2)]).u.constant, &(yyvsp[(2) - (2)]).u.constant TSRMLS_CC); (yyval) = (yyvsp[(2) - (2)]); } else { (yyvsp[(1) - (2)]).op_type = IS_CONST; INIT_PZVAL(&(yyvsp[(1) - (2)]).u.constant); zend_do_binary_op(ZEND_SUB, &(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } } break; case 323: - { zend_do_binary_op(ZEND_IS_IDENTICAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_unary_op(ZEND_BOOL_NOT, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 324: - { zend_do_binary_op(ZEND_IS_NOT_IDENTICAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_unary_op(ZEND_BW_NOT, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 325: - { zend_do_binary_op(ZEND_IS_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_IDENTICAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 326: - { zend_do_binary_op(ZEND_IS_NOT_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_NOT_IDENTICAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 327: - { zend_do_binary_op(ZEND_IS_SMALLER, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 328: - { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_NOT_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 329: - { zend_do_binary_op(ZEND_IS_SMALLER, &(yyval), &(yyvsp[(3) - (3)]), &(yyvsp[(1) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_SMALLER, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 330: - { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &(yyval), &(yyvsp[(3) - (3)]), &(yyvsp[(1) - (3)]) TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 331: - { zend_do_instanceof(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), 0 TSRMLS_CC); } + { zend_do_binary_op(ZEND_IS_SMALLER, &(yyval), &(yyvsp[(3) - (3)]), &(yyvsp[(1) - (3)]) TSRMLS_CC); } break; case 332: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &(yyval), &(yyvsp[(3) - (3)]), &(yyvsp[(1) - (3)]) TSRMLS_CC); } break; case 333: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_instanceof(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), 0 TSRMLS_CC); } break; case 334: - { (yyval) = (yyvsp[(2) - (3)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 335: - { (yyval) = (yyvsp[(5) - (5)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 336: - { zend_do_begin_qm_op(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { (yyval) = (yyvsp[(2) - (3)]); } break; case 337: - { zend_do_qm_true(&(yyvsp[(4) - (5)]), &(yyvsp[(2) - (5)]), &(yyvsp[(5) - (5)]) TSRMLS_CC); } + { (yyval) = (yyvsp[(5) - (5)]); } break; case 338: - { zend_do_qm_false(&(yyval), &(yyvsp[(7) - (7)]), &(yyvsp[(2) - (7)]), &(yyvsp[(5) - (7)]) TSRMLS_CC); } + { zend_do_begin_qm_op(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 339: - { zend_do_jmp_set(&(yyvsp[(1) - (3)]), &(yyvsp[(2) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_qm_true(&(yyvsp[(4) - (5)]), &(yyvsp[(2) - (5)]), &(yyvsp[(5) - (5)]) TSRMLS_CC); } break; case 340: - { zend_do_jmp_set_else(&(yyval), &(yyvsp[(5) - (5)]), &(yyvsp[(2) - (5)]), &(yyvsp[(3) - (5)]) TSRMLS_CC); } + { zend_do_qm_false(&(yyval), &(yyvsp[(7) - (7)]), &(yyvsp[(2) - (7)]), &(yyvsp[(5) - (7)]) TSRMLS_CC); } break; case 341: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_jmp_set(&(yyvsp[(1) - (3)]), &(yyvsp[(2) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 342: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_LONG TSRMLS_CC); } + { zend_do_jmp_set_else(&(yyval), &(yyvsp[(5) - (5)]), &(yyvsp[(2) - (5)]), &(yyvsp[(3) - (5)]) TSRMLS_CC); } break; case 343: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_DOUBLE TSRMLS_CC); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 344: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_STRING TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_LONG TSRMLS_CC); } break; case 345: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_ARRAY TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_DOUBLE TSRMLS_CC); } break; case 346: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_OBJECT TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_STRING TSRMLS_CC); } break; case 347: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_BOOL TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_ARRAY TSRMLS_CC); } break; case 348: - { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_NULL TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_OBJECT TSRMLS_CC); } break; case 349: - { zend_do_exit(&(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_BOOL TSRMLS_CC); } break; case 350: - { zend_do_begin_silence(&(yyvsp[(1) - (1)]) TSRMLS_CC); } + { zend_do_cast(&(yyval), &(yyvsp[(2) - (2)]), IS_NULL TSRMLS_CC); } break; case 351: - { zend_do_end_silence(&(yyvsp[(1) - (3)]) TSRMLS_CC); (yyval) = (yyvsp[(3) - (3)]); } + { zend_do_exit(&(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 352: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_begin_silence(&(yyvsp[(1) - (1)]) TSRMLS_CC); } break; case 353: - { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); } + { zend_do_end_silence(&(yyvsp[(1) - (3)]) TSRMLS_CC); (yyval) = (yyvsp[(3) - (3)]); } break; case 354: @@ -5203,162 +5282,162 @@ yyreduce: case 355: - { zend_do_shell_exec(&(yyval), &(yyvsp[(2) - (3)]) TSRMLS_CC); } + { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); } break; case 356: - { zend_do_print(&(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 357: - { zend_do_yield(&(yyval), NULL, NULL, 0 TSRMLS_CC); } + { zend_do_shell_exec(&(yyval), &(yyvsp[(2) - (3)]) TSRMLS_CC); } break; case 358: - { zend_do_begin_lambda_function_declaration(&(yyval), &(yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]).op_type, 0 TSRMLS_CC); } + { zend_do_print(&(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 359: - { zend_do_end_function_declaration(&(yyvsp[(1) - (10)]) TSRMLS_CC); (yyval) = (yyvsp[(3) - (10)]); } + { zend_do_yield(&(yyval), NULL, NULL, 0 TSRMLS_CC); } break; case 360: - { zend_do_begin_lambda_function_declaration(&(yyval), &(yyvsp[(2) - (3)]), (yyvsp[(3) - (3)]).op_type, 1 TSRMLS_CC); } + { zend_do_begin_lambda_function_declaration(&(yyval), &(yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]).op_type, 0 TSRMLS_CC); } break; case 361: - { zend_do_end_function_declaration(&(yyvsp[(2) - (11)]) TSRMLS_CC); (yyval) = (yyvsp[(4) - (11)]); } + { zend_do_end_function_declaration(&(yyvsp[(1) - (10)]) TSRMLS_CC); (yyval) = (yyvsp[(3) - (10)]); } break; case 362: - { zend_do_yield(&(yyval), &(yyvsp[(2) - (2)]), NULL, 0 TSRMLS_CC); } + { zend_do_begin_lambda_function_declaration(&(yyval), &(yyvsp[(2) - (3)]), (yyvsp[(3) - (3)]).op_type, 1 TSRMLS_CC); } break; case 363: - { zend_do_yield(&(yyval), &(yyvsp[(2) - (2)]), NULL, 1 TSRMLS_CC); } + { zend_do_end_function_declaration(&(yyvsp[(2) - (11)]) TSRMLS_CC); (yyval) = (yyvsp[(4) - (11)]); } break; case 364: - { zend_do_yield(&(yyval), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]), 0 TSRMLS_CC); } + { zend_do_yield(&(yyval), &(yyvsp[(2) - (2)]), NULL, 0 TSRMLS_CC); } break; case 365: - { zend_do_yield(&(yyval), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]), 1 TSRMLS_CC); } + { zend_do_yield(&(yyval), &(yyvsp[(2) - (2)]), NULL, 1 TSRMLS_CC); } break; case 366: - { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } + { zend_do_yield(&(yyval), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]), 0 TSRMLS_CC); } break; case 367: - { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } + { zend_do_yield(&(yyval), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]), 1 TSRMLS_CC); } break; case 368: - { (yyvsp[(1) - (4)]).EA = 0; zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } + { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; case 369: - { (yyval) = (yyvsp[(3) - (4)]); } + { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; case 370: - { (yyval) = (yyvsp[(2) - (3)]); } + { (yyvsp[(1) - (4)]).EA = 0; zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; case 371: - { (yyval).u.op.opline_num = CG(zend_lineno); } + { (yyval) = (yyvsp[(3) - (4)]); } break; - case 374: + case 372: - { zend_do_fetch_lexical_variable(&(yyvsp[(3) - (3)]), 0 TSRMLS_CC); } + { (yyval) = (yyvsp[(2) - (3)]); } break; - case 375: + case 373: - { zend_do_fetch_lexical_variable(&(yyvsp[(4) - (4)]), 1 TSRMLS_CC); } + { (yyval).u.op.opline_num = CG(zend_lineno); } break; case 376: - { zend_do_fetch_lexical_variable(&(yyvsp[(1) - (1)]), 0 TSRMLS_CC); } + { zend_do_fetch_lexical_variable(&(yyvsp[(3) - (3)]), 0 TSRMLS_CC); } break; case 377: - { zend_do_fetch_lexical_variable(&(yyvsp[(2) - (2)]), 1 TSRMLS_CC); } + { zend_do_fetch_lexical_variable(&(yyvsp[(4) - (4)]), 1 TSRMLS_CC); } break; case 378: - { (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(1) - (1)]), 1 TSRMLS_CC); } + { zend_do_fetch_lexical_variable(&(yyvsp[(1) - (1)]), 0 TSRMLS_CC); } break; case 379: - { zend_do_end_function_call(&(yyvsp[(1) - (3)]), &(yyval), &(yyvsp[(3) - (3)]), 0, (yyvsp[(2) - (3)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } + { zend_do_fetch_lexical_variable(&(yyvsp[(2) - (2)]), 1 TSRMLS_CC); } break; case 380: - { (yyvsp[(1) - (3)]).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyvsp[(1) - (3)]).u.constant); zend_do_build_namespace_name(&(yyvsp[(1) - (3)]), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(1) - (3)]), 0 TSRMLS_CC); } + { (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(1) - (1)]), 1 TSRMLS_CC); } break; case 381: - { zend_do_end_function_call(&(yyvsp[(1) - (5)]), &(yyval), &(yyvsp[(5) - (5)]), 0, (yyvsp[(4) - (5)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } + { zend_do_end_function_call(&(yyvsp[(1) - (3)]), &(yyval), &(yyvsp[(3) - (3)]), 0, (yyvsp[(2) - (3)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } break; case 382: - { (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(2) - (2)]), 0 TSRMLS_CC); } + { (yyvsp[(1) - (3)]).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyvsp[(1) - (3)]).u.constant); zend_do_build_namespace_name(&(yyvsp[(1) - (3)]), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(1) - (3)]), 0 TSRMLS_CC); } break; case 383: - { zend_do_end_function_call(&(yyvsp[(2) - (4)]), &(yyval), &(yyvsp[(4) - (4)]), 0, (yyvsp[(3) - (4)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } + { zend_do_end_function_call(&(yyvsp[(1) - (5)]), &(yyval), &(yyvsp[(5) - (5)]), 0, (yyvsp[(4) - (5)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } break; case 384: - { (yyval).u.op.opline_num = zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { (yyval).u.op.opline_num = zend_do_begin_function_call(&(yyvsp[(2) - (2)]), 0 TSRMLS_CC); } break; case 385: - { zend_do_end_function_call((yyvsp[(4) - (5)]).u.op.opline_num?NULL:&(yyvsp[(3) - (5)]), &(yyval), &(yyvsp[(5) - (5)]), (yyvsp[(4) - (5)]).u.op.opline_num, (yyvsp[(4) - (5)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + { zend_do_end_function_call(&(yyvsp[(2) - (4)]), &(yyval), &(yyvsp[(4) - (4)]), 0, (yyvsp[(3) - (4)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } break; case 386: - { zend_do_end_variable_parse(&(yyvsp[(3) - (3)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { (yyval).u.op.opline_num = zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 387: - { zend_do_end_function_call(NULL, &(yyval), &(yyvsp[(5) - (5)]), 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + { zend_do_end_function_call((yyvsp[(4) - (5)]).u.op.opline_num?NULL:&(yyvsp[(3) - (5)]), &(yyval), &(yyvsp[(5) - (5)]), (yyvsp[(4) - (5)]).u.op.opline_num, (yyvsp[(4) - (5)]).u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} break; case 388: - { zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_end_variable_parse(&(yyvsp[(3) - (3)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 389: @@ -5368,7 +5447,7 @@ yyreduce: case 390: - { zend_do_end_variable_parse(&(yyvsp[(3) - (3)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 391: @@ -5378,102 +5457,102 @@ yyreduce: case 392: - { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&(yyvsp[(1) - (1)]), 0 TSRMLS_CC); } + { zend_do_end_variable_parse(&(yyvsp[(3) - (3)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 393: - { zend_do_end_function_call(&(yyvsp[(1) - (3)]), &(yyval), &(yyvsp[(3) - (3)]), 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + { zend_do_end_function_call(NULL, &(yyval), &(yyvsp[(5) - (5)]), 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} break; case 394: - { (yyval).op_type = IS_CONST; ZVAL_STRINGL(&(yyval).u.constant, "static", sizeof("static")-1, 1);} + { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&(yyvsp[(1) - (1)]), 0 TSRMLS_CC); } break; case 395: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_end_function_call(&(yyvsp[(1) - (3)]), &(yyval), &(yyvsp[(3) - (3)]), 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} break; case 396: - { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { (yyval).op_type = IS_CONST; ZVAL_STRINGL(&(yyval).u.constant, "static", sizeof("static")-1, 1);} break; case 397: - { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); (yyval) = (yyvsp[(2) - (2)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 398: - { (yyval) = (yyvsp[(1) - (1)]); } + { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 399: - { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); } + { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); (yyval) = (yyvsp[(2) - (2)]); } break; case 400: - { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); (yyval) = (yyvsp[(2) - (2)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 401: - { zend_do_fetch_class(&(yyval), &(yyvsp[(1) - (1)]) TSRMLS_CC); } + { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; case 402: - { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&(yyval), &(yyvsp[(1) - (1)]) TSRMLS_CC); } + { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); (yyval) = (yyvsp[(2) - (2)]); } break; case 403: - { zend_do_push_object(&(yyvsp[(1) - (2)]) TSRMLS_CC); } + { zend_do_fetch_class(&(yyval), &(yyvsp[(1) - (1)]) TSRMLS_CC); } break; case 404: - { zend_do_push_object(&(yyvsp[(4) - (4)]) TSRMLS_CC); } + { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&(yyval), &(yyvsp[(1) - (1)]) TSRMLS_CC); } break; case 405: - { zend_do_pop_object(&(yyval) TSRMLS_CC); (yyval).EA = ZEND_PARSED_MEMBER; } + { zend_do_push_object(&(yyvsp[(1) - (2)]) TSRMLS_CC); } break; case 406: - { (yyval) = (yyvsp[(1) - (1)]); } + { zend_do_push_object(&(yyvsp[(4) - (4)]) TSRMLS_CC); } break; - case 409: + case 407: - { zend_do_push_object(&(yyvsp[(2) - (2)]) TSRMLS_CC); } + { zend_do_pop_object(&(yyval) TSRMLS_CC); (yyval).EA = ZEND_PARSED_MEMBER; } break; - case 410: + case 408: - { memset(&(yyval), 0, sizeof(znode)); (yyval).op_type = IS_UNUSED; } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 411: - { memset(&(yyval), 0, sizeof(znode)); (yyval).op_type = IS_UNUSED; } + { zend_do_push_object(&(yyvsp[(2) - (2)]) TSRMLS_CC); } break; case 412: - { (yyval) = (yyvsp[(1) - (1)]); } + { memset(&(yyval), 0, sizeof(znode)); (yyval).op_type = IS_UNUSED; } break; case 413: - { ZVAL_EMPTY_STRING(&(yyval).u.constant); INIT_PZVAL(&(yyval).u.constant); (yyval).op_type = IS_CONST; } + { memset(&(yyval), 0, sizeof(znode)); (yyval).op_type = IS_UNUSED; } break; case 414: @@ -5483,12 +5562,12 @@ yyreduce: case 415: - { (yyval) = (yyvsp[(1) - (1)]); } + { ZVAL_EMPTY_STRING(&(yyval).u.constant); INIT_PZVAL(&(yyval).u.constant); (yyval).op_type = IS_CONST; } break; case 416: - { Z_LVAL((yyval).u.constant) = 0; } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 417: @@ -5498,7 +5577,7 @@ yyreduce: case 418: - { (yyval) = (yyvsp[(1) - (1)]); } + { Z_LVAL((yyval).u.constant) = 0; } break; case 419: @@ -5548,152 +5627,152 @@ yyreduce: case 428: - { (yyval) = (yyvsp[(2) - (3)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 429: - { ZVAL_EMPTY_STRING(&(yyval).u.constant); INIT_PZVAL(&(yyval).u.constant); (yyval).op_type = IS_CONST; } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 430: - { zend_do_fetch_constant(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), ZEND_CT, 0 TSRMLS_CC); } + { (yyval) = (yyvsp[(2) - (3)]); } break; case 431: - { zend_do_constant_expression(&(yyval), (yyvsp[(1) - (1)]).u.ast TSRMLS_CC); } + { ZVAL_EMPTY_STRING(&(yyval).u.constant); INIT_PZVAL(&(yyval).u.constant); (yyval).op_type = IS_CONST; } break; case 432: - { (yyval) = (yyvsp[(3) - (4)]); Z_TYPE((yyval).u.constant) = IS_CONSTANT_ARRAY; } + { zend_do_fetch_constant(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), ZEND_CT, 0 TSRMLS_CC); } break; case 433: - { (yyval) = (yyvsp[(2) - (3)]); Z_TYPE((yyval).u.constant) = IS_CONSTANT_ARRAY; } + { zend_do_constant_expression(&(yyval), (yyvsp[(1) - (1)]).u.ast TSRMLS_CC); } break; case 434: - { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } + { (yyval) = (yyvsp[(3) - (4)]); Z_TYPE((yyval).u.constant) = IS_CONSTANT_ARRAY; } break; case 435: - { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } + { (yyval) = (yyvsp[(2) - (3)]); Z_TYPE((yyval).u.constant) = IS_CONSTANT_ARRAY; } break; case 436: - { zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_CT, 1 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } + { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } break; case 437: - { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyvsp[(3) - (3)]) = (yyval); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(3) - (3)]), ZEND_CT, 0 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } + { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } break; case 438: - { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(2) - (2)]), ZEND_CT, 0 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } + { zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_CT, 1 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } break; case 439: - { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } + { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyvsp[(3) - (3)]) = (yyval); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(3) - (3)]), ZEND_CT, 0 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } break; case 440: - { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } + { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(2) - (2)]), ZEND_CT, 0 TSRMLS_CC); (yyval).u.ast = zend_ast_create_constant(&(yyval).u.constant); } break; case 441: - { (yyval) = (yyvsp[(1) - (1)]); } + { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } break; case 442: - { (yyval).u.ast = zend_ast_create_binary(ZEND_ADD, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_constant(&(yyvsp[(1) - (1)]).u.constant); } break; case 443: - { (yyval).u.ast = zend_ast_create_binary(ZEND_SUB, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 444: - { (yyval).u.ast = zend_ast_create_binary(ZEND_MUL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_ADD, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 445: - { (yyval).u.ast = zend_ast_create_binary(ZEND_DIV, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_SUB, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 446: - { (yyval).u.ast = zend_ast_create_binary(ZEND_MOD, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_MUL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 447: - { (yyval).u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, (yyvsp[(2) - (2)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_DIV, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 448: - { (yyval).u.ast = zend_ast_create_unary(ZEND_BW_NOT, (yyvsp[(2) - (2)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_MOD, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 449: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_OR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, (yyvsp[(2) - (2)]).u.ast); } break; case 450: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_AND, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_unary(ZEND_BW_NOT, (yyvsp[(2) - (2)]).u.ast); } break; case 451: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_XOR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_OR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 452: - { (yyval).u.ast = zend_ast_create_binary(ZEND_SL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_AND, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 453: - { (yyval).u.ast = zend_ast_create_binary(ZEND_SR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BW_XOR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 454: - { (yyval).u.ast = zend_ast_create_binary(ZEND_CONCAT, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_SL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 455: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_XOR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_SR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 456: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_AND, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_CONCAT, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 457: - { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_OR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_XOR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 458: @@ -5708,77 +5787,77 @@ yyreduce: case 460: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_IDENTICAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_AND, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 461: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_NOT_IDENTICAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_BOOL_OR, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 462: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_IDENTICAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 463: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_NOT_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_NOT_IDENTICAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 464: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 465: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, (yyvsp[(3) - (3)]).u.ast, (yyvsp[(1) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_NOT_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 466: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 467: - { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, (yyvsp[(3) - (3)]).u.ast, (yyvsp[(1) - (3)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, (yyvsp[(3) - (3)]).u.ast, (yyvsp[(1) - (3)]).u.ast); } break; case 468: - { (yyval).u.ast = zend_ast_create_ternary(ZEND_SELECT, (yyvsp[(1) - (4)]).u.ast, NULL, (yyvsp[(4) - (4)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, (yyvsp[(1) - (3)]).u.ast, (yyvsp[(3) - (3)]).u.ast); } break; case 469: - { (yyval).u.ast = zend_ast_create_ternary(ZEND_SELECT, (yyvsp[(1) - (5)]).u.ast, (yyvsp[(3) - (5)]).u.ast, (yyvsp[(5) - (5)]).u.ast); } + { (yyval).u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, (yyvsp[(3) - (3)]).u.ast, (yyvsp[(1) - (3)]).u.ast); } break; case 470: - { (yyval).u.ast = zend_ast_create_unary(ZEND_UNARY_PLUS, (yyvsp[(2) - (2)]).u.ast); } + { (yyval).u.ast = zend_ast_create_ternary(ZEND_SELECT, (yyvsp[(1) - (4)]).u.ast, NULL, (yyvsp[(4) - (4)]).u.ast); } break; case 471: - { (yyval).u.ast = zend_ast_create_unary(ZEND_UNARY_MINUS, (yyvsp[(2) - (2)]).u.ast); } + { (yyval).u.ast = zend_ast_create_ternary(ZEND_SELECT, (yyvsp[(1) - (5)]).u.ast, (yyvsp[(3) - (5)]).u.ast, (yyvsp[(5) - (5)]).u.ast); } break; case 472: - { (yyval) = (yyvsp[(2) - (3)]); } + { (yyval).u.ast = zend_ast_create_unary(ZEND_UNARY_PLUS, (yyvsp[(2) - (2)]).u.ast); } break; case 473: - { (yyval) = (yyvsp[(1) - (1)]); } + { (yyval).u.ast = zend_ast_create_unary(ZEND_UNARY_MINUS, (yyvsp[(2) - (2)]).u.ast); } break; case 474: - { (yyval) = (yyvsp[(1) - (1)]); } + { (yyval) = (yyvsp[(2) - (3)]); } break; case 475: @@ -5788,557 +5867,567 @@ yyreduce: case 476: - { zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_RT, 1 TSRMLS_CC); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 477: - { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyvsp[(3) - (3)]) = (yyval); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(3) - (3)]), ZEND_RT, 0 TSRMLS_CC); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 478: - { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(2) - (2)]), ZEND_RT, 0 TSRMLS_CC); } + { zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_RT, 1 TSRMLS_CC); } break; case 479: - { (yyval) = (yyvsp[(1) - (1)]); } + { (yyval).op_type = IS_CONST; ZVAL_EMPTY_STRING(&(yyval).u.constant); zend_do_build_namespace_name(&(yyval), &(yyval), &(yyvsp[(3) - (3)]) TSRMLS_CC); (yyvsp[(3) - (3)]) = (yyval); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(3) - (3)]), ZEND_RT, 0 TSRMLS_CC); } break; case 480: - { (yyval) = (yyvsp[(2) - (3)]); } + { char *tmp = estrndup(Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL((yyvsp[(2) - (2)]).u.constant), Z_STRLEN((yyvsp[(2) - (2)]).u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL((yyvsp[(2) - (2)]).u.constant)); Z_STRVAL((yyvsp[(2) - (2)]).u.constant) = tmp; ++Z_STRLEN((yyvsp[(2) - (2)]).u.constant); zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(2) - (2)]), ZEND_RT, 0 TSRMLS_CC); } break; case 481: - { (yyval) = (yyvsp[(2) - (3)]); } + { (yyval) = (yyvsp[(1) - (1)]); } break; case 482: - { if (Z_TYPE((yyvsp[(1) - (1)]).u.constant) == IS_CONSTANT) {zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_RT, 1 TSRMLS_CC);} else {(yyval) = (yyvsp[(1) - (1)]);} } + { (yyval) = (yyvsp[(2) - (3)]); } break; case 483: - { (yyval).op_type = IS_CONST; INIT_PZVAL(&(yyval).u.constant); array_init(&(yyval).u.constant); } + { (yyval) = (yyvsp[(2) - (3)]); } break; case 484: + { if (Z_TYPE((yyvsp[(1) - (1)]).u.constant) == IS_CONSTANT) {zend_do_fetch_constant(&(yyval), NULL, &(yyvsp[(1) - (1)]), ZEND_RT, 1 TSRMLS_CC);} else {(yyval) = (yyvsp[(1) - (1)]);} } + break; + + case 485: + + { (yyval).op_type = IS_CONST; INIT_PZVAL(&(yyval).u.constant); array_init(&(yyval).u.constant); } + break; + + case 486: + { (yyval) = (yyvsp[(1) - (2)]); } break; - case 487: + case 489: { zend_do_add_static_array_element(&(yyval), &(yyvsp[(3) - (5)]), &(yyvsp[(5) - (5)])); } break; - case 488: + case 490: { zend_do_add_static_array_element(&(yyval), NULL, &(yyvsp[(3) - (3)])); } break; - case 489: + case 491: { (yyval).op_type = IS_CONST; INIT_PZVAL(&(yyval).u.constant); array_init(&(yyval).u.constant); zend_do_add_static_array_element(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)])); } break; - case 490: + case 492: { (yyval).op_type = IS_CONST; INIT_PZVAL(&(yyval).u.constant); array_init(&(yyval).u.constant); zend_do_add_static_array_element(&(yyval), NULL, &(yyvsp[(1) - (1)])); } break; - case 491: + case 493: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 492: + case 494: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 493: + case 495: { (yyval) = (yyvsp[(2) - (3)]); } break; - case 494: + case 496: { (yyval) = (yyvsp[(2) - (3)]); } break; - case 495: + case 497: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); (yyval) = (yyvsp[(1) - (1)]); } break; - case 496: + case 498: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_W, 0 TSRMLS_CC); (yyval) = (yyvsp[(1) - (1)]); zend_check_writable_variable(&(yyvsp[(1) - (1)])); } break; - case 497: + case 499: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_RW, 0 TSRMLS_CC); (yyval) = (yyvsp[(1) - (1)]); zend_check_writable_variable(&(yyvsp[(1) - (1)])); } break; - case 498: + case 500: { zend_do_push_object(&(yyvsp[(1) - (2)]) TSRMLS_CC); } break; - case 499: + case 501: { zend_do_push_object(&(yyvsp[(4) - (4)]) TSRMLS_CC); } break; - case 500: + case 502: { zend_do_pop_object(&(yyval) TSRMLS_CC); (yyval).EA = (yyvsp[(1) - (7)]).EA | ((yyvsp[(7) - (7)]).EA ? (yyvsp[(7) - (7)]).EA : (yyvsp[(6) - (7)]).EA); } break; - case 501: + case 503: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 502: + case 504: { (yyval).EA = (yyvsp[(2) - (2)]).EA; } break; - case 503: + case 505: { (yyval).EA = 0; } break; - case 504: + case 506: { zend_do_push_object(&(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 505: + case 507: { (yyval).EA = (yyvsp[(4) - (4)]).EA; } break; - case 506: + case 508: { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 507: + case 509: { (yyvsp[(1) - (4)]).EA = ZEND_PARSED_METHOD_CALL; fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 508: + case 510: { zend_do_pop_object(&(yyval) TSRMLS_CC); zend_do_begin_method_call(&(yyval) TSRMLS_CC); } break; - case 509: + case 511: { zend_do_end_function_call(&(yyvsp[(1) - (2)]), &(yyval), &(yyvsp[(2) - (2)]), 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); } break; - case 510: + case 512: { (yyval) = (yyvsp[(1) - (1)]); (yyval).EA = ZEND_PARSED_METHOD_CALL; zend_do_push_object(&(yyval) TSRMLS_CC); } break; - case 511: + case 513: { (yyval) = (yyvsp[(1) - (1)]); zend_do_push_object(&(yyval) TSRMLS_CC); } break; - case 512: + case 514: { (yyval).EA = ZEND_PARSED_MEMBER; } break; - case 513: + case 515: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 514: + case 516: { zend_do_indirect_references(&(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 515: + case 517: { (yyval) = (yyvsp[(3) - (3)]); zend_do_fetch_static_member(&(yyval), &(yyvsp[(1) - (3)]) TSRMLS_CC); } break; - case 516: + case 518: { (yyval) = (yyvsp[(3) - (3)]); zend_do_fetch_static_member(&(yyval), &(yyvsp[(1) - (3)]) TSRMLS_CC); } break; - case 517: + case 519: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); (yyval)=(yyvsp[(1) - (1)]);; } break; - case 518: + case 520: { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 519: + case 521: { zend_do_begin_variable_parse(TSRMLS_C); (yyvsp[(1) - (1)]).EA = ZEND_PARSED_FUNCTION_CALL; } break; - case 520: + case 522: { fetch_array_dim(&(yyval), &(yyvsp[(1) - (5)]), &(yyvsp[(4) - (5)]) TSRMLS_CC); } break; - case 521: + case 523: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 522: + case 524: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 523: + case 525: { zend_do_begin_variable_parse(TSRMLS_C); (yyval) = (yyvsp[(1) - (1)]); (yyval).EA = ZEND_PARSED_FUNCTION_CALL; } break; - case 524: + case 526: { (yyval) = (yyvsp[(1) - (1)]); (yyval).EA = ZEND_PARSED_VARIABLE; } break; - case 525: + case 527: { zend_do_indirect_references(&(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); (yyval).EA = ZEND_PARSED_VARIABLE; } break; - case 526: + case 528: { (yyval) = (yyvsp[(1) - (1)]); (yyval).EA = ZEND_PARSED_STATIC_MEMBER; } break; - case 527: + case 529: { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 528: + case 530: { fetch_string_offset(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 529: + case 531: { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&(yyval), &(yyvsp[(1) - (1)]), 1 TSRMLS_CC); } break; - case 530: + case 532: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 531: + case 533: { (yyval) = (yyvsp[(3) - (4)]); } break; - case 532: + case 534: { (yyval).op_type = IS_UNUSED; } break; - case 533: + case 535: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 534: + case 536: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 535: + case 537: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); } break; - case 536: + case 538: { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_fetch_property(&(yyval), &tmp_znode, &(yyvsp[(1) - (2)]) TSRMLS_CC);} break; - case 537: + case 539: { fetch_array_dim(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 538: + case 540: { fetch_string_offset(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 539: + case 541: { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_fetch_property(&(yyval), &tmp_znode, &(yyvsp[(1) - (1)]) TSRMLS_CC);} break; - case 540: + case 542: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 541: + case 543: { (yyval) = (yyvsp[(2) - (3)]); } break; - case 542: + case 544: { Z_LVAL((yyval).u.constant) = 1; } break; - case 543: + case 545: { Z_LVAL((yyval).u.constant)++; } break; - case 546: + case 548: { zend_do_add_list_element(&(yyvsp[(1) - (1)]) TSRMLS_CC); } break; - case 547: + case 549: { zend_do_new_list_begin(TSRMLS_C); } break; - case 548: + case 550: { zend_do_new_list_end(TSRMLS_C); } break; - case 549: + case 551: { zend_do_add_list_element(NULL TSRMLS_CC); } break; - case 550: + case 552: { zend_do_init_array(&(yyval), NULL, NULL, 0 TSRMLS_CC); } break; - case 551: + case 553: { (yyval) = (yyvsp[(1) - (2)]); } break; - case 552: + case 554: { zend_do_add_array_element(&(yyval), &(yyvsp[(5) - (5)]), &(yyvsp[(3) - (5)]), 0 TSRMLS_CC); } break; - case 553: + case 555: { zend_do_add_array_element(&(yyval), &(yyvsp[(3) - (3)]), NULL, 0 TSRMLS_CC); } break; - case 554: + case 556: { zend_do_init_array(&(yyval), &(yyvsp[(3) - (3)]), &(yyvsp[(1) - (3)]), 0 TSRMLS_CC); } break; - case 555: + case 557: { zend_do_init_array(&(yyval), &(yyvsp[(1) - (1)]), NULL, 0 TSRMLS_CC); } break; - case 556: + case 558: { zend_do_add_array_element(&(yyval), &(yyvsp[(6) - (6)]), &(yyvsp[(3) - (6)]), 1 TSRMLS_CC); } break; - case 557: + case 559: { zend_do_add_array_element(&(yyval), &(yyvsp[(4) - (4)]), NULL, 1 TSRMLS_CC); } break; - case 558: + case 560: { zend_do_init_array(&(yyval), &(yyvsp[(4) - (4)]), &(yyvsp[(1) - (4)]), 1 TSRMLS_CC); } break; - case 559: + case 561: { zend_do_init_array(&(yyval), &(yyvsp[(2) - (2)]), NULL, 1 TSRMLS_CC); } break; - case 560: + case 562: { zend_do_end_variable_parse(&(yyvsp[(2) - (2)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 561: + case 563: { zend_do_add_string(&(yyval), &(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 562: + case 564: { zend_do_end_variable_parse(&(yyvsp[(1) - (1)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&(yyval), NULL, &(yyvsp[(1) - (1)]) TSRMLS_CC); } break; - case 563: + case 565: { zend_do_add_string(&(yyval), NULL, &(yyvsp[(1) - (2)]) TSRMLS_CC); zend_do_end_variable_parse(&(yyvsp[(2) - (2)]), BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&(yyval), &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 564: + case 566: { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&(yyval), &(yyvsp[(1) - (1)]), 1 TSRMLS_CC); } break; - case 565: + case 567: { zend_do_begin_variable_parse(TSRMLS_C); } break; - case 566: + case 568: { fetch_array_begin(&(yyval), &(yyvsp[(1) - (5)]), &(yyvsp[(4) - (5)]) TSRMLS_CC); } break; - case 567: + case 569: { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&(yyvsp[(2) - (3)]), &(yyvsp[(1) - (3)]), 1 TSRMLS_CC); zend_do_fetch_property(&(yyval), &(yyvsp[(2) - (3)]), &(yyvsp[(3) - (3)]) TSRMLS_CC); } break; - case 568: + case 570: { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&(yyval), &(yyvsp[(2) - (3)]), 1 TSRMLS_CC); } break; - case 569: + case 571: { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_begin(&(yyval), &(yyvsp[(2) - (6)]), &(yyvsp[(4) - (6)]) TSRMLS_CC); } break; - case 570: + case 572: { (yyval) = (yyvsp[(2) - (3)]); } break; - case 571: + case 573: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 572: + case 574: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 573: + case 575: { fetch_simple_variable(&(yyval), &(yyvsp[(1) - (1)]), 1 TSRMLS_CC); } break; - case 574: + case 576: { (yyval) = (yyvsp[(3) - (4)]); } break; - case 575: + case 577: { zend_do_isset_or_isempty(ZEND_ISEMPTY, &(yyval), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 576: + case 578: { zend_do_unary_op(ZEND_BOOL_NOT, &(yyval), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 577: + case 579: { zend_do_include_or_eval(ZEND_INCLUDE, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 578: + case 580: { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 579: + case 581: { zend_do_include_or_eval(ZEND_EVAL, &(yyval), &(yyvsp[(3) - (4)]) TSRMLS_CC); } break; - case 580: + case 582: { zend_do_include_or_eval(ZEND_REQUIRE, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 581: + case 583: { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &(yyval), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 582: + case 584: { (yyval) = (yyvsp[(1) - (1)]); } break; - case 583: + case 585: { zend_do_boolean_and_begin(&(yyvsp[(1) - (2)]), &(yyvsp[(2) - (2)]) TSRMLS_CC); } break; - case 584: + case 586: { zend_do_boolean_and_end(&(yyval), &(yyvsp[(1) - (4)]), &(yyvsp[(4) - (4)]), &(yyvsp[(2) - (4)]) TSRMLS_CC); } break; - case 585: + case 587: { zend_do_isset_or_isempty(ZEND_ISSET, &(yyval), &(yyvsp[(1) - (1)]) TSRMLS_CC); } break; - case 586: + case 588: { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead)"); } break; - case 587: + case 589: { zend_do_fetch_constant(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), ZEND_RT, 0 TSRMLS_CC); } break; - case 588: + case 590: { zend_do_fetch_constant(&(yyval), &(yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)]), ZEND_RT, 0 TSRMLS_CC); } break; - case 589: + case 591: { zend_do_resolve_class_name(&(yyval), &(yyvsp[(1) - (3)]), 1 TSRMLS_CC); } break; - case 590: + case 592: { zend_do_resolve_class_name(&(yyval), &(yyvsp[(1) - (3)]), 0 TSRMLS_CC); } break; diff --git a/Zend/zend_language_parser.h b/Zend/zend_language_parser.h index 253be7779..31819d56d 100644 --- a/Zend/zend_language_parser.h +++ b/Zend/zend_language_parser.h @@ -60,126 +60,128 @@ T_LOGICAL_AND = 265, T_PRINT = 266, T_YIELD = 267, - T_SR_EQUAL = 268, - T_SL_EQUAL = 269, - T_XOR_EQUAL = 270, - T_OR_EQUAL = 271, - T_AND_EQUAL = 272, - T_MOD_EQUAL = 273, - T_CONCAT_EQUAL = 274, - T_DIV_EQUAL = 275, - T_MUL_EQUAL = 276, - T_MINUS_EQUAL = 277, - T_PLUS_EQUAL = 278, - T_BOOLEAN_OR = 279, - T_BOOLEAN_AND = 280, - T_IS_NOT_IDENTICAL = 281, - T_IS_IDENTICAL = 282, - T_IS_NOT_EQUAL = 283, - T_IS_EQUAL = 284, - T_IS_GREATER_OR_EQUAL = 285, - T_IS_SMALLER_OR_EQUAL = 286, - T_SR = 287, - T_SL = 288, - T_INSTANCEOF = 289, - T_UNSET_CAST = 290, - T_BOOL_CAST = 291, - T_OBJECT_CAST = 292, - T_ARRAY_CAST = 293, - T_STRING_CAST = 294, - T_DOUBLE_CAST = 295, - T_INT_CAST = 296, - T_DEC = 297, - T_INC = 298, - T_CLONE = 299, - T_NEW = 300, - T_EXIT = 301, - T_IF = 302, - T_ELSEIF = 303, - T_ELSE = 304, - T_ENDIF = 305, - T_LNUMBER = 306, - T_DNUMBER = 307, - T_STRING = 308, - T_STRING_VARNAME = 309, - T_VARIABLE = 310, - T_NUM_STRING = 311, - T_INLINE_HTML = 312, - T_CHARACTER = 313, - T_BAD_CHARACTER = 314, - T_ENCAPSED_AND_WHITESPACE = 315, - T_CONSTANT_ENCAPSED_STRING = 316, - T_ECHO = 317, - T_DO = 318, - T_WHILE = 319, - T_ENDWHILE = 320, - T_FOR = 321, - T_ENDFOR = 322, - T_FOREACH = 323, - T_ENDFOREACH = 324, - T_DECLARE = 325, - T_ENDDECLARE = 326, - T_AS = 327, - T_SWITCH = 328, - T_ENDSWITCH = 329, - T_CASE = 330, - T_DEFAULT = 331, - T_BREAK = 332, - T_CONTINUE = 333, - T_GOTO = 334, - T_FUNCTION = 335, - T_CONST = 336, - T_RETURN = 337, - T_TRY = 338, - T_CATCH = 339, - T_FINALLY = 340, - T_THROW = 341, - T_USE = 342, - T_INSTEADOF = 343, - T_GLOBAL = 344, - T_PUBLIC = 345, - T_PROTECTED = 346, - T_PRIVATE = 347, - T_FINAL = 348, - T_ABSTRACT = 349, - T_STATIC = 350, - T_VAR = 351, - T_UNSET = 352, - T_ISSET = 353, - T_EMPTY = 354, - T_HALT_COMPILER = 355, - T_CLASS = 356, - T_TRAIT = 357, - T_INTERFACE = 358, - T_EXTENDS = 359, - T_IMPLEMENTS = 360, - T_OBJECT_OPERATOR = 361, - T_DOUBLE_ARROW = 362, - T_LIST = 363, - T_ARRAY = 364, - T_CALLABLE = 365, - T_CLASS_C = 366, - T_TRAIT_C = 367, - T_METHOD_C = 368, - T_FUNC_C = 369, - T_LINE = 370, - T_FILE = 371, - T_COMMENT = 372, - T_DOC_COMMENT = 373, - T_OPEN_TAG = 374, - T_OPEN_TAG_WITH_ECHO = 375, - T_CLOSE_TAG = 376, - T_WHITESPACE = 377, - T_START_HEREDOC = 378, - T_END_HEREDOC = 379, - T_DOLLAR_OPEN_CURLY_BRACES = 380, - T_CURLY_OPEN = 381, - T_PAAMAYIM_NEKUDOTAYIM = 382, - T_NAMESPACE = 383, - T_NS_C = 384, - T_DIR = 385, - T_NS_SEPARATOR = 386, - T_ELLIPSIS = 387 + T_POW_EQUAL = 268, + T_SR_EQUAL = 269, + T_SL_EQUAL = 270, + T_XOR_EQUAL = 271, + T_OR_EQUAL = 272, + T_AND_EQUAL = 273, + T_MOD_EQUAL = 274, + T_CONCAT_EQUAL = 275, + T_DIV_EQUAL = 276, + T_MUL_EQUAL = 277, + T_MINUS_EQUAL = 278, + T_PLUS_EQUAL = 279, + T_BOOLEAN_OR = 280, + T_BOOLEAN_AND = 281, + T_IS_NOT_IDENTICAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_EQUAL = 284, + T_IS_EQUAL = 285, + T_IS_GREATER_OR_EQUAL = 286, + T_IS_SMALLER_OR_EQUAL = 287, + T_SR = 288, + T_SL = 289, + T_INSTANCEOF = 290, + T_UNSET_CAST = 291, + T_BOOL_CAST = 292, + T_OBJECT_CAST = 293, + T_ARRAY_CAST = 294, + T_STRING_CAST = 295, + T_DOUBLE_CAST = 296, + T_INT_CAST = 297, + T_DEC = 298, + T_INC = 299, + T_POW = 300, + T_CLONE = 301, + T_NEW = 302, + T_EXIT = 303, + T_IF = 304, + T_ELSEIF = 305, + T_ELSE = 306, + T_ENDIF = 307, + T_LNUMBER = 308, + T_DNUMBER = 309, + T_STRING = 310, + T_STRING_VARNAME = 311, + T_VARIABLE = 312, + T_NUM_STRING = 313, + T_INLINE_HTML = 314, + T_CHARACTER = 315, + T_BAD_CHARACTER = 316, + T_ENCAPSED_AND_WHITESPACE = 317, + T_CONSTANT_ENCAPSED_STRING = 318, + T_ECHO = 319, + T_DO = 320, + T_WHILE = 321, + T_ENDWHILE = 322, + T_FOR = 323, + T_ENDFOR = 324, + T_FOREACH = 325, + T_ENDFOREACH = 326, + T_DECLARE = 327, + T_ENDDECLARE = 328, + T_AS = 329, + T_SWITCH = 330, + T_ENDSWITCH = 331, + T_CASE = 332, + T_DEFAULT = 333, + T_BREAK = 334, + T_CONTINUE = 335, + T_GOTO = 336, + T_FUNCTION = 337, + T_CONST = 338, + T_RETURN = 339, + T_TRY = 340, + T_CATCH = 341, + T_FINALLY = 342, + T_THROW = 343, + T_USE = 344, + T_INSTEADOF = 345, + T_GLOBAL = 346, + T_PUBLIC = 347, + T_PROTECTED = 348, + T_PRIVATE = 349, + T_FINAL = 350, + T_ABSTRACT = 351, + T_STATIC = 352, + T_VAR = 353, + T_UNSET = 354, + T_ISSET = 355, + T_EMPTY = 356, + T_HALT_COMPILER = 357, + T_CLASS = 358, + T_TRAIT = 359, + T_INTERFACE = 360, + T_EXTENDS = 361, + T_IMPLEMENTS = 362, + T_OBJECT_OPERATOR = 363, + T_DOUBLE_ARROW = 364, + T_LIST = 365, + T_ARRAY = 366, + T_CALLABLE = 367, + T_CLASS_C = 368, + T_TRAIT_C = 369, + T_METHOD_C = 370, + T_FUNC_C = 371, + T_LINE = 372, + T_FILE = 373, + T_COMMENT = 374, + T_DOC_COMMENT = 375, + T_OPEN_TAG = 376, + T_OPEN_TAG_WITH_ECHO = 377, + T_CLOSE_TAG = 378, + T_WHITESPACE = 379, + T_START_HEREDOC = 380, + T_END_HEREDOC = 381, + T_DOLLAR_OPEN_CURLY_BRACES = 382, + T_CURLY_OPEN = 383, + T_PAAMAYIM_NEKUDOTAYIM = 384, + T_NAMESPACE = 385, + T_NS_C = 386, + T_DIR = 387, + T_NS_SEPARATOR = 388, + T_ELLIPSIS = 389 }; #endif /* Tokens. */ @@ -194,126 +196,128 @@ #define T_LOGICAL_AND 265 #define T_PRINT 266 #define T_YIELD 267 -#define T_SR_EQUAL 268 -#define T_SL_EQUAL 269 -#define T_XOR_EQUAL 270 -#define T_OR_EQUAL 271 -#define T_AND_EQUAL 272 -#define T_MOD_EQUAL 273 -#define T_CONCAT_EQUAL 274 -#define T_DIV_EQUAL 275 -#define T_MUL_EQUAL 276 -#define T_MINUS_EQUAL 277 -#define T_PLUS_EQUAL 278 -#define T_BOOLEAN_OR 279 -#define T_BOOLEAN_AND 280 -#define T_IS_NOT_IDENTICAL 281 -#define T_IS_IDENTICAL 282 -#define T_IS_NOT_EQUAL 283 -#define T_IS_EQUAL 284 -#define T_IS_GREATER_OR_EQUAL 285 -#define T_IS_SMALLER_OR_EQUAL 286 -#define T_SR 287 -#define T_SL 288 -#define T_INSTANCEOF 289 -#define T_UNSET_CAST 290 -#define T_BOOL_CAST 291 -#define T_OBJECT_CAST 292 -#define T_ARRAY_CAST 293 -#define T_STRING_CAST 294 -#define T_DOUBLE_CAST 295 -#define T_INT_CAST 296 -#define T_DEC 297 -#define T_INC 298 -#define T_CLONE 299 -#define T_NEW 300 -#define T_EXIT 301 -#define T_IF 302 -#define T_ELSEIF 303 -#define T_ELSE 304 -#define T_ENDIF 305 -#define T_LNUMBER 306 -#define T_DNUMBER 307 -#define T_STRING 308 -#define T_STRING_VARNAME 309 -#define T_VARIABLE 310 -#define T_NUM_STRING 311 -#define T_INLINE_HTML 312 -#define T_CHARACTER 313 -#define T_BAD_CHARACTER 314 -#define T_ENCAPSED_AND_WHITESPACE 315 -#define T_CONSTANT_ENCAPSED_STRING 316 -#define T_ECHO 317 -#define T_DO 318 -#define T_WHILE 319 -#define T_ENDWHILE 320 -#define T_FOR 321 -#define T_ENDFOR 322 -#define T_FOREACH 323 -#define T_ENDFOREACH 324 -#define T_DECLARE 325 -#define T_ENDDECLARE 326 -#define T_AS 327 -#define T_SWITCH 328 -#define T_ENDSWITCH 329 -#define T_CASE 330 -#define T_DEFAULT 331 -#define T_BREAK 332 -#define T_CONTINUE 333 -#define T_GOTO 334 -#define T_FUNCTION 335 -#define T_CONST 336 -#define T_RETURN 337 -#define T_TRY 338 -#define T_CATCH 339 -#define T_FINALLY 340 -#define T_THROW 341 -#define T_USE 342 -#define T_INSTEADOF 343 -#define T_GLOBAL 344 -#define T_PUBLIC 345 -#define T_PROTECTED 346 -#define T_PRIVATE 347 -#define T_FINAL 348 -#define T_ABSTRACT 349 -#define T_STATIC 350 -#define T_VAR 351 -#define T_UNSET 352 -#define T_ISSET 353 -#define T_EMPTY 354 -#define T_HALT_COMPILER 355 -#define T_CLASS 356 -#define T_TRAIT 357 -#define T_INTERFACE 358 -#define T_EXTENDS 359 -#define T_IMPLEMENTS 360 -#define T_OBJECT_OPERATOR 361 -#define T_DOUBLE_ARROW 362 -#define T_LIST 363 -#define T_ARRAY 364 -#define T_CALLABLE 365 -#define T_CLASS_C 366 -#define T_TRAIT_C 367 -#define T_METHOD_C 368 -#define T_FUNC_C 369 -#define T_LINE 370 -#define T_FILE 371 -#define T_COMMENT 372 -#define T_DOC_COMMENT 373 -#define T_OPEN_TAG 374 -#define T_OPEN_TAG_WITH_ECHO 375 -#define T_CLOSE_TAG 376 -#define T_WHITESPACE 377 -#define T_START_HEREDOC 378 -#define T_END_HEREDOC 379 -#define T_DOLLAR_OPEN_CURLY_BRACES 380 -#define T_CURLY_OPEN 381 -#define T_PAAMAYIM_NEKUDOTAYIM 382 -#define T_NAMESPACE 383 -#define T_NS_C 384 -#define T_DIR 385 -#define T_NS_SEPARATOR 386 -#define T_ELLIPSIS 387 +#define T_POW_EQUAL 268 +#define T_SR_EQUAL 269 +#define T_SL_EQUAL 270 +#define T_XOR_EQUAL 271 +#define T_OR_EQUAL 272 +#define T_AND_EQUAL 273 +#define T_MOD_EQUAL 274 +#define T_CONCAT_EQUAL 275 +#define T_DIV_EQUAL 276 +#define T_MUL_EQUAL 277 +#define T_MINUS_EQUAL 278 +#define T_PLUS_EQUAL 279 +#define T_BOOLEAN_OR 280 +#define T_BOOLEAN_AND 281 +#define T_IS_NOT_IDENTICAL 282 +#define T_IS_IDENTICAL 283 +#define T_IS_NOT_EQUAL 284 +#define T_IS_EQUAL 285 +#define T_IS_GREATER_OR_EQUAL 286 +#define T_IS_SMALLER_OR_EQUAL 287 +#define T_SR 288 +#define T_SL 289 +#define T_INSTANCEOF 290 +#define T_UNSET_CAST 291 +#define T_BOOL_CAST 292 +#define T_OBJECT_CAST 293 +#define T_ARRAY_CAST 294 +#define T_STRING_CAST 295 +#define T_DOUBLE_CAST 296 +#define T_INT_CAST 297 +#define T_DEC 298 +#define T_INC 299 +#define T_POW 300 +#define T_CLONE 301 +#define T_NEW 302 +#define T_EXIT 303 +#define T_IF 304 +#define T_ELSEIF 305 +#define T_ELSE 306 +#define T_ENDIF 307 +#define T_LNUMBER 308 +#define T_DNUMBER 309 +#define T_STRING 310 +#define T_STRING_VARNAME 311 +#define T_VARIABLE 312 +#define T_NUM_STRING 313 +#define T_INLINE_HTML 314 +#define T_CHARACTER 315 +#define T_BAD_CHARACTER 316 +#define T_ENCAPSED_AND_WHITESPACE 317 +#define T_CONSTANT_ENCAPSED_STRING 318 +#define T_ECHO 319 +#define T_DO 320 +#define T_WHILE 321 +#define T_ENDWHILE 322 +#define T_FOR 323 +#define T_ENDFOR 324 +#define T_FOREACH 325 +#define T_ENDFOREACH 326 +#define T_DECLARE 327 +#define T_ENDDECLARE 328 +#define T_AS 329 +#define T_SWITCH 330 +#define T_ENDSWITCH 331 +#define T_CASE 332 +#define T_DEFAULT 333 +#define T_BREAK 334 +#define T_CONTINUE 335 +#define T_GOTO 336 +#define T_FUNCTION 337 +#define T_CONST 338 +#define T_RETURN 339 +#define T_TRY 340 +#define T_CATCH 341 +#define T_FINALLY 342 +#define T_THROW 343 +#define T_USE 344 +#define T_INSTEADOF 345 +#define T_GLOBAL 346 +#define T_PUBLIC 347 +#define T_PROTECTED 348 +#define T_PRIVATE 349 +#define T_FINAL 350 +#define T_ABSTRACT 351 +#define T_STATIC 352 +#define T_VAR 353 +#define T_UNSET 354 +#define T_ISSET 355 +#define T_EMPTY 356 +#define T_HALT_COMPILER 357 +#define T_CLASS 358 +#define T_TRAIT 359 +#define T_INTERFACE 360 +#define T_EXTENDS 361 +#define T_IMPLEMENTS 362 +#define T_OBJECT_OPERATOR 363 +#define T_DOUBLE_ARROW 364 +#define T_LIST 365 +#define T_ARRAY 366 +#define T_CALLABLE 367 +#define T_CLASS_C 368 +#define T_TRAIT_C 369 +#define T_METHOD_C 370 +#define T_FUNC_C 371 +#define T_LINE 372 +#define T_FILE 373 +#define T_COMMENT 374 +#define T_DOC_COMMENT 375 +#define T_OPEN_TAG 376 +#define T_OPEN_TAG_WITH_ECHO 377 +#define T_CLOSE_TAG 378 +#define T_WHITESPACE 379 +#define T_START_HEREDOC 380 +#define T_END_HEREDOC 381 +#define T_DOLLAR_OPEN_CURLY_BRACES 382 +#define T_CURLY_OPEN 383 +#define T_PAAMAYIM_NEKUDOTAYIM 384 +#define T_NAMESPACE 385 +#define T_NS_C 386 +#define T_DIR 387 +#define T_NS_SEPARATOR 388 +#define T_ELLIPSIS 389 diff --git a/Zend/zend_language_parser.output b/Zend/zend_language_parser.output index af10f97ef..76336fe6d 100644 --- a/Zend/zend_language_parser.output +++ b/Zend/zend_language_parser.output @@ -11,7 +11,7 @@ Terminals unused in grammar State 231 conflicts: 1 shift/reduce -State 732 conflicts: 2 shift/reduce +State 736 conflicts: 2 shift/reduce Grammar @@ -458,1084 +458,1088 @@ Grammar 283 | variable "+= (T_PLUS_EQUAL)" expr 284 | variable "-= (T_MINUS_EQUAL)" expr 285 | variable "*= (T_MUL_EQUAL)" expr - 286 | variable "/= (T_DIV_EQUAL)" expr - 287 | variable ".= (T_CONCAT_EQUAL)" expr - 288 | variable "%= (T_MOD_EQUAL)" expr - 289 | variable "&= (T_AND_EQUAL)" expr - 290 | variable "|= (T_OR_EQUAL)" expr - 291 | variable "^= (T_XOR_EQUAL)" expr - 292 | variable "<<= (T_SL_EQUAL)" expr - 293 | variable ">>= (T_SR_EQUAL)" expr - 294 | rw_variable "++ (T_INC)" - 295 | "++ (T_INC)" rw_variable - 296 | rw_variable "-- (T_DEC)" - 297 | "-- (T_DEC)" rw_variable - - 298 $@47: /* empty */ - - 299 expr_without_variable: expr "|| (T_BOOLEAN_OR)" $@47 expr - - 300 $@48: /* empty */ - - 301 expr_without_variable: expr "&& (T_BOOLEAN_AND)" $@48 expr - - 302 $@49: /* empty */ + 286 | variable "**= (T_POW_EQUAL)" expr + 287 | variable "/= (T_DIV_EQUAL)" expr + 288 | variable ".= (T_CONCAT_EQUAL)" expr + 289 | variable "%= (T_MOD_EQUAL)" expr + 290 | variable "&= (T_AND_EQUAL)" expr + 291 | variable "|= (T_OR_EQUAL)" expr + 292 | variable "^= (T_XOR_EQUAL)" expr + 293 | variable "<<= (T_SL_EQUAL)" expr + 294 | variable ">>= (T_SR_EQUAL)" expr + 295 | rw_variable "++ (T_INC)" + 296 | "++ (T_INC)" rw_variable + 297 | rw_variable "-- (T_DEC)" + 298 | "-- (T_DEC)" rw_variable + + 299 $@47: /* empty */ + + 300 expr_without_variable: expr "|| (T_BOOLEAN_OR)" $@47 expr + + 301 $@48: /* empty */ + + 302 expr_without_variable: expr "&& (T_BOOLEAN_AND)" $@48 expr + + 303 $@49: /* empty */ + + 304 expr_without_variable: expr "or (T_LOGICAL_OR)" $@49 expr + + 305 $@50: /* empty */ + + 306 expr_without_variable: expr "and (T_LOGICAL_AND)" $@50 expr + 307 | expr "xor (T_LOGICAL_XOR)" expr + 308 | expr '|' expr + 309 | expr '&' expr + 310 | expr '^' expr + 311 | expr '.' expr + 312 | expr '+' expr + 313 | expr '-' expr + 314 | expr '*' expr + 315 | expr "** (T_POW)" expr + 316 | expr '/' expr + 317 | expr '%' expr + 318 | expr "<< (T_SL)" expr + 319 | expr ">> (T_SR)" expr + 320 | '+' expr + 321 | '-' expr + 322 | '!' expr + 323 | '~' expr + 324 | expr "=== (T_IS_IDENTICAL)" expr + 325 | expr "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr "== (T_IS_EQUAL)" expr + 327 | expr "!= (T_IS_NOT_EQUAL)" expr + 328 | expr '<' expr + 329 | expr "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr '>' expr + 331 | expr ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr "instanceof (T_INSTANCEOF)" class_name_reference + 333 | parenthesis_expr + 334 | new_expr - 303 expr_without_variable: expr "or (T_LOGICAL_OR)" $@49 expr + 335 @51: /* empty */ - 304 $@50: /* empty */ + 336 expr_without_variable: '(' new_expr ')' @51 instance_call - 305 expr_without_variable: expr "and (T_LOGICAL_AND)" $@50 expr - 306 | expr "xor (T_LOGICAL_XOR)" expr - 307 | expr '|' expr - 308 | expr '&' expr - 309 | expr '^' expr - 310 | expr '.' expr - 311 | expr '+' expr - 312 | expr '-' expr - 313 | expr '*' expr - 314 | expr '/' expr - 315 | expr '%' expr - 316 | expr "<< (T_SL)" expr - 317 | expr ">> (T_SR)" expr - 318 | '+' expr - 319 | '-' expr - 320 | '!' expr - 321 | '~' expr - 322 | expr "=== (T_IS_IDENTICAL)" expr - 323 | expr "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr "== (T_IS_EQUAL)" expr - 325 | expr "!= (T_IS_NOT_EQUAL)" expr - 326 | expr '<' expr - 327 | expr "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr '>' expr - 329 | expr ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr "instanceof (T_INSTANCEOF)" class_name_reference - 331 | parenthesis_expr - 332 | new_expr + 337 $@52: /* empty */ - 333 @51: /* empty */ + 338 $@53: /* empty */ - 334 expr_without_variable: '(' new_expr ')' @51 instance_call + 339 expr_without_variable: expr '?' $@52 expr ':' $@53 expr - 335 $@52: /* empty */ + 340 $@54: /* empty */ - 336 $@53: /* empty */ + 341 expr_without_variable: expr '?' ':' $@54 expr + 342 | internal_functions_in_yacc + 343 | "(int) (T_INT_CAST)" expr + 344 | "(double) (T_DOUBLE_CAST)" expr + 345 | "(string) (T_STRING_CAST)" expr + 346 | "(array) (T_ARRAY_CAST)" expr + 347 | "(object) (T_OBJECT_CAST)" expr + 348 | "(bool) (T_BOOL_CAST)" expr + 349 | "(unset) (T_UNSET_CAST)" expr + 350 | "exit (T_EXIT)" exit_expr - 337 expr_without_variable: expr '?' $@52 expr ':' $@53 expr + 351 $@55: /* empty */ - 338 $@54: /* empty */ + 352 expr_without_variable: '@' $@55 expr + 353 | scalar + 354 | combined_scalar_offset + 355 | combined_scalar + 356 | '`' backticks_expr '`' + 357 | "print (T_PRINT)" expr + 358 | "yield (T_YIELD)" - 339 expr_without_variable: expr '?' ':' $@54 expr - 340 | internal_functions_in_yacc - 341 | "(int) (T_INT_CAST)" expr - 342 | "(double) (T_DOUBLE_CAST)" expr - 343 | "(string) (T_STRING_CAST)" expr - 344 | "(array) (T_ARRAY_CAST)" expr - 345 | "(object) (T_OBJECT_CAST)" expr - 346 | "(bool) (T_BOOL_CAST)" expr - 347 | "(unset) (T_UNSET_CAST)" expr - 348 | "exit (T_EXIT)" exit_expr + 359 @56: /* empty */ - 349 $@55: /* empty */ + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - 350 expr_without_variable: '@' $@55 expr - 351 | scalar - 352 | combined_scalar_offset - 353 | combined_scalar - 354 | '`' backticks_expr '`' - 355 | "print (T_PRINT)" expr - 356 | "yield (T_YIELD)" + 361 @57: /* empty */ - 357 @56: /* empty */ + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 363 yield_expr: "yield (T_YIELD)" expr_without_variable + 364 | "yield (T_YIELD)" variable + 365 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" expr_without_variable + 366 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" variable - 359 @57: /* empty */ + 367 combined_scalar_offset: combined_scalar '[' dim_offset ']' + 368 | combined_scalar_offset '[' dim_offset ']' + 369 | "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset ']' - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 370 combined_scalar: "array (T_ARRAY)" '(' array_pair_list ')' + 371 | '[' array_pair_list ']' - 361 yield_expr: "yield (T_YIELD)" expr_without_variable - 362 | "yield (T_YIELD)" variable - 363 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" expr_without_variable - 364 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" variable + 372 function: "function (T_FUNCTION)" - 365 combined_scalar_offset: combined_scalar '[' dim_offset ']' - 366 | combined_scalar_offset '[' dim_offset ']' - 367 | "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset ']' + 373 lexical_vars: /* empty */ + 374 | "use (T_USE)" '(' lexical_var_list ')' - 368 combined_scalar: "array (T_ARRAY)" '(' array_pair_list ')' - 369 | '[' array_pair_list ']' + 375 lexical_var_list: lexical_var_list ',' "variable (T_VARIABLE)" + 376 | lexical_var_list ',' '&' "variable (T_VARIABLE)" + 377 | "variable (T_VARIABLE)" + 378 | '&' "variable (T_VARIABLE)" - 370 function: "function (T_FUNCTION)" + 379 @58: /* empty */ - 371 lexical_vars: /* empty */ - 372 | "use (T_USE)" '(' lexical_var_list ')' + 380 function_call: namespace_name @58 function_call_parameter_list - 373 lexical_var_list: lexical_var_list ',' "variable (T_VARIABLE)" - 374 | lexical_var_list ',' '&' "variable (T_VARIABLE)" - 375 | "variable (T_VARIABLE)" - 376 | '&' "variable (T_VARIABLE)" + 381 @59: /* empty */ - 377 @58: /* empty */ + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list - 378 function_call: namespace_name @58 function_call_parameter_list + 383 @60: /* empty */ - 379 @59: /* empty */ + 384 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 function_call_parameter_list - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list + 385 @61: /* empty */ - 381 @60: /* empty */ + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list - 382 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 function_call_parameter_list + 387 $@62: /* empty */ - 383 @61: /* empty */ + 388 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list + 389 $@63: /* empty */ - 385 $@62: /* empty */ + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list - 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list + 391 $@64: /* empty */ - 387 $@63: /* empty */ + 392 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list + 393 $@65: /* empty */ - 389 $@64: /* empty */ + 394 function_call: variable_without_objects $@65 function_call_parameter_list - 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list + 395 class_name: "static (T_STATIC)" + 396 | namespace_name + 397 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name + 398 | "\\ (T_NS_SEPARATOR)" namespace_name - 391 $@65: /* empty */ + 399 fully_qualified_class_name: namespace_name + 400 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name + 401 | "\\ (T_NS_SEPARATOR)" namespace_name - 392 function_call: variable_without_objects $@65 function_call_parameter_list + 402 class_name_reference: class_name + 403 | dynamic_class_name_reference - 393 class_name: "static (T_STATIC)" - 394 | namespace_name - 395 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name - 396 | "\\ (T_NS_SEPARATOR)" namespace_name + 404 $@66: /* empty */ - 397 fully_qualified_class_name: namespace_name - 398 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name - 399 | "\\ (T_NS_SEPARATOR)" namespace_name + 405 $@67: /* empty */ + + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties + 407 | base_variable + + 408 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties dynamic_class_name_variable_property + 409 | /* empty */ - 400 class_name_reference: class_name - 401 | dynamic_class_name_reference + 410 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" object_property - 402 $@66: /* empty */ + 411 exit_expr: /* empty */ + 412 | '(' ')' + 413 | parenthesis_expr - 403 $@67: /* empty */ - - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties - 405 | base_variable - - 406 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties dynamic_class_name_variable_property - 407 | /* empty */ + 414 backticks_expr: /* empty */ + 415 | "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" + 416 | encaps_list - 408 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" object_property + 417 ctor_arguments: /* empty */ + 418 | function_call_parameter_list - 409 exit_expr: /* empty */ - 410 | '(' ')' - 411 | parenthesis_expr + 419 common_scalar: "integer number (T_LNUMBER)" + 420 | "floating-point number (T_DNUMBER)" + 421 | "quoted-string (T_CONSTANT_ENCAPSED_STRING)" + 422 | "__LINE__ (T_LINE)" + 423 | "__FILE__ (T_FILE)" + 424 | "__DIR__ (T_DIR)" + 425 | "__TRAIT__ (T_TRAIT_C)" + 426 | "__METHOD__ (T_METHOD_C)" + 427 | "__FUNCTION__ (T_FUNC_C)" + 428 | "__NAMESPACE__ (T_NS_C)" + 429 | "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" + 430 | "heredoc start (T_START_HEREDOC)" "heredoc end (T_END_HEREDOC)" - 412 backticks_expr: /* empty */ - 413 | "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" - 414 | encaps_list + 431 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - 415 ctor_arguments: /* empty */ - 416 | function_call_parameter_list + 432 static_scalar: static_scalar_value + 433 | "array (T_ARRAY)" '(' static_array_pair_list ')' + 434 | '[' static_array_pair_list ']' - 417 common_scalar: "integer number (T_LNUMBER)" - 418 | "floating-point number (T_DNUMBER)" - 419 | "quoted-string (T_CONSTANT_ENCAPSED_STRING)" - 420 | "__LINE__ (T_LINE)" - 421 | "__FILE__ (T_FILE)" - 422 | "__DIR__ (T_DIR)" - 423 | "__TRAIT__ (T_TRAIT_C)" - 424 | "__METHOD__ (T_METHOD_C)" - 425 | "__FUNCTION__ (T_FUNC_C)" - 426 | "__NAMESPACE__ (T_NS_C)" - 427 | "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" - 428 | "heredoc start (T_START_HEREDOC)" "heredoc end (T_END_HEREDOC)" + 435 static_scalar_value: common_scalar + 436 | static_class_name_scalar + 437 | namespace_name + 438 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name + 439 | "\\ (T_NS_SEPARATOR)" namespace_name + 440 | static_class_constant + 441 | "__CLASS__ (T_CLASS_C)" + 442 | static_operation - 429 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" + 443 static_operation: static_scalar_value '+' static_scalar_value + 444 | static_scalar_value '-' static_scalar_value + 445 | static_scalar_value '*' static_scalar_value + 446 | static_scalar_value '/' static_scalar_value + 447 | static_scalar_value '%' static_scalar_value + 448 | '!' static_scalar_value + 449 | '~' static_scalar_value + 450 | static_scalar_value '|' static_scalar_value + 451 | static_scalar_value '&' static_scalar_value + 452 | static_scalar_value '^' static_scalar_value + 453 | static_scalar_value "<< (T_SL)" static_scalar_value + 454 | static_scalar_value ">> (T_SR)" static_scalar_value + 455 | static_scalar_value '.' static_scalar_value + 456 | static_scalar_value "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value '<' static_scalar_value + 466 | static_scalar_value '>' static_scalar_value + 467 | static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value '?' ':' static_scalar_value + 470 | static_scalar_value '?' static_scalar_value ':' static_scalar_value + 471 | '+' static_scalar_value + 472 | '-' static_scalar_value + 473 | '(' static_scalar_value ')' - 430 static_scalar: static_scalar_value - 431 | "array (T_ARRAY)" '(' static_array_pair_list ')' - 432 | '[' static_array_pair_list ']' + 474 scalar: "variable name (T_STRING_VARNAME)" + 475 | class_name_scalar + 476 | class_constant + 477 | namespace_name + 478 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name + 479 | "\\ (T_NS_SEPARATOR)" namespace_name + 480 | common_scalar + 481 | '"' encaps_list '"' + 482 | "heredoc start (T_START_HEREDOC)" encaps_list "heredoc end (T_END_HEREDOC)" + 483 | "__CLASS__ (T_CLASS_C)" - 433 static_scalar_value: common_scalar - 434 | static_class_name_scalar - 435 | namespace_name - 436 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name - 437 | "\\ (T_NS_SEPARATOR)" namespace_name - 438 | static_class_constant - 439 | "__CLASS__ (T_CLASS_C)" - 440 | static_operation + 484 static_array_pair_list: /* empty */ + 485 | non_empty_static_array_pair_list possible_comma - 441 static_operation: static_scalar_value '+' static_scalar_value - 442 | static_scalar_value '-' static_scalar_value - 443 | static_scalar_value '*' static_scalar_value - 444 | static_scalar_value '/' static_scalar_value - 445 | static_scalar_value '%' static_scalar_value - 446 | '!' static_scalar_value - 447 | '~' static_scalar_value - 448 | static_scalar_value '|' static_scalar_value - 449 | static_scalar_value '&' static_scalar_value - 450 | static_scalar_value '^' static_scalar_value - 451 | static_scalar_value "<< (T_SL)" static_scalar_value - 452 | static_scalar_value ">> (T_SR)" static_scalar_value - 453 | static_scalar_value '.' static_scalar_value - 454 | static_scalar_value "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value '<' static_scalar_value - 464 | static_scalar_value '>' static_scalar_value - 465 | static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value '?' ':' static_scalar_value - 468 | static_scalar_value '?' static_scalar_value ':' static_scalar_value - 469 | '+' static_scalar_value - 470 | '-' static_scalar_value - 471 | '(' static_scalar_value ')' + 486 possible_comma: /* empty */ + 487 | ',' - 472 scalar: "variable name (T_STRING_VARNAME)" - 473 | class_name_scalar - 474 | class_constant - 475 | namespace_name - 476 | "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name - 477 | "\\ (T_NS_SEPARATOR)" namespace_name - 478 | common_scalar - 479 | '"' encaps_list '"' - 480 | "heredoc start (T_START_HEREDOC)" encaps_list "heredoc end (T_END_HEREDOC)" - 481 | "__CLASS__ (T_CLASS_C)" + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar + 489 | non_empty_static_array_pair_list ',' static_scalar + 490 | static_scalar "=> (T_DOUBLE_ARROW)" static_scalar + 491 | static_scalar - 482 static_array_pair_list: /* empty */ - 483 | non_empty_static_array_pair_list possible_comma + 492 expr: r_variable + 493 | expr_without_variable - 484 possible_comma: /* empty */ - 485 | ',' + 494 parenthesis_expr: '(' expr ')' + 495 | '(' yield_expr ')' - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar - 487 | non_empty_static_array_pair_list ',' static_scalar - 488 | static_scalar "=> (T_DOUBLE_ARROW)" static_scalar - 489 | static_scalar + 496 r_variable: variable - 490 expr: r_variable - 491 | expr_without_variable + 497 w_variable: variable - 492 parenthesis_expr: '(' expr ')' - 493 | '(' yield_expr ')' + 498 rw_variable: variable - 494 r_variable: variable + 499 $@68: /* empty */ - 495 w_variable: variable + 500 $@69: /* empty */ - 496 rw_variable: variable + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties + 502 | base_variable_with_function_calls - 497 $@68: /* empty */ + 503 variable_properties: variable_properties variable_property + 504 | /* empty */ - 498 $@69: /* empty */ + 505 $@70: /* empty */ - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties - 500 | base_variable_with_function_calls + 506 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 method_or_not - 501 variable_properties: variable_properties variable_property - 502 | /* empty */ + 507 array_method_dereference: array_method_dereference '[' dim_offset ']' + 508 | method '[' dim_offset ']' - 503 $@70: /* empty */ + 509 @71: /* empty */ - 504 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 method_or_not + 510 method: @71 function_call_parameter_list - 505 array_method_dereference: array_method_dereference '[' dim_offset ']' - 506 | method '[' dim_offset ']' + 511 method_or_not: method + 512 | array_method_dereference + 513 | /* empty */ - 507 @71: /* empty */ + 514 variable_without_objects: reference_variable + 515 | simple_indirect_reference reference_variable - 508 method: @71 function_call_parameter_list + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 517 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - 509 method_or_not: method - 510 | array_method_dereference - 511 | /* empty */ + 518 variable_class_name: reference_variable - 512 variable_without_objects: reference_variable - 513 | simple_indirect_reference reference_variable + 519 array_function_dereference: array_function_dereference '[' dim_offset ']' - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - 515 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 520 $@72: /* empty */ - 516 variable_class_name: reference_variable + 521 array_function_dereference: function_call $@72 '[' dim_offset ']' - 517 array_function_dereference: array_function_dereference '[' dim_offset ']' + 522 base_variable_with_function_calls: base_variable + 523 | array_function_dereference + 524 | function_call - 518 $@72: /* empty */ + 525 base_variable: reference_variable + 526 | simple_indirect_reference reference_variable + 527 | static_member - 519 array_function_dereference: function_call $@72 '[' dim_offset ']' + 528 reference_variable: reference_variable '[' dim_offset ']' + 529 | reference_variable '{' expr '}' + 530 | compound_variable - 520 base_variable_with_function_calls: base_variable - 521 | array_function_dereference - 522 | function_call + 531 compound_variable: "variable (T_VARIABLE)" + 532 | '$' '{' expr '}' - 523 base_variable: reference_variable - 524 | simple_indirect_reference reference_variable - 525 | static_member + 533 dim_offset: /* empty */ + 534 | expr - 526 reference_variable: reference_variable '[' dim_offset ']' - 527 | reference_variable '{' expr '}' - 528 | compound_variable + 535 object_property: object_dim_list - 529 compound_variable: "variable (T_VARIABLE)" - 530 | '$' '{' expr '}' + 536 $@73: /* empty */ - 531 dim_offset: /* empty */ - 532 | expr + 537 object_property: variable_without_objects $@73 - 533 object_property: object_dim_list + 538 object_dim_list: object_dim_list '[' dim_offset ']' + 539 | object_dim_list '{' expr '}' + 540 | variable_name - 534 $@73: /* empty */ + 541 variable_name: "identifier (T_STRING)" + 542 | '{' expr '}' - 535 object_property: variable_without_objects $@73 + 543 simple_indirect_reference: '$' + 544 | simple_indirect_reference '$' - 536 object_dim_list: object_dim_list '[' dim_offset ']' - 537 | object_dim_list '{' expr '}' - 538 | variable_name + 545 assignment_list: assignment_list ',' assignment_list_element + 546 | assignment_list_element - 539 variable_name: "identifier (T_STRING)" - 540 | '{' expr '}' + 547 assignment_list_element: variable - 541 simple_indirect_reference: '$' - 542 | simple_indirect_reference '$' + 548 $@74: /* empty */ - 543 assignment_list: assignment_list ',' assignment_list_element - 544 | assignment_list_element + 549 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list ')' + 550 | /* empty */ - 545 assignment_list_element: variable + 551 array_pair_list: /* empty */ + 552 | non_empty_array_pair_list possible_comma - 546 $@74: /* empty */ + 553 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" expr + 554 | non_empty_array_pair_list ',' expr + 555 | expr "=> (T_DOUBLE_ARROW)" expr + 556 | expr + 557 | non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable + 558 | non_empty_array_pair_list ',' '&' w_variable + 559 | expr "=> (T_DOUBLE_ARROW)" '&' w_variable + 560 | '&' w_variable - 547 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list ')' - 548 | /* empty */ + 561 encaps_list: encaps_list encaps_var + 562 | encaps_list "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" + 563 | encaps_var + 564 | "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" encaps_var - 549 array_pair_list: /* empty */ - 550 | non_empty_array_pair_list possible_comma + 565 encaps_var: "variable (T_VARIABLE)" - 551 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" expr - 552 | non_empty_array_pair_list ',' expr - 553 | expr "=> (T_DOUBLE_ARROW)" expr - 554 | expr - 555 | non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable - 556 | non_empty_array_pair_list ',' '&' w_variable - 557 | expr "=> (T_DOUBLE_ARROW)" '&' w_variable - 558 | '&' w_variable + 566 $@75: /* empty */ - 559 encaps_list: encaps_list encaps_var - 560 | encaps_list "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" - 561 | encaps_var - 562 | "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" encaps_var + 567 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset ']' + 568 | "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" + 569 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr '}' + 570 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' '}' + 571 | "{$ (T_CURLY_OPEN)" variable '}' - 563 encaps_var: "variable (T_VARIABLE)" + 572 encaps_var_offset: "identifier (T_STRING)" + 573 | "number (T_NUM_STRING)" + 574 | "variable (T_VARIABLE)" - 564 $@75: /* empty */ + 575 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables ')' + 576 | "empty (T_EMPTY)" '(' variable ')' + 577 | "empty (T_EMPTY)" '(' expr_without_variable ')' + 578 | "include (T_INCLUDE)" expr + 579 | "include_once (T_INCLUDE_ONCE)" expr + 580 | "eval (T_EVAL)" '(' expr ')' + 581 | "require (T_REQUIRE)" expr + 582 | "require_once (T_REQUIRE_ONCE)" expr - 565 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset ']' - 566 | "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" - 567 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr '}' - 568 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' '}' - 569 | "{$ (T_CURLY_OPEN)" variable '}' + 583 isset_variables: isset_variable - 570 encaps_var_offset: "identifier (T_STRING)" - 571 | "number (T_NUM_STRING)" - 572 | "variable (T_VARIABLE)" + 584 $@76: /* empty */ - 573 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables ')' - 574 | "empty (T_EMPTY)" '(' variable ')' - 575 | "empty (T_EMPTY)" '(' expr_without_variable ')' - 576 | "include (T_INCLUDE)" expr - 577 | "include_once (T_INCLUDE_ONCE)" expr - 578 | "eval (T_EVAL)" '(' expr ')' - 579 | "require (T_REQUIRE)" expr - 580 | "require_once (T_REQUIRE_ONCE)" expr + 585 isset_variables: isset_variables ',' $@76 isset_variable - 581 isset_variables: isset_variable + 586 isset_variable: variable + 587 | expr_without_variable - 582 $@76: /* empty */ + 588 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" + 589 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - 583 isset_variables: isset_variables ',' $@76 isset_variable + 590 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" - 584 isset_variable: variable - 585 | expr_without_variable - - 586 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - 587 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - - 588 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" - - 589 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" + 591 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" Terminals, with rules where they appear "end of file" (0) 0 -'!' (33) 320 446 -'"' (34) 479 -'$' (36) 201 202 530 541 542 -'%' (37) 315 445 -'&' (38) 118 143 192 196 279 281 308 374 376 449 555 556 557 558 -'(' (40) 10 46 65 81 84 87 89 101 111 122 145 187 188 189 214 277 334 - 358 360 368 372 410 431 471 492 493 547 573 574 575 578 -')' (41) 10 46 65 81 84 87 89 101 111 122 145 187 188 189 214 277 334 - 358 360 368 372 410 431 471 492 493 547 573 574 575 578 -'*' (42) 313 443 -'+' (43) 311 318 441 469 +'!' (33) 322 448 +'"' (34) 481 +'$' (36) 201 202 532 543 544 +'%' (37) 317 447 +'&' (38) 118 143 192 196 279 281 309 376 378 451 557 558 559 560 +'(' (40) 10 46 65 81 84 87 89 101 111 122 145 187 188 189 214 277 336 + 360 362 370 374 412 433 473 494 495 549 575 576 577 580 +')' (41) 10 46 65 81 84 87 89 101 111 122 145 187 188 189 214 277 336 + 360 362 370 374 412 433 473 494 495 549 575 576 577 580 +'*' (42) 314 445 +'+' (43) 312 320 443 471 ',' (44) 20 26 32 38 113 139 153 180 194 195 196 197 198 203 204 217 - 228 250 251 254 256 261 373 374 485 486 487 543 551 552 555 556 - 583 -'-' (45) 312 319 442 470 -'.' (46) 310 453 -'/' (47) 314 444 -':' (58) 48 55 147 149 151 156 157 163 166 172 176 337 339 467 468 + 228 250 251 254 256 261 375 376 487 488 489 545 553 554 557 558 + 585 +'-' (45) 313 321 444 472 +'.' (46) 311 455 +'/' (47) 316 446 +':' (58) 48 55 147 149 151 156 157 163 166 172 176 339 341 469 470 ';' (59) 10 11 16 17 18 19 46 55 61 65 68 69 70 71 72 73 74 75 76 77 78 80 81 90 94 95 147 149 151 155 156 157 164 166 210 211 218 224 225 236 -'<' (60) 326 463 +'<' (60) 328 465 '=' (61) 38 39 152 153 182 204 206 251 253 254 255 277 278 279 281 -'>' (62) 328 464 -'?' (63) 337 339 467 468 -'@' (64) 350 -'[' (91) 265 266 365 366 367 369 432 505 506 517 519 526 536 565 568 -']' (93) 265 266 365 366 367 369 432 505 506 517 519 526 536 565 568 -'^' (94) 309 450 -'`' (96) 354 -'{' (123) 13 15 49 93 101 104 111 122 124 126 154 155 202 219 237 358 - 360 527 530 537 540 -'|' (124) 307 448 -'}' (125) 13 15 49 93 101 104 111 122 124 126 154 155 202 219 237 358 - 360 527 530 537 540 567 568 569 -'~' (126) 321 447 +'>' (62) 330 466 +'?' (63) 339 341 469 470 +'@' (64) 352 +'[' (91) 265 266 367 368 369 371 434 507 508 519 521 528 538 567 570 +']' (93) 265 266 367 368 369 371 434 507 508 519 521 528 538 567 570 +'^' (94) 310 452 +'`' (96) 356 +'{' (123) 13 15 49 93 101 104 111 122 124 126 154 155 202 219 237 360 + 362 529 532 539 542 +'|' (124) 308 450 +'}' (125) 13 15 49 93 101 104 111 122 124 126 154 155 202 219 237 360 + 362 529 532 539 542 569 570 571 +'~' (126) 323 449 error (256) -"require_once (T_REQUIRE_ONCE)" (258) 580 -"require (T_REQUIRE)" (259) 579 -"eval (T_EVAL)" (260) 578 -"include_once (T_INCLUDE_ONCE)" (261) 577 -"include (T_INCLUDE)" (262) 576 -"or (T_LOGICAL_OR)" (263) 303 456 -"xor (T_LOGICAL_XOR)" (264) 306 454 -"and (T_LOGICAL_AND)" (265) 305 455 -"print (T_PRINT)" (266) 355 -"yield (T_YIELD)" (267) 356 361 362 363 364 -">>= (T_SR_EQUAL)" (268) 293 -"<<= (T_SL_EQUAL)" (269) 292 -"^= (T_XOR_EQUAL)" (270) 291 -"|= (T_OR_EQUAL)" (271) 290 -"&= (T_AND_EQUAL)" (272) 289 -"%= (T_MOD_EQUAL)" (273) 288 -".= (T_CONCAT_EQUAL)" (274) 287 -"/= (T_DIV_EQUAL)" (275) 286 -"*= (T_MUL_EQUAL)" (276) 285 -"-= (T_MINUS_EQUAL)" (277) 284 -"+= (T_PLUS_EQUAL)" (278) 283 -"|| (T_BOOLEAN_OR)" (279) 299 458 -"&& (T_BOOLEAN_AND)" (280) 301 457 -"!== (T_IS_NOT_IDENTICAL)" (281) 323 460 -"=== (T_IS_IDENTICAL)" (282) 322 459 -"!= (T_IS_NOT_EQUAL)" (283) 325 462 -"== (T_IS_EQUAL)" (284) 324 461 -">= (T_IS_GREATER_OR_EQUAL)" (285) 329 466 -"<= (T_IS_SMALLER_OR_EQUAL)" (286) 327 465 -">> (T_SR)" (287) 317 452 -"<< (T_SL)" (288) 316 451 -"instanceof (T_INSTANCEOF)" (289) 330 -"(unset) (T_UNSET_CAST)" (290) 347 -"(bool) (T_BOOL_CAST)" (291) 346 -"(object) (T_OBJECT_CAST)" (292) 345 -"(array) (T_ARRAY_CAST)" (293) 344 -"(string) (T_STRING_CAST)" (294) 343 -"(double) (T_DOUBLE_CAST)" (295) 342 -"(int) (T_INT_CAST)" (296) 341 -"-- (T_DEC)" (297) 296 297 -"++ (T_INC)" (298) 294 295 -"clone (T_CLONE)" (299) 282 -"new (T_NEW)" (300) 275 281 -"exit (T_EXIT)" (301) 348 -"if (T_IF)" (302) 52 55 -"elseif (T_ELSEIF)" (303) 169 172 -"else (T_ELSE)" (304) 174 176 -"endif (T_ENDIF)" (305) 55 -"integer number (T_LNUMBER)" (306) 417 -"floating-point number (T_DNUMBER)" (307) 418 -"identifier (T_STRING)" (308) 5 6 23 25 29 31 35 37 38 39 48 95 122 - 124 126 152 153 214 229 231 232 254 255 429 539 566 570 586 587 -"variable name (T_STRING_VARNAME)" (309) 472 568 -"variable (T_VARIABLE)" (310) 101 111 181 182 200 203 204 205 206 250 - 251 252 253 373 374 375 376 529 563 565 566 572 -"number (T_NUM_STRING)" (311) 571 -T_INLINE_HTML (312) 79 -T_CHARACTER (313) -T_BAD_CHARACTER (314) -"quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" (315) 413 - 427 560 562 -"quoted-string (T_CONSTANT_ENCAPSED_STRING)" (316) 367 419 -"echo (T_ECHO)" (317) 78 -"do (T_DO)" (318) 61 -"while (T_WHILE)" (319) 58 61 -"endwhile (T_ENDWHILE)" (320) 166 -"for (T_FOR)" (321) 65 -"endfor (T_ENDFOR)" (322) 147 -"foreach (T_FOREACH)" (323) 84 87 -"endforeach (T_ENDFOREACH)" (324) 149 -"declare (T_DECLARE)" (325) 89 -"enddeclare (T_ENDDECLARE)" (326) 151 -"as (T_AS)" (327) 23 25 29 31 35 37 84 87 232 233 -"switch (T_SWITCH)" (328) 67 -"endswitch (T_ENDSWITCH)" (329) 156 157 -"case (T_CASE)" (330) 160 -"default (T_DEFAULT)" (331) 162 -"break (T_BREAK)" (332) 68 69 -"continue (T_CONTINUE)" (333) 70 71 -"goto (T_GOTO)" (334) 95 -"function (T_FUNCTION)" (335) 17 370 -"const (T_CONST)" (336) 18 39 255 -"return (T_RETURN)" (337) 72 73 74 -"try (T_TRY)" (338) 93 -"catch (T_CATCH)" (339) 101 111 -"finally (T_FINALLY)" (340) 104 -"throw (T_THROW)" (341) 94 -"use (T_USE)" (342) 16 17 18 215 372 -"insteadof (T_INSTEADOF)" (343) 226 -"global (T_GLOBAL)" (344) 76 -"public (T_PUBLIC)" (345) 244 -"protected (T_PROTECTED)" (346) 245 -"private (T_PRIVATE)" (347) 246 -"final (T_FINAL)" (348) 130 249 -"abstract (T_ABSTRACT)" (349) 128 248 -"static (T_STATIC)" (350) 77 247 360 393 -"var (T_VAR)" (351) 239 -"unset (T_UNSET)" (352) 81 -"isset (T_ISSET)" (353) 573 -"empty (T_EMPTY)" (354) 574 575 -"__halt_compiler (T_HALT_COMPILER)" (355) 10 46 -"class (T_CLASS)" (356) 127 128 130 588 589 -"trait (T_TRAIT)" (357) 129 -"interface (T_INTERFACE)" (358) 133 -"extends (T_EXTENDS)" (359) 132 135 -"implements (T_IMPLEMENTS)" (360) 137 -"-> (T_OBJECT_OPERATOR)" (361) 404 408 499 504 566 -"=> (T_DOUBLE_ARROW)" (362) 141 363 364 486 488 551 553 555 557 -"list (T_LIST)" (363) 145 277 547 -"array (T_ARRAY)" (364) 184 368 431 -"callable (T_CALLABLE)" (365) 185 -"__CLASS__ (T_CLASS_C)" (366) 439 481 -"__TRAIT__ (T_TRAIT_C)" (367) 423 -"__METHOD__ (T_METHOD_C)" (368) 424 -"__FUNCTION__ (T_FUNC_C)" (369) 425 -"__LINE__ (T_LINE)" (370) 420 -"__FILE__ (T_FILE)" (371) 421 -"comment (T_COMMENT)" (372) -"doc comment (T_DOC_COMMENT)" (373) -"open tag (T_OPEN_TAG)" (374) -"open tag with echo (T_OPEN_TAG_WITH_ECHO)" (375) -"close tag (T_CLOSE_TAG)" (376) -"whitespace (T_WHITESPACE)" (377) -"heredoc start (T_START_HEREDOC)" (378) 427 428 480 -"heredoc end (T_END_HEREDOC)" (379) 427 428 480 -"${ (T_DOLLAR_OPEN_CURLY_BRACES)" (380) 567 568 -"{$ (T_CURLY_OPEN)" (381) 569 -":: (T_PAAMAYIM_NEKUDOTAYIM)" (382) 231 384 386 388 390 429 514 515 - 586 587 588 589 -"namespace (T_NAMESPACE)" (383) 11 13 15 380 395 398 436 476 -"__NAMESPACE__ (T_NS_C)" (384) 426 -"__DIR__ (T_DIR)" (385) 422 -"\\ (T_NS_SEPARATOR)" (386) 6 24 25 30 31 36 37 380 382 395 396 398 - 399 436 437 476 477 -"... (T_ELLIPSIS)" (387) 120 193 197 +"require_once (T_REQUIRE_ONCE)" (258) 582 +"require (T_REQUIRE)" (259) 581 +"eval (T_EVAL)" (260) 580 +"include_once (T_INCLUDE_ONCE)" (261) 579 +"include (T_INCLUDE)" (262) 578 +"or (T_LOGICAL_OR)" (263) 304 458 +"xor (T_LOGICAL_XOR)" (264) 307 456 +"and (T_LOGICAL_AND)" (265) 306 457 +"print (T_PRINT)" (266) 357 +"yield (T_YIELD)" (267) 358 363 364 365 366 +"**= (T_POW_EQUAL)" (268) 286 +">>= (T_SR_EQUAL)" (269) 294 +"<<= (T_SL_EQUAL)" (270) 293 +"^= (T_XOR_EQUAL)" (271) 292 +"|= (T_OR_EQUAL)" (272) 291 +"&= (T_AND_EQUAL)" (273) 290 +"%= (T_MOD_EQUAL)" (274) 289 +".= (T_CONCAT_EQUAL)" (275) 288 +"/= (T_DIV_EQUAL)" (276) 287 +"*= (T_MUL_EQUAL)" (277) 285 +"-= (T_MINUS_EQUAL)" (278) 284 +"+= (T_PLUS_EQUAL)" (279) 283 +"|| (T_BOOLEAN_OR)" (280) 300 460 +"&& (T_BOOLEAN_AND)" (281) 302 459 +"!== (T_IS_NOT_IDENTICAL)" (282) 325 462 +"=== (T_IS_IDENTICAL)" (283) 324 461 +"!= (T_IS_NOT_EQUAL)" (284) 327 464 +"== (T_IS_EQUAL)" (285) 326 463 +">= (T_IS_GREATER_OR_EQUAL)" (286) 331 468 +"<= (T_IS_SMALLER_OR_EQUAL)" (287) 329 467 +">> (T_SR)" (288) 319 454 +"<< (T_SL)" (289) 318 453 +"instanceof (T_INSTANCEOF)" (290) 332 +"(unset) (T_UNSET_CAST)" (291) 349 +"(bool) (T_BOOL_CAST)" (292) 348 +"(object) (T_OBJECT_CAST)" (293) 347 +"(array) (T_ARRAY_CAST)" (294) 346 +"(string) (T_STRING_CAST)" (295) 345 +"(double) (T_DOUBLE_CAST)" (296) 344 +"(int) (T_INT_CAST)" (297) 343 +"-- (T_DEC)" (298) 297 298 +"++ (T_INC)" (299) 295 296 +"** (T_POW)" (300) 315 +"clone (T_CLONE)" (301) 282 +"new (T_NEW)" (302) 275 281 +"exit (T_EXIT)" (303) 350 +"if (T_IF)" (304) 52 55 +"elseif (T_ELSEIF)" (305) 169 172 +"else (T_ELSE)" (306) 174 176 +"endif (T_ENDIF)" (307) 55 +"integer number (T_LNUMBER)" (308) 419 +"floating-point number (T_DNUMBER)" (309) 420 +"identifier (T_STRING)" (310) 5 6 23 25 29 31 35 37 38 39 48 95 122 + 124 126 152 153 214 229 231 232 254 255 431 541 568 572 588 589 +"variable name (T_STRING_VARNAME)" (311) 474 570 +"variable (T_VARIABLE)" (312) 101 111 181 182 200 203 204 205 206 250 + 251 252 253 375 376 377 378 531 565 567 568 574 +"number (T_NUM_STRING)" (313) 573 +T_INLINE_HTML (314) 79 +T_CHARACTER (315) +T_BAD_CHARACTER (316) +"quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" (317) 415 + 429 562 564 +"quoted-string (T_CONSTANT_ENCAPSED_STRING)" (318) 369 421 +"echo (T_ECHO)" (319) 78 +"do (T_DO)" (320) 61 +"while (T_WHILE)" (321) 58 61 +"endwhile (T_ENDWHILE)" (322) 166 +"for (T_FOR)" (323) 65 +"endfor (T_ENDFOR)" (324) 147 +"foreach (T_FOREACH)" (325) 84 87 +"endforeach (T_ENDFOREACH)" (326) 149 +"declare (T_DECLARE)" (327) 89 +"enddeclare (T_ENDDECLARE)" (328) 151 +"as (T_AS)" (329) 23 25 29 31 35 37 84 87 232 233 +"switch (T_SWITCH)" (330) 67 +"endswitch (T_ENDSWITCH)" (331) 156 157 +"case (T_CASE)" (332) 160 +"default (T_DEFAULT)" (333) 162 +"break (T_BREAK)" (334) 68 69 +"continue (T_CONTINUE)" (335) 70 71 +"goto (T_GOTO)" (336) 95 +"function (T_FUNCTION)" (337) 17 372 +"const (T_CONST)" (338) 18 39 255 +"return (T_RETURN)" (339) 72 73 74 +"try (T_TRY)" (340) 93 +"catch (T_CATCH)" (341) 101 111 +"finally (T_FINALLY)" (342) 104 +"throw (T_THROW)" (343) 94 +"use (T_USE)" (344) 16 17 18 215 374 +"insteadof (T_INSTEADOF)" (345) 226 +"global (T_GLOBAL)" (346) 76 +"public (T_PUBLIC)" (347) 244 +"protected (T_PROTECTED)" (348) 245 +"private (T_PRIVATE)" (349) 246 +"final (T_FINAL)" (350) 130 249 +"abstract (T_ABSTRACT)" (351) 128 248 +"static (T_STATIC)" (352) 77 247 362 395 +"var (T_VAR)" (353) 239 +"unset (T_UNSET)" (354) 81 +"isset (T_ISSET)" (355) 575 +"empty (T_EMPTY)" (356) 576 577 +"__halt_compiler (T_HALT_COMPILER)" (357) 10 46 +"class (T_CLASS)" (358) 127 128 130 590 591 +"trait (T_TRAIT)" (359) 129 +"interface (T_INTERFACE)" (360) 133 +"extends (T_EXTENDS)" (361) 132 135 +"implements (T_IMPLEMENTS)" (362) 137 +"-> (T_OBJECT_OPERATOR)" (363) 406 410 501 506 568 +"=> (T_DOUBLE_ARROW)" (364) 141 365 366 488 490 553 555 557 559 +"list (T_LIST)" (365) 145 277 549 +"array (T_ARRAY)" (366) 184 370 433 +"callable (T_CALLABLE)" (367) 185 +"__CLASS__ (T_CLASS_C)" (368) 441 483 +"__TRAIT__ (T_TRAIT_C)" (369) 425 +"__METHOD__ (T_METHOD_C)" (370) 426 +"__FUNCTION__ (T_FUNC_C)" (371) 427 +"__LINE__ (T_LINE)" (372) 422 +"__FILE__ (T_FILE)" (373) 423 +"comment (T_COMMENT)" (374) +"doc comment (T_DOC_COMMENT)" (375) +"open tag (T_OPEN_TAG)" (376) +"open tag with echo (T_OPEN_TAG_WITH_ECHO)" (377) +"close tag (T_CLOSE_TAG)" (378) +"whitespace (T_WHITESPACE)" (379) +"heredoc start (T_START_HEREDOC)" (380) 429 430 482 +"heredoc end (T_END_HEREDOC)" (381) 429 430 482 +"${ (T_DOLLAR_OPEN_CURLY_BRACES)" (382) 569 570 +"{$ (T_CURLY_OPEN)" (383) 571 +":: (T_PAAMAYIM_NEKUDOTAYIM)" (384) 231 386 388 390 392 431 516 517 + 588 589 590 591 +"namespace (T_NAMESPACE)" (385) 11 13 15 382 397 400 438 478 +"__NAMESPACE__ (T_NS_C)" (386) 428 +"__DIR__ (T_DIR)" (387) 424 +"\\ (T_NS_SEPARATOR)" (388) 6 24 25 30 31 36 37 382 384 397 398 400 + 401 438 439 478 479 +"... (T_ELLIPSIS)" (389) 120 193 197 Nonterminals, with rules where they appear -$accept (161) +$accept (163) on left: 0 -start (162) +start (164) on left: 1, on right: 0 -top_statement_list (163) +top_statement_list (165) on left: 3 4, on right: 1 3 13 15 -$@1 (164) +$@1 (166) on left: 2, on right: 3 -namespace_name (165) +namespace_name (167) on left: 5 6, on right: 6 11 13 22 23 24 25 28 29 30 31 34 35 36 - 37 378 380 382 394 395 396 397 398 399 435 436 437 475 476 477 -top_statement (166) + 37 380 382 384 396 397 398 399 400 401 437 438 439 477 478 479 +top_statement (168) on left: 7 8 9 10 11 13 15 16 17 18 19, on right: 3 -$@2 (167) +$@2 (169) on left: 12, on right: 13 -$@3 (168) +$@3 (170) on left: 14, on right: 15 -use_declarations (169) +use_declarations (171) on left: 20 21, on right: 16 20 -use_declaration (170) +use_declaration (172) on left: 22 23 24 25, on right: 20 21 -use_function_declarations (171) +use_function_declarations (173) on left: 26 27, on right: 17 26 -use_function_declaration (172) +use_function_declaration (174) on left: 28 29 30 31, on right: 26 27 -use_const_declarations (173) +use_const_declarations (175) on left: 32 33, on right: 18 32 -use_const_declaration (174) +use_const_declaration (176) on left: 34 35 36 37, on right: 32 33 -constant_declaration (175) +constant_declaration (177) on left: 38 39, on right: 19 38 -inner_statement_list (176) +inner_statement_list (178) on left: 41 42, on right: 41 49 55 93 101 104 111 122 147 149 151 - 160 162 166 172 176 237 358 360 -$@4 (177) + 160 162 166 172 176 237 360 362 +$@4 (179) on left: 40, on right: 41 -inner_statement (178) +inner_statement (180) on left: 43 44 45 46, on right: 41 -statement (179) +statement (181) on left: 47 48, on right: 7 43 52 61 146 148 150 165 169 174 -unticked_statement (180) +unticked_statement (182) on left: 49 52 55 58 61 65 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 84 87 89 90 93 94 95, on right: 47 -$@5 (181) +$@5 (183) on left: 50, on right: 52 -$@6 (182) +$@6 (184) on left: 51, on right: 52 -$@7 (183) +$@7 (185) on left: 53, on right: 55 -$@8 (184) +$@8 (186) on left: 54, on right: 55 -$@9 (185) +$@9 (187) on left: 56, on right: 58 -@10 (186) +@10 (188) on left: 57, on right: 58 -$@11 (187) +$@11 (189) on left: 59, on right: 61 -$@12 (188) +$@12 (190) on left: 60, on right: 61 -$@13 (189) +$@13 (191) on left: 62, on right: 65 -$@14 (190) +$@14 (192) on left: 63, on right: 65 -$@15 (191) +$@15 (193) on left: 64, on right: 65 -$@16 (192) +$@16 (194) on left: 66, on right: 67 -$@17 (193) +$@17 (195) on left: 82, on right: 84 -$@18 (194) +$@18 (196) on left: 83, on right: 84 -$@19 (195) +$@19 (197) on left: 85, on right: 87 -$@20 (196) +$@20 (198) on left: 86, on right: 87 -$@21 (197) +$@21 (199) on left: 88, on right: 89 -$@22 (198) +$@22 (200) on left: 91, on right: 93 -$@23 (199) +$@23 (201) on left: 92, on right: 93 -catch_statement (200) +catch_statement (202) on left: 96 101, on right: 93 -$@24 (201) +$@24 (203) on left: 97, on right: 101 -$@25 (202) +$@25 (204) on left: 98, on right: 101 -$@26 (203) +$@26 (205) on left: 99, on right: 101 -$@27 (204) +$@27 (206) on left: 100, on right: 101 -finally_statement (205) +finally_statement (207) on left: 102 104, on right: 93 -$@28 (206) +$@28 (208) on left: 103, on right: 104 -additional_catches (207) +additional_catches (209) on left: 105 106, on right: 101 -non_empty_additional_catches (208) +non_empty_additional_catches (210) on left: 107 108, on right: 105 108 -additional_catch (209) +additional_catch (211) on left: 111, on right: 107 108 -@29 (210) +@29 (212) on left: 109, on right: 111 -$@30 (211) +$@30 (213) on left: 110, on right: 111 -unset_variables (212) +unset_variables (214) on left: 112 113, on right: 81 113 -unset_variable (213) +unset_variable (215) on left: 114, on right: 112 113 -function_declaration_statement (214) +function_declaration_statement (216) on left: 115, on right: 8 44 -class_declaration_statement (215) +class_declaration_statement (217) on left: 116, on right: 9 45 -is_reference (216) - on left: 117 118, on right: 122 181 182 214 358 360 -is_variadic (217) +is_reference (218) + on left: 117 118, on right: 122 181 182 214 360 362 +is_variadic (219) on left: 119 120, on right: 181 182 -unticked_function_declaration_statement (218) +unticked_function_declaration_statement (220) on left: 122, on right: 115 -$@31 (219) +$@31 (221) on left: 121, on right: 122 -unticked_class_declaration_statement (220) +unticked_class_declaration_statement (222) on left: 124 126, on right: 116 -$@32 (221) +$@32 (223) on left: 123, on right: 124 -$@33 (222) +$@33 (224) on left: 125, on right: 126 -class_entry_type (223) +class_entry_type (225) on left: 127 128 129 130, on right: 124 -extends_from (224) +extends_from (226) on left: 131 132, on right: 124 -interface_entry (225) +interface_entry (227) on left: 133, on right: 126 -interface_extends_list (226) +interface_extends_list (228) on left: 134 135, on right: 126 -implements_list (227) +implements_list (229) on left: 136 137, on right: 124 -interface_list (228) +interface_list (230) on left: 138 139, on right: 135 137 139 -foreach_optional_arg (229) +foreach_optional_arg (231) on left: 140 141, on right: 84 87 -foreach_variable (230) +foreach_variable (232) on left: 142 143 145, on right: 84 87 141 -$@34 (231) +$@34 (233) on left: 144, on right: 145 -for_statement (232) +for_statement (234) on left: 146 147, on right: 65 -foreach_statement (233) +foreach_statement (235) on left: 148 149, on right: 84 87 -declare_statement (234) +declare_statement (236) on left: 150 151, on right: 89 -declare_list (235) +declare_list (237) on left: 152 153, on right: 89 153 -switch_case_list (236) +switch_case_list (238) on left: 154 155 156 157, on right: 67 -case_list (237) +case_list (239) on left: 158 160 162, on right: 154 155 156 157 160 162 -$@35 (238) +$@35 (240) on left: 159, on right: 160 -$@36 (239) +$@36 (241) on left: 161, on right: 162 -case_separator (240) +case_separator (242) on left: 163 164, on right: 160 162 -while_statement (241) +while_statement (243) on left: 165 166, on right: 58 -elseif_list (242) +elseif_list (244) on left: 167 169, on right: 52 169 -$@37 (243) +$@37 (245) on left: 168, on right: 169 -new_elseif_list (244) +new_elseif_list (246) on left: 170 172, on right: 55 172 -$@38 (245) +$@38 (247) on left: 171, on right: 172 -else_single (246) +else_single (248) on left: 173 174, on right: 52 -new_else_single (247) +new_else_single (249) on left: 175 176, on right: 55 -parameter_list (248) - on left: 177 178, on right: 122 214 358 360 -non_empty_parameter_list (249) +parameter_list (250) + on left: 177 178, on right: 122 214 360 362 +non_empty_parameter_list (251) on left: 179 180, on right: 177 180 -parameter (250) +parameter (252) on left: 181 182, on right: 179 180 -optional_class_type (251) +optional_class_type (253) on left: 183 184 185 186, on right: 181 182 -function_call_parameter_list (252) - on left: 187 188 189, on right: 378 380 382 384 386 388 390 392 - 416 508 -non_empty_function_call_parameter_list (253) +function_call_parameter_list (254) + on left: 187 188 189, on right: 380 382 384 386 388 390 392 394 + 418 510 +non_empty_function_call_parameter_list (255) on left: 190 191 192 193 194 195 196 197, on right: 188 194 195 196 197 -global_var_list (254) +global_var_list (256) on left: 198 199, on right: 76 198 -global_var (255) +global_var (257) on left: 200 201 202, on right: 198 199 -static_var_list (256) +static_var_list (258) on left: 203 204 205 206, on right: 77 203 204 -class_statement_list (257) +class_statement_list (259) on left: 207 208, on right: 124 126 207 -class_statement (258) +class_statement (260) on left: 210 211 212 214, on right: 207 -$@39 (259) +$@39 (261) on left: 209, on right: 210 -$@40 (260) +$@40 (262) on left: 213, on right: 214 -trait_use_statement (261) +trait_use_statement (263) on left: 215, on right: 212 -trait_list (262) +trait_list (264) on left: 216 217, on right: 215 217 -trait_adaptations (263) +trait_adaptations (265) on left: 218 219, on right: 215 -trait_adaptation_list (264) +trait_adaptation_list (266) on left: 220 221, on right: 219 -non_empty_trait_adaptation_list (265) +non_empty_trait_adaptation_list (267) on left: 222 223, on right: 221 223 -trait_adaptation_statement (266) +trait_adaptation_statement (268) on left: 224 225, on right: 222 223 -trait_precedence (267) +trait_precedence (269) on left: 226, on right: 224 -trait_reference_list (268) +trait_reference_list (270) on left: 227 228, on right: 226 228 -trait_method_reference (269) +trait_method_reference (271) on left: 229 230, on right: 232 233 -trait_method_reference_fully_qualified (270) +trait_method_reference_fully_qualified (272) on left: 231, on right: 226 230 -trait_alias (271) +trait_alias (273) on left: 232 233, on right: 225 -trait_modifiers (272) +trait_modifiers (274) on left: 234 235, on right: 232 -method_body (273) +method_body (275) on left: 236 237, on right: 214 -variable_modifiers (274) +variable_modifiers (276) on left: 238 239, on right: 210 -method_modifiers (275) +method_modifiers (277) on left: 240 241, on right: 214 -non_empty_member_modifiers (276) +non_empty_member_modifiers (278) on left: 242 243, on right: 238 241 243 -member_modifier (277) +member_modifier (279) on left: 244 245 246 247 248 249, on right: 233 235 242 243 -class_variable_declaration (278) +class_variable_declaration (280) on left: 250 251 252 253, on right: 210 250 251 -class_constant_declaration (279) +class_constant_declaration (281) on left: 254 255, on right: 211 254 -echo_expr_list (280) +echo_expr_list (282) on left: 256 257, on right: 78 256 -for_expr (281) +for_expr (283) on left: 258 259, on right: 65 -non_empty_for_expr (282) +non_empty_for_expr (284) on left: 261 262, on right: 259 261 -$@41 (283) +$@41 (285) on left: 260, on right: 261 -chaining_method_or_property (284) +chaining_method_or_property (286) on left: 263 264, on right: 263 268 270 -chaining_dereference (285) +chaining_dereference (287) on left: 265 266, on right: 265 268 269 -chaining_instance_call (286) +chaining_instance_call (288) on left: 268 269 270, on right: 273 -$@42 (287) +$@42 (289) on left: 267, on right: 268 -instance_call (288) - on left: 271 273, on right: 334 -$@43 (289) +instance_call (290) + on left: 271 273, on right: 336 +$@43 (291) on left: 272, on right: 273 -new_expr (290) - on left: 275, on right: 332 334 -$@44 (291) +new_expr (292) + on left: 275, on right: 334 336 +$@44 (293) on left: 274, on right: 275 -expr_without_variable (292) +expr_without_variable (294) on left: 277 278 279 281 282 283 284 285 286 287 288 289 290 291 - 292 293 294 295 296 297 299 301 303 305 306 307 308 309 310 311 + 292 293 294 295 296 297 298 300 302 304 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 - 328 329 330 331 332 334 337 339 340 341 342 343 344 345 346 347 - 348 350 351 352 353 354 355 356 358 360, on right: 73 87 190 194 - 361 363 491 575 585 -$@45 (293) + 328 329 330 331 332 333 334 336 339 341 342 343 344 345 346 347 + 348 349 350 352 353 354 355 356 357 358 360 362, on right: 73 87 + 190 194 363 365 493 577 587 +$@45 (295) on left: 276, on right: 277 -$@46 (294) +$@46 (296) on left: 280, on right: 281 -$@47 (295) - on left: 298, on right: 299 -$@48 (296) - on left: 300, on right: 301 -$@49 (297) - on left: 302, on right: 303 -$@50 (298) - on left: 304, on right: 305 -@51 (299) - on left: 333, on right: 334 -$@52 (300) - on left: 335, on right: 337 -$@53 (301) - on left: 336, on right: 337 -$@54 (302) +$@47 (297) + on left: 299, on right: 300 +$@48 (298) + on left: 301, on right: 302 +$@49 (299) + on left: 303, on right: 304 +$@50 (300) + on left: 305, on right: 306 +@51 (301) + on left: 335, on right: 336 +$@52 (302) + on left: 337, on right: 339 +$@53 (303) on left: 338, on right: 339 -$@55 (303) - on left: 349, on right: 350 -@56 (304) - on left: 357, on right: 358 -@57 (305) +$@54 (304) + on left: 340, on right: 341 +$@55 (305) + on left: 351, on right: 352 +@56 (306) on left: 359, on right: 360 -yield_expr (306) - on left: 361 362 363 364, on right: 75 189 493 -combined_scalar_offset (307) - on left: 365 366 367, on right: 352 366 -combined_scalar (308) - on left: 368 369, on right: 353 365 -function (309) - on left: 370, on right: 122 214 358 360 -lexical_vars (310) - on left: 371 372, on right: 358 360 -lexical_var_list (311) - on left: 373 374 375 376, on right: 372 373 374 -function_call (312) - on left: 378 380 382 384 386 388 390 392, on right: 519 522 -@58 (313) - on left: 377, on right: 378 -@59 (314) +@57 (307) + on left: 361, on right: 362 +yield_expr (308) + on left: 363 364 365 366, on right: 75 189 495 +combined_scalar_offset (309) + on left: 367 368 369, on right: 354 368 +combined_scalar (310) + on left: 370 371, on right: 355 367 +function (311) + on left: 372, on right: 122 214 360 362 +lexical_vars (312) + on left: 373 374, on right: 360 362 +lexical_var_list (313) + on left: 375 376 377 378, on right: 374 375 376 +function_call (314) + on left: 380 382 384 386 388 390 392 394, on right: 521 524 +@58 (315) on left: 379, on right: 380 -@60 (315) +@59 (316) on left: 381, on right: 382 -@61 (316) +@60 (317) on left: 383, on right: 384 -$@62 (317) +@61 (318) on left: 385, on right: 386 -$@63 (318) +$@62 (319) on left: 387, on right: 388 -$@64 (319) +$@63 (320) on left: 389, on right: 390 -$@65 (320) +$@64 (321) on left: 391, on right: 392 -class_name (321) - on left: 393 394 395 396, on right: 384 386 400 429 514 586 588 - 589 -fully_qualified_class_name (322) - on left: 397 398 399, on right: 101 111 132 138 139 186 216 217 +$@65 (322) + on left: 393, on right: 394 +class_name (323) + on left: 395 396 397 398, on right: 386 388 402 431 516 588 590 + 591 +fully_qualified_class_name (324) + on left: 399 400 401, on right: 101 111 132 138 139 186 216 217 227 228 231 -class_name_reference (323) - on left: 400 401, on right: 275 281 330 -dynamic_class_name_reference (324) - on left: 404 405, on right: 401 -$@66 (325) - on left: 402, on right: 404 -$@67 (326) - on left: 403, on right: 404 -dynamic_class_name_variable_properties (327) - on left: 406 407, on right: 404 406 -dynamic_class_name_variable_property (328) - on left: 408, on right: 406 -exit_expr (329) - on left: 409 410 411, on right: 348 -backticks_expr (330) - on left: 412 413 414, on right: 354 -ctor_arguments (331) - on left: 415 416, on right: 275 281 -common_scalar (332) - on left: 417 418 419 420 421 422 423 424 425 426 427 428, on right: - 433 478 -static_class_constant (333) - on left: 429, on right: 438 -static_scalar (334) - on left: 430 431 432, on right: 38 39 152 153 182 204 206 251 253 - 254 255 486 487 488 489 -static_scalar_value (335) - on left: 433 434 435 436 437 438 439 440, on right: 430 441 442 - 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 - 459 460 461 462 463 464 465 466 467 468 469 470 471 -static_operation (336) - on left: 441 442 443 444 445 446 447 448 449 450 451 452 453 454 - 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 - 471, on right: 440 -scalar (337) - on left: 472 473 474 475 476 477 478 479 480 481, on right: 351 -static_array_pair_list (338) - on left: 482 483, on right: 431 432 -possible_comma (339) - on left: 484 485, on right: 483 550 -non_empty_static_array_pair_list (340) - on left: 486 487 488 489, on right: 483 486 487 -expr (341) - on left: 490 491, on right: 69 71 80 94 160 193 197 202 256 257 +class_name_reference (325) + on left: 402 403, on right: 275 281 332 +dynamic_class_name_reference (326) + on left: 406 407, on right: 403 +$@66 (327) + on left: 404, on right: 406 +$@67 (328) + on left: 405, on right: 406 +dynamic_class_name_variable_properties (329) + on left: 408 409, on right: 406 408 +dynamic_class_name_variable_property (330) + on left: 410, on right: 408 +exit_expr (331) + on left: 411 412 413, on right: 350 +backticks_expr (332) + on left: 414 415 416, on right: 356 +ctor_arguments (333) + on left: 417 418, on right: 275 281 +common_scalar (334) + on left: 419 420 421 422 423 424 425 426 427 428 429 430, on right: + 435 480 +static_class_constant (335) + on left: 431, on right: 440 +static_scalar (336) + on left: 432 433 434, on right: 38 39 152 153 182 204 206 251 253 + 254 255 488 489 490 491 +static_scalar_value (337) + on left: 435 436 437 438 439 440 441 442, on right: 432 443 444 + 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 471 472 473 +static_operation (338) + on left: 443 444 445 446 447 448 449 450 451 452 453 454 455 456 + 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 + 473, on right: 442 +scalar (339) + on left: 474 475 476 477 478 479 480 481 482 483, on right: 353 +static_array_pair_list (340) + on left: 484 485, on right: 433 434 +possible_comma (341) + on left: 486 487, on right: 485 552 +non_empty_static_array_pair_list (342) + on left: 488 489 490 491, on right: 485 488 489 +expr (343) + on left: 492 493, on right: 69 71 80 94 160 193 197 202 256 257 261 262 277 278 282 283 284 285 286 287 288 289 290 291 292 293 - 299 301 303 305 306 307 308 309 310 311 312 313 314 315 316 317 - 318 319 320 321 322 323 324 325 326 327 328 329 330 337 339 341 - 342 343 344 345 346 347 350 355 363 364 492 527 530 532 537 540 - 551 552 553 554 555 557 567 568 576 577 578 579 580 -parenthesis_expr (342) - on left: 492 493, on right: 52 55 58 61 67 169 172 331 411 -r_variable (343) - on left: 494, on right: 201 490 -w_variable (344) - on left: 495, on right: 192 196 555 556 557 558 -rw_variable (345) - on left: 496, on right: 294 295 296 297 -variable (346) - on left: 499 500, on right: 74 84 114 142 143 191 195 278 279 281 - 283 284 285 286 287 288 289 290 291 292 293 362 364 494 495 496 - 545 569 574 584 -$@68 (347) - on left: 497, on right: 499 -$@69 (348) - on left: 498, on right: 499 -variable_properties (349) - on left: 501 502, on right: 499 501 -variable_property (350) - on left: 504, on right: 263 264 501 -$@70 (351) - on left: 503, on right: 504 -array_method_dereference (352) - on left: 505 506, on right: 505 510 -method (353) - on left: 508, on right: 506 509 -@71 (354) - on left: 507, on right: 508 -method_or_not (355) - on left: 509 510 511, on right: 499 504 -variable_without_objects (356) - on left: 512 513, on right: 386 390 392 514 515 535 -static_member (357) - on left: 514 515, on right: 525 -variable_class_name (358) - on left: 516, on right: 388 390 515 587 -array_function_dereference (359) - on left: 517 519, on right: 517 521 -$@72 (360) - on left: 518, on right: 519 -base_variable_with_function_calls (361) - on left: 520 521 522, on right: 499 500 -base_variable (362) - on left: 523 524 525, on right: 404 405 520 -reference_variable (363) - on left: 526 527 528, on right: 512 513 516 523 524 526 527 -compound_variable (364) - on left: 529 530, on right: 528 -dim_offset (365) - on left: 531 532, on right: 265 266 365 366 367 505 506 517 519 - 526 536 -object_property (366) - on left: 533 535, on right: 404 408 499 504 -$@73 (367) - on left: 534, on right: 535 -object_dim_list (368) - on left: 536 537 538, on right: 533 536 537 -variable_name (369) - on left: 539 540, on right: 384 388 538 -simple_indirect_reference (370) - on left: 541 542, on right: 513 524 542 -assignment_list (371) - on left: 543 544, on right: 145 277 543 547 -assignment_list_element (372) - on left: 545 547 548, on right: 543 544 -$@74 (373) - on left: 546, on right: 547 -array_pair_list (374) - on left: 549 550, on right: 368 369 -non_empty_array_pair_list (375) - on left: 551 552 553 554 555 556 557 558, on right: 550 551 552 - 555 556 -encaps_list (376) - on left: 559 560 561 562, on right: 414 479 480 559 560 -encaps_var (377) - on left: 563 565 566 567 568 569, on right: 559 561 562 -$@75 (378) - on left: 564, on right: 565 -encaps_var_offset (379) - on left: 570 571 572, on right: 565 -internal_functions_in_yacc (380) - on left: 573 574 575 576 577 578 579 580, on right: 340 -isset_variables (381) - on left: 581 583, on right: 573 583 -$@76 (382) - on left: 582, on right: 583 -isset_variable (383) - on left: 584 585, on right: 581 583 -class_constant (384) - on left: 586 587, on right: 474 -static_class_name_scalar (385) - on left: 588, on right: 434 -class_name_scalar (386) - on left: 589, on right: 473 + 294 300 302 304 306 307 308 309 310 311 312 313 314 315 316 317 + 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 339 + 341 343 344 345 346 347 348 349 352 357 365 366 494 529 532 534 + 539 542 553 554 555 556 557 559 569 570 578 579 580 581 582 +parenthesis_expr (344) + on left: 494 495, on right: 52 55 58 61 67 169 172 333 413 +r_variable (345) + on left: 496, on right: 201 492 +w_variable (346) + on left: 497, on right: 192 196 557 558 559 560 +rw_variable (347) + on left: 498, on right: 295 296 297 298 +variable (348) + on left: 501 502, on right: 74 84 114 142 143 191 195 278 279 281 + 283 284 285 286 287 288 289 290 291 292 293 294 364 366 496 497 + 498 547 571 576 586 +$@68 (349) + on left: 499, on right: 501 +$@69 (350) + on left: 500, on right: 501 +variable_properties (351) + on left: 503 504, on right: 501 503 +variable_property (352) + on left: 506, on right: 263 264 503 +$@70 (353) + on left: 505, on right: 506 +array_method_dereference (354) + on left: 507 508, on right: 507 512 +method (355) + on left: 510, on right: 508 511 +@71 (356) + on left: 509, on right: 510 +method_or_not (357) + on left: 511 512 513, on right: 501 506 +variable_without_objects (358) + on left: 514 515, on right: 388 392 394 516 517 537 +static_member (359) + on left: 516 517, on right: 527 +variable_class_name (360) + on left: 518, on right: 390 392 517 589 +array_function_dereference (361) + on left: 519 521, on right: 519 523 +$@72 (362) + on left: 520, on right: 521 +base_variable_with_function_calls (363) + on left: 522 523 524, on right: 501 502 +base_variable (364) + on left: 525 526 527, on right: 406 407 522 +reference_variable (365) + on left: 528 529 530, on right: 514 515 518 525 526 528 529 +compound_variable (366) + on left: 531 532, on right: 530 +dim_offset (367) + on left: 533 534, on right: 265 266 367 368 369 507 508 519 521 + 528 538 +object_property (368) + on left: 535 537, on right: 406 410 501 506 +$@73 (369) + on left: 536, on right: 537 +object_dim_list (370) + on left: 538 539 540, on right: 535 538 539 +variable_name (371) + on left: 541 542, on right: 386 390 540 +simple_indirect_reference (372) + on left: 543 544, on right: 515 526 544 +assignment_list (373) + on left: 545 546, on right: 145 277 545 549 +assignment_list_element (374) + on left: 547 549 550, on right: 545 546 +$@74 (375) + on left: 548, on right: 549 +array_pair_list (376) + on left: 551 552, on right: 370 371 +non_empty_array_pair_list (377) + on left: 553 554 555 556 557 558 559 560, on right: 552 553 554 + 557 558 +encaps_list (378) + on left: 561 562 563 564, on right: 416 481 482 561 562 +encaps_var (379) + on left: 565 567 568 569 570 571, on right: 561 563 564 +$@75 (380) + on left: 566, on right: 567 +encaps_var_offset (381) + on left: 572 573 574, on right: 567 +internal_functions_in_yacc (382) + on left: 575 576 577 578 579 580 581 582, on right: 342 +isset_variables (383) + on left: 583 585, on right: 575 585 +$@76 (384) + on left: 584, on right: 585 +isset_variable (385) + on left: 586 587, on right: 583 585 +class_constant (386) + on left: 588 589, on right: 476 +static_class_name_scalar (387) + on left: 590, on right: 436 +class_name_scalar (388) + on left: 591, on right: 475 state 0 @@ -1699,7 +1703,7 @@ state 4 state 5 - 580 internal_functions_in_yacc: "require_once (T_REQUIRE_ONCE)" . expr + 582 internal_functions_in_yacc: "require_once (T_REQUIRE_ONCE)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -1785,7 +1789,7 @@ state 5 state 6 - 579 internal_functions_in_yacc: "require (T_REQUIRE)" . expr + 581 internal_functions_in_yacc: "require (T_REQUIRE)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -1871,14 +1875,14 @@ state 6 state 7 - 578 internal_functions_in_yacc: "eval (T_EVAL)" . '(' expr ')' + 580 internal_functions_in_yacc: "eval (T_EVAL)" . '(' expr ')' '(' shift, and go to state 129 state 8 - 577 internal_functions_in_yacc: "include_once (T_INCLUDE_ONCE)" . expr + 579 internal_functions_in_yacc: "include_once (T_INCLUDE_ONCE)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -1964,7 +1968,7 @@ state 8 state 9 - 576 internal_functions_in_yacc: "include (T_INCLUDE)" . expr + 578 internal_functions_in_yacc: "include (T_INCLUDE)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2050,7 +2054,7 @@ state 9 state 10 - 355 expr_without_variable: "print (T_PRINT)" . expr + 357 expr_without_variable: "print (T_PRINT)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2136,11 +2140,11 @@ state 10 state 11 - 356 expr_without_variable: "yield (T_YIELD)" . - 361 yield_expr: "yield (T_YIELD)" . expr_without_variable - 362 | "yield (T_YIELD)" . variable - 363 | "yield (T_YIELD)" . expr "=> (T_DOUBLE_ARROW)" expr_without_variable - 364 | "yield (T_YIELD)" . expr "=> (T_DOUBLE_ARROW)" variable + 358 expr_without_variable: "yield (T_YIELD)" . + 363 yield_expr: "yield (T_YIELD)" . expr_without_variable + 364 | "yield (T_YIELD)" . variable + 365 | "yield (T_YIELD)" . expr "=> (T_DOUBLE_ARROW)" expr_without_variable + 366 | "yield (T_YIELD)" . expr "=> (T_DOUBLE_ARROW)" variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2195,7 +2199,7 @@ state 11 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 356 (expr_without_variable) + $default reduce using rule 358 (expr_without_variable) namespace_name go to state 84 new_expr go to state 95 @@ -2228,7 +2232,7 @@ state 11 state 12 - 318 expr_without_variable: '+' . expr + 320 expr_without_variable: '+' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2314,7 +2318,7 @@ state 12 state 13 - 319 expr_without_variable: '-' . expr + 321 expr_without_variable: '-' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2400,7 +2404,7 @@ state 13 state 14 - 320 expr_without_variable: '!' . expr + 322 expr_without_variable: '!' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2486,7 +2490,7 @@ state 14 state 15 - 321 expr_without_variable: '~' . expr + 323 expr_without_variable: '~' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2572,16 +2576,16 @@ state 15 state 16 - 350 expr_without_variable: '@' . $@55 expr + 352 expr_without_variable: '@' . $@55 expr - $default reduce using rule 349 ($@55) + $default reduce using rule 351 ($@55) $@55 go to state 140 state 17 - 347 expr_without_variable: "(unset) (T_UNSET_CAST)" . expr + 349 expr_without_variable: "(unset) (T_UNSET_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2667,7 +2671,7 @@ state 17 state 18 - 346 expr_without_variable: "(bool) (T_BOOL_CAST)" . expr + 348 expr_without_variable: "(bool) (T_BOOL_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2753,7 +2757,7 @@ state 18 state 19 - 345 expr_without_variable: "(object) (T_OBJECT_CAST)" . expr + 347 expr_without_variable: "(object) (T_OBJECT_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2839,7 +2843,7 @@ state 19 state 20 - 344 expr_without_variable: "(array) (T_ARRAY_CAST)" . expr + 346 expr_without_variable: "(array) (T_ARRAY_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -2925,7 +2929,7 @@ state 20 state 21 - 343 expr_without_variable: "(string) (T_STRING_CAST)" . expr + 345 expr_without_variable: "(string) (T_STRING_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -3011,7 +3015,7 @@ state 21 state 22 - 342 expr_without_variable: "(double) (T_DOUBLE_CAST)" . expr + 344 expr_without_variable: "(double) (T_DOUBLE_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -3097,7 +3101,7 @@ state 22 state 23 - 341 expr_without_variable: "(int) (T_INT_CAST)" . expr + 343 expr_without_variable: "(int) (T_INT_CAST)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -3183,7 +3187,7 @@ state 23 state 24 - 297 expr_without_variable: "-- (T_DEC)" . rw_variable + 298 expr_without_variable: "-- (T_DEC)" . rw_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -3210,7 +3214,7 @@ state 24 state 25 - 295 expr_without_variable: "++ (T_INC)" . rw_variable + 296 expr_without_variable: "++ (T_INC)" . rw_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -3237,7 +3241,7 @@ state 25 state 26 - 369 combined_scalar: '[' . array_pair_list ']' + 371 combined_scalar: '[' . array_pair_list ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -3293,7 +3297,7 @@ state 26 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 549 (array_pair_list) + $default reduce using rule 551 (array_pair_list) namespace_name go to state 84 new_expr go to state 95 @@ -3437,11 +3441,11 @@ state 28 state 29 - 348 expr_without_variable: "exit (T_EXIT)" . exit_expr + 350 expr_without_variable: "exit (T_EXIT)" . exit_expr '(' shift, and go to state 172 - $default reduce using rule 409 (exit_expr) + $default reduce using rule 411 (exit_expr) exit_expr go to state 173 parenthesis_expr go to state 174 @@ -3459,16 +3463,16 @@ state 30 state 31 - 417 common_scalar: "integer number (T_LNUMBER)" . + 419 common_scalar: "integer number (T_LNUMBER)" . - $default reduce using rule 417 (common_scalar) + $default reduce using rule 419 (common_scalar) state 32 - 418 common_scalar: "floating-point number (T_DNUMBER)" . + 420 common_scalar: "floating-point number (T_DNUMBER)" . - $default reduce using rule 418 (common_scalar) + $default reduce using rule 420 (common_scalar) state 33 @@ -3483,16 +3487,16 @@ state 33 state 34 - 472 scalar: "variable name (T_STRING_VARNAME)" . + 474 scalar: "variable name (T_STRING_VARNAME)" . - $default reduce using rule 472 (scalar) + $default reduce using rule 474 (scalar) state 35 - 529 compound_variable: "variable (T_VARIABLE)" . + 531 compound_variable: "variable (T_VARIABLE)" . - $default reduce using rule 529 (compound_variable) + $default reduce using rule 531 (compound_variable) state 36 @@ -3504,12 +3508,12 @@ state 36 state 37 - 367 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . '[' dim_offset ']' - 419 common_scalar: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . + 369 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . '[' dim_offset ']' + 421 common_scalar: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . '[' shift, and go to state 178 - $default reduce using rule 419 (common_scalar) + $default reduce using rule 421 (common_scalar) state 38 @@ -3835,9 +3839,9 @@ state 47 state 48 - 370 function: "function (T_FUNCTION)" . + 372 function: "function (T_FUNCTION)" . - $default reduce using rule 370 (function) + $default reduce using rule 372 (function) state 49 @@ -4075,13 +4079,13 @@ state 56 state 57 77 unticked_statement: "static (T_STATIC)" . static_var_list ';' - 360 expr_without_variable: "static (T_STATIC)" . function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - 393 class_name: "static (T_STATIC)" . + 362 expr_without_variable: "static (T_STATIC)" . function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 395 class_name: "static (T_STATIC)" . "variable (T_VARIABLE)" shift, and go to state 211 "function (T_FUNCTION)" shift, and go to state 48 - $default reduce using rule 393 (class_name) + $default reduce using rule 395 (class_name) static_var_list go to state 212 function go to state 213 @@ -4096,15 +4100,15 @@ state 58 state 59 - 573 internal_functions_in_yacc: "isset (T_ISSET)" . '(' isset_variables ')' + 575 internal_functions_in_yacc: "isset (T_ISSET)" . '(' isset_variables ')' '(' shift, and go to state 215 state 60 - 574 internal_functions_in_yacc: "empty (T_EMPTY)" . '(' variable ')' - 575 | "empty (T_EMPTY)" . '(' expr_without_variable ')' + 576 internal_functions_in_yacc: "empty (T_EMPTY)" . '(' variable ')' + 577 | "empty (T_EMPTY)" . '(' expr_without_variable ')' '(' shift, and go to state 216 @@ -4146,58 +4150,58 @@ state 65 state 66 - 368 combined_scalar: "array (T_ARRAY)" . '(' array_pair_list ')' + 370 combined_scalar: "array (T_ARRAY)" . '(' array_pair_list ')' '(' shift, and go to state 219 state 67 - 481 scalar: "__CLASS__ (T_CLASS_C)" . + 483 scalar: "__CLASS__ (T_CLASS_C)" . - $default reduce using rule 481 (scalar) + $default reduce using rule 483 (scalar) state 68 - 423 common_scalar: "__TRAIT__ (T_TRAIT_C)" . + 425 common_scalar: "__TRAIT__ (T_TRAIT_C)" . - $default reduce using rule 423 (common_scalar) + $default reduce using rule 425 (common_scalar) state 69 - 424 common_scalar: "__METHOD__ (T_METHOD_C)" . + 426 common_scalar: "__METHOD__ (T_METHOD_C)" . - $default reduce using rule 424 (common_scalar) + $default reduce using rule 426 (common_scalar) state 70 - 425 common_scalar: "__FUNCTION__ (T_FUNC_C)" . + 427 common_scalar: "__FUNCTION__ (T_FUNC_C)" . - $default reduce using rule 425 (common_scalar) + $default reduce using rule 427 (common_scalar) state 71 - 420 common_scalar: "__LINE__ (T_LINE)" . + 422 common_scalar: "__LINE__ (T_LINE)" . - $default reduce using rule 420 (common_scalar) + $default reduce using rule 422 (common_scalar) state 72 - 421 common_scalar: "__FILE__ (T_FILE)" . + 423 common_scalar: "__FILE__ (T_FILE)" . - $default reduce using rule 421 (common_scalar) + $default reduce using rule 423 (common_scalar) state 73 - 427 common_scalar: "heredoc start (T_START_HEREDOC)" . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" - 428 | "heredoc start (T_START_HEREDOC)" . "heredoc end (T_END_HEREDOC)" - 480 scalar: "heredoc start (T_START_HEREDOC)" . encaps_list "heredoc end (T_END_HEREDOC)" + 429 common_scalar: "heredoc start (T_START_HEREDOC)" . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" + 430 | "heredoc start (T_START_HEREDOC)" . "heredoc end (T_END_HEREDOC)" + 482 scalar: "heredoc start (T_START_HEREDOC)" . encaps_list "heredoc end (T_END_HEREDOC)" "variable (T_VARIABLE)" shift, and go to state 220 "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 221 @@ -4214,9 +4218,9 @@ state 74 11 top_statement: "namespace (T_NAMESPACE)" . namespace_name ';' 13 | "namespace (T_NAMESPACE)" . namespace_name '{' $@2 top_statement_list '}' 15 | "namespace (T_NAMESPACE)" . '{' $@3 top_statement_list '}' - 380 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - 476 scalar: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 382 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 478 scalar: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name "identifier (T_STRING)" shift, and go to state 123 "\\ (T_NS_SEPARATOR)" shift, and go to state 227 @@ -4227,23 +4231,23 @@ state 74 state 75 - 426 common_scalar: "__NAMESPACE__ (T_NS_C)" . + 428 common_scalar: "__NAMESPACE__ (T_NS_C)" . - $default reduce using rule 426 (common_scalar) + $default reduce using rule 428 (common_scalar) state 76 - 422 common_scalar: "__DIR__ (T_DIR)" . + 424 common_scalar: "__DIR__ (T_DIR)" . - $default reduce using rule 422 (common_scalar) + $default reduce using rule 424 (common_scalar) state 77 - 382 function_call: "\\ (T_NS_SEPARATOR)" . namespace_name @60 function_call_parameter_list - 396 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name - 477 scalar: "\\ (T_NS_SEPARATOR)" . namespace_name + 384 function_call: "\\ (T_NS_SEPARATOR)" . namespace_name @60 function_call_parameter_list + 398 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name + 479 scalar: "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 @@ -4252,9 +4256,9 @@ state 77 state 78 - 334 expr_without_variable: '(' . new_expr ')' @51 instance_call - 492 parenthesis_expr: '(' . expr ')' - 493 | '(' . yield_expr ')' + 336 expr_without_variable: '(' . new_expr ')' @51 instance_call + 494 parenthesis_expr: '(' . expr ')' + 495 | '(' . yield_expr ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -4357,24 +4361,24 @@ state 80 state 81 - 530 compound_variable: '$' . '{' expr '}' - 541 simple_indirect_reference: '$' . + 532 compound_variable: '$' . '{' expr '}' + 543 simple_indirect_reference: '$' . '{' shift, and go to state 235 - $default reduce using rule 541 (simple_indirect_reference) + $default reduce using rule 543 (simple_indirect_reference) state 82 - 354 expr_without_variable: '`' . backticks_expr '`' + 356 expr_without_variable: '`' . backticks_expr '`' "variable (T_VARIABLE)" shift, and go to state 220 "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 236 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - $default reduce using rule 412 (backticks_expr) + $default reduce using rule 414 (backticks_expr) backticks_expr go to state 237 encaps_list go to state 238 @@ -4383,7 +4387,7 @@ state 82 state 83 - 479 scalar: '"' . encaps_list '"' + 481 scalar: '"' . encaps_list '"' "variable (T_VARIABLE)" shift, and go to state 220 "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 239 @@ -4397,15 +4401,15 @@ state 83 state 84 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 378 function_call: namespace_name . @58 function_call_parameter_list - 394 class_name: namespace_name . - 475 scalar: namespace_name . + 380 function_call: namespace_name . @58 function_call_parameter_list + 396 class_name: namespace_name . + 477 scalar: namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 394 (class_name) - '(' reduce using rule 377 (@58) - $default reduce using rule 475 (scalar) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) + '(' reduce using rule 379 (@58) + $default reduce using rule 477 (scalar) @58 go to state 242 @@ -4484,16 +4488,16 @@ state 94 state 95 - 332 expr_without_variable: new_expr . + 334 expr_without_variable: new_expr . - $default reduce using rule 332 (expr_without_variable) + $default reduce using rule 334 (expr_without_variable) state 96 - 491 expr: expr_without_variable . + 493 expr: expr_without_variable . - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) state 97 @@ -4505,28 +4509,28 @@ state 97 state 98 - 352 expr_without_variable: combined_scalar_offset . - 366 combined_scalar_offset: combined_scalar_offset . '[' dim_offset ']' + 354 expr_without_variable: combined_scalar_offset . + 368 combined_scalar_offset: combined_scalar_offset . '[' dim_offset ']' '[' shift, and go to state 248 - $default reduce using rule 352 (expr_without_variable) + $default reduce using rule 354 (expr_without_variable) state 99 - 353 expr_without_variable: combined_scalar . - 365 combined_scalar_offset: combined_scalar . '[' dim_offset ']' + 355 expr_without_variable: combined_scalar . + 367 combined_scalar_offset: combined_scalar . '[' dim_offset ']' '[' shift, and go to state 249 - $default reduce using rule 353 (expr_without_variable) + $default reduce using rule 355 (expr_without_variable) state 100 122 unticked_function_declaration_statement: function . is_reference "identifier (T_STRING)" $@31 '(' parameter_list ')' '{' inner_statement_list '}' - 358 expr_without_variable: function . is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function . is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' '&' shift, and go to state 250 @@ -4537,70 +4541,71 @@ state 100 state 101 - 519 array_function_dereference: function_call . $@72 '[' dim_offset ']' - 522 base_variable_with_function_calls: function_call . + 521 array_function_dereference: function_call . $@72 '[' dim_offset ']' + 524 base_variable_with_function_calls: function_call . - '[' reduce using rule 518 ($@72) - $default reduce using rule 522 (base_variable_with_function_calls) + '[' reduce using rule 520 ($@72) + $default reduce using rule 524 (base_variable_with_function_calls) $@72 go to state 252 state 102 - 384 function_call: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list - 386 | class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list - 514 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - 586 class_constant: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - 589 class_name_scalar: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" + 386 function_call: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list + 388 | class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list + 516 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 588 class_constant: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" + 591 class_name_scalar: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 253 state 103 - 478 scalar: common_scalar . + 480 scalar: common_scalar . - $default reduce using rule 478 (scalar) + $default reduce using rule 480 (scalar) state 104 - 351 expr_without_variable: scalar . + 353 expr_without_variable: scalar . - $default reduce using rule 351 (expr_without_variable) + $default reduce using rule 353 (expr_without_variable) state 105 80 unticked_statement: expr . ';' - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -4628,30 +4633,31 @@ state 105 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ';' shift, and go to state 280 + "** (T_POW)" shift, and go to state 280 + ';' shift, and go to state 281 state 106 - 331 expr_without_variable: parenthesis_expr . + 333 expr_without_variable: parenthesis_expr . - $default reduce using rule 331 (expr_without_variable) + $default reduce using rule 333 (expr_without_variable) state 107 - 490 expr: r_variable . + 492 expr: r_variable . - $default reduce using rule 490 (expr) + $default reduce using rule 492 (expr) state 108 - 294 expr_without_variable: rw_variable . "++ (T_INC)" - 296 | rw_variable . "-- (T_DEC)" + 295 expr_without_variable: rw_variable . "++ (T_INC)" + 297 | rw_variable . "-- (T_DEC)" - "-- (T_DEC)" shift, and go to state 281 - "++ (T_INC)" shift, and go to state 282 + "-- (T_DEC)" shift, and go to state 282 + "++ (T_INC)" shift, and go to state 283 state 109 @@ -4662,150 +4668,152 @@ state 109 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + $default reduce using rule 496 (r_variable) state 110 - 392 function_call: variable_without_objects . $@65 function_call_parameter_list + 394 function_call: variable_without_objects . $@65 function_call_parameter_list - $default reduce using rule 391 ($@65) + $default reduce using rule 393 ($@65) - $@65 go to state 295 + $@65 go to state 297 state 111 - 525 base_variable: static_member . + 527 base_variable: static_member . - $default reduce using rule 525 (base_variable) + $default reduce using rule 527 (base_variable) state 112 - 388 function_call: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list - 390 | variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list - 515 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - 587 class_constant: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" + 390 function_call: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list + 392 | variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list + 517 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 589 class_constant: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 296 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 298 state 113 - 517 array_function_dereference: array_function_dereference . '[' dim_offset ']' - 521 base_variable_with_function_calls: array_function_dereference . + 519 array_function_dereference: array_function_dereference . '[' dim_offset ']' + 523 base_variable_with_function_calls: array_function_dereference . - '[' shift, and go to state 297 + '[' shift, and go to state 299 - $default reduce using rule 521 (base_variable_with_function_calls) + $default reduce using rule 523 (base_variable_with_function_calls) state 114 - 499 variable: base_variable_with_function_calls . "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties - 500 | base_variable_with_function_calls . + 501 variable: base_variable_with_function_calls . "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties + 502 | base_variable_with_function_calls . - "-> (T_OBJECT_OPERATOR)" shift, and go to state 298 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 300 - $default reduce using rule 500 (variable) + $default reduce using rule 502 (variable) state 115 - 520 base_variable_with_function_calls: base_variable . + 522 base_variable_with_function_calls: base_variable . - $default reduce using rule 520 (base_variable_with_function_calls) + $default reduce using rule 522 (base_variable_with_function_calls) state 116 - 512 variable_without_objects: reference_variable . - 516 variable_class_name: reference_variable . - 523 base_variable: reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 514 variable_without_objects: reference_variable . + 518 variable_class_name: reference_variable . + 525 base_variable: reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 516 (variable_class_name) - '(' reduce using rule 512 (variable_without_objects) - $default reduce using rule 523 (base_variable) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 518 (variable_class_name) + '(' reduce using rule 514 (variable_without_objects) + $default reduce using rule 525 (base_variable) state 117 - 528 reference_variable: compound_variable . + 530 reference_variable: compound_variable . - $default reduce using rule 528 (reference_variable) + $default reduce using rule 530 (reference_variable) state 118 - 513 variable_without_objects: simple_indirect_reference . reference_variable - 524 base_variable: simple_indirect_reference . reference_variable - 542 simple_indirect_reference: simple_indirect_reference . '$' + 515 variable_without_objects: simple_indirect_reference . reference_variable + 526 base_variable: simple_indirect_reference . reference_variable + 544 simple_indirect_reference: simple_indirect_reference . '$' "variable (T_VARIABLE)" shift, and go to state 35 - '$' shift, and go to state 301 + '$' shift, and go to state 303 - reference_variable go to state 302 + reference_variable go to state 304 compound_variable go to state 117 state 119 - 340 expr_without_variable: internal_functions_in_yacc . + 342 expr_without_variable: internal_functions_in_yacc . - $default reduce using rule 340 (expr_without_variable) + $default reduce using rule 342 (expr_without_variable) state 120 - 474 scalar: class_constant . + 476 scalar: class_constant . - $default reduce using rule 474 (scalar) + $default reduce using rule 476 (scalar) state 121 - 473 scalar: class_name_scalar . + 475 scalar: class_name_scalar . - $default reduce using rule 473 (scalar) + $default reduce using rule 475 (scalar) state 122 - 356 expr_without_variable: "yield (T_YIELD)" . + 358 expr_without_variable: "yield (T_YIELD)" . - $default reduce using rule 356 (expr_without_variable) + $default reduce using rule 358 (expr_without_variable) state 123 @@ -4817,66 +4825,67 @@ state 123 state 124 - 360 expr_without_variable: "static (T_STATIC)" . function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - 393 class_name: "static (T_STATIC)" . + 362 expr_without_variable: "static (T_STATIC)" . function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 395 class_name: "static (T_STATIC)" . "function (T_FUNCTION)" shift, and go to state 48 - $default reduce using rule 393 (class_name) + $default reduce using rule 395 (class_name) function go to state 213 state 125 - 380 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - 476 scalar: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 382 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 478 scalar: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name "\\ (T_NS_SEPARATOR)" shift, and go to state 227 state 126 - 358 expr_without_variable: function . is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function . is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' '&' shift, and go to state 250 $default reduce using rule 117 (is_reference) - is_reference go to state 303 + is_reference go to state 305 state 127 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 580 internal_functions_in_yacc: "require_once (T_REQUIRE_ONCE)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 582 internal_functions_in_yacc: "require_once (T_REQUIRE_ONCE)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -4904,40 +4913,42 @@ state 127 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 580 (internal_functions_in_yacc) + $default reduce using rule 582 (internal_functions_in_yacc) state 128 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 579 internal_functions_in_yacc: "require (T_REQUIRE)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 581 internal_functions_in_yacc: "require (T_REQUIRE)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -4965,13 +4976,14 @@ state 128 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 579 (internal_functions_in_yacc) + $default reduce using rule 581 (internal_functions_in_yacc) state 129 - 578 internal_functions_in_yacc: "eval (T_EVAL)" '(' . expr ')' + 580 internal_functions_in_yacc: "eval (T_EVAL)" '(' . expr ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -5036,7 +5048,7 @@ state 129 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 304 + expr go to state 306 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -5057,34 +5069,35 @@ state 129 state 130 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 577 internal_functions_in_yacc: "include_once (T_INCLUDE_ONCE)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 579 internal_functions_in_yacc: "include_once (T_INCLUDE_ONCE)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -5112,40 +5125,42 @@ state 130 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 577 (internal_functions_in_yacc) + $default reduce using rule 579 (internal_functions_in_yacc) state 131 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 576 internal_functions_in_yacc: "include (T_INCLUDE)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 578 internal_functions_in_yacc: "include (T_INCLUDE)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -5173,40 +5188,42 @@ state 131 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 576 (internal_functions_in_yacc) + $default reduce using rule 578 (internal_functions_in_yacc) state 132 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 355 | "print (T_PRINT)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 357 | "print (T_PRINT)" expr . '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -5231,51 +5248,53 @@ state 132 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 355 (expr_without_variable) + $default reduce using rule 357 (expr_without_variable) state 133 - 361 yield_expr: "yield (T_YIELD)" expr_without_variable . - 491 expr: expr_without_variable . + 363 yield_expr: "yield (T_YIELD)" expr_without_variable . + 493 expr: expr_without_variable . - ')' reduce using rule 361 (yield_expr) - ';' reduce using rule 361 (yield_expr) - $default reduce using rule 491 (expr) + ')' reduce using rule 363 (yield_expr) + ';' reduce using rule 363 (yield_expr) + $default reduce using rule 493 (expr) state 134 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 363 yield_expr: "yield (T_YIELD)" expr . "=> (T_DOUBLE_ARROW)" expr_without_variable - 364 | "yield (T_YIELD)" expr . "=> (T_DOUBLE_ARROW)" variable + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 365 yield_expr: "yield (T_YIELD)" expr . "=> (T_DOUBLE_ARROW)" expr_without_variable + 366 | "yield (T_YIELD)" expr . "=> (T_DOUBLE_ARROW)" variable "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -5303,7 +5322,8 @@ state 134 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - "=> (T_DOUBLE_ARROW)" shift, and go to state 305 + "** (T_POW)" shift, and go to state 280 + "=> (T_DOUBLE_ARROW)" shift, and go to state 307 state 135 @@ -5314,179 +5334,192 @@ state 135 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 362 yield_expr: "yield (T_YIELD)" variable . - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - ')' reduce using rule 362 (yield_expr) - ';' reduce using rule 362 (yield_expr) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 364 yield_expr: "yield (T_YIELD)" variable . + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + ')' reduce using rule 364 (yield_expr) + ';' reduce using rule 364 (yield_expr) + $default reduce using rule 496 (r_variable) state 136 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 318 | '+' expr . - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 320 | '+' expr . + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 318 (expr_without_variable) + $default reduce using rule 320 (expr_without_variable) state 137 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 319 | '-' expr . - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 321 | '-' expr . + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 319 (expr_without_variable) + $default reduce using rule 321 (expr_without_variable) state 138 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 320 | '!' expr . - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 322 | '!' expr . + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 320 (expr_without_variable) + $default reduce using rule 322 (expr_without_variable) state 139 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 321 | '~' expr . - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 323 | '~' expr . + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 321 (expr_without_variable) + $default reduce using rule 323 (expr_without_variable) state 140 - 350 expr_without_variable: '@' $@55 . expr + 352 expr_without_variable: '@' $@55 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -5551,7 +5584,7 @@ state 140 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 306 + expr go to state 308 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -5572,323 +5605,344 @@ state 140 state 141 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 347 | "(unset) (T_UNSET_CAST)" expr . - - $default reduce using rule 347 (expr_without_variable) + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 349 | "(unset) (T_UNSET_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 + + $default reduce using rule 349 (expr_without_variable) state 142 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 346 | "(bool) (T_BOOL_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 348 | "(bool) (T_BOOL_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 346 (expr_without_variable) + $default reduce using rule 348 (expr_without_variable) state 143 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 345 | "(object) (T_OBJECT_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 347 | "(object) (T_OBJECT_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 345 (expr_without_variable) + $default reduce using rule 347 (expr_without_variable) state 144 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 344 | "(array) (T_ARRAY_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 346 | "(array) (T_ARRAY_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 344 (expr_without_variable) + $default reduce using rule 346 (expr_without_variable) state 145 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 343 | "(string) (T_STRING_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 345 | "(string) (T_STRING_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 343 (expr_without_variable) + $default reduce using rule 345 (expr_without_variable) state 146 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 342 | "(double) (T_DOUBLE_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 344 | "(double) (T_DOUBLE_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 342 (expr_without_variable) + $default reduce using rule 344 (expr_without_variable) state 147 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 341 | "(int) (T_INT_CAST)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 343 | "(int) (T_INT_CAST)" expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 341 (expr_without_variable) + $default reduce using rule 343 (expr_without_variable) state 148 - 393 class_name: "static (T_STATIC)" . + 395 class_name: "static (T_STATIC)" . - $default reduce using rule 393 (class_name) + $default reduce using rule 395 (class_name) state 149 - 380 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 382 function_call: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - "\\ (T_NS_SEPARATOR)" shift, and go to state 307 + "\\ (T_NS_SEPARATOR)" shift, and go to state 309 state 150 - 382 function_call: "\\ (T_NS_SEPARATOR)" . namespace_name @60 function_call_parameter_list - 396 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name + 384 function_call: "\\ (T_NS_SEPARATOR)" . namespace_name @60 function_call_parameter_list + 398 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 308 + namespace_name go to state 310 state 151 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 378 function_call: namespace_name . @58 function_call_parameter_list - 394 class_name: namespace_name . + 380 function_call: namespace_name . @58 function_call_parameter_list + 396 class_name: namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 394 (class_name) - $default reduce using rule 377 (@58) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) + $default reduce using rule 379 (@58) @58 go to state 242 state 152 - 384 function_call: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list - 386 | class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list - 514 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 386 function_call: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list + 388 | class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list + 516 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 309 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 311 state 153 - 297 expr_without_variable: "-- (T_DEC)" rw_variable . + 298 expr_without_variable: "-- (T_DEC)" rw_variable . - $default reduce using rule 297 (expr_without_variable) + $default reduce using rule 298 (expr_without_variable) state 154 - 496 rw_variable: variable . + 498 rw_variable: variable . - $default reduce using rule 496 (rw_variable) + $default reduce using rule 498 (rw_variable) state 155 - 388 function_call: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list - 390 | variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list - 515 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 390 function_call: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list + 392 | variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list + 517 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 310 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 312 state 156 - 295 expr_without_variable: "++ (T_INC)" rw_variable . + 296 expr_without_variable: "++ (T_INC)" rw_variable . - $default reduce using rule 295 (expr_without_variable) + $default reduce using rule 296 (expr_without_variable) state 157 - 558 non_empty_array_pair_list: '&' . w_variable + 560 non_empty_array_pair_list: '&' . w_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -5900,8 +5954,8 @@ state 157 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 311 - variable go to state 312 + w_variable go to state 313 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -5915,36 +5969,37 @@ state 157 state 158 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 553 non_empty_array_pair_list: expr . "=> (T_DOUBLE_ARROW)" expr - 554 | expr . - 557 | expr . "=> (T_DOUBLE_ARROW)" '&' w_variable + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 555 non_empty_array_pair_list: expr . "=> (T_DOUBLE_ARROW)" expr + 556 | expr . + 559 | expr . "=> (T_DOUBLE_ARROW)" '&' w_variable "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -5972,101 +6027,103 @@ state 158 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - "=> (T_DOUBLE_ARROW)" shift, and go to state 313 + "** (T_POW)" shift, and go to state 280 + "=> (T_DOUBLE_ARROW)" shift, and go to state 315 - $default reduce using rule 554 (non_empty_array_pair_list) + $default reduce using rule 556 (non_empty_array_pair_list) state 159 - 369 combined_scalar: '[' array_pair_list . ']' + 371 combined_scalar: '[' array_pair_list . ']' - ']' shift, and go to state 314 + ']' shift, and go to state 316 state 160 - 550 array_pair_list: non_empty_array_pair_list . possible_comma - 551 non_empty_array_pair_list: non_empty_array_pair_list . ',' expr "=> (T_DOUBLE_ARROW)" expr - 552 | non_empty_array_pair_list . ',' expr - 555 | non_empty_array_pair_list . ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable - 556 | non_empty_array_pair_list . ',' '&' w_variable + 552 array_pair_list: non_empty_array_pair_list . possible_comma + 553 non_empty_array_pair_list: non_empty_array_pair_list . ',' expr "=> (T_DOUBLE_ARROW)" expr + 554 | non_empty_array_pair_list . ',' expr + 557 | non_empty_array_pair_list . ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable + 558 | non_empty_array_pair_list . ',' '&' w_variable - ',' shift, and go to state 315 + ',' shift, and go to state 317 - $default reduce using rule 484 (possible_comma) + $default reduce using rule 486 (possible_comma) - possible_comma go to state 316 + possible_comma go to state 318 state 161 282 expr_without_variable: "clone (T_CLONE)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr $default reduce using rule 282 (expr_without_variable) state 162 - 395 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 397 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - "\\ (T_NS_SEPARATOR)" shift, and go to state 317 + "\\ (T_NS_SEPARATOR)" shift, and go to state 319 state 163 - 396 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name + 398 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 318 + namespace_name go to state 320 state 164 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 394 class_name: namespace_name . + 396 class_name: namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 394 (class_name) + $default reduce using rule 396 (class_name) state 165 - 400 class_name_reference: class_name . - 514 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 402 class_name_reference: class_name . + 516 static_member: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 319 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 321 - $default reduce using rule 400 (class_name_reference) + $default reduce using rule 402 (class_name_reference) state 166 @@ -6075,64 +6132,64 @@ state 166 $default reduce using rule 274 ($@44) - $@44 go to state 320 + $@44 go to state 322 state 167 - 401 class_name_reference: dynamic_class_name_reference . + 403 class_name_reference: dynamic_class_name_reference . - $default reduce using rule 401 (class_name_reference) + $default reduce using rule 403 (class_name_reference) state 168 - 515 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects + 517 static_member: variable_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 321 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 323 state 169 - 404 dynamic_class_name_reference: base_variable . "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties - 405 | base_variable . + 406 dynamic_class_name_reference: base_variable . "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties + 407 | base_variable . - "-> (T_OBJECT_OPERATOR)" shift, and go to state 322 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 324 - $default reduce using rule 405 (dynamic_class_name_reference) + $default reduce using rule 407 (dynamic_class_name_reference) state 170 - 516 variable_class_name: reference_variable . - 523 base_variable: reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 518 variable_class_name: reference_variable . + 525 base_variable: reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 516 (variable_class_name) - $default reduce using rule 523 (base_variable) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 518 (variable_class_name) + $default reduce using rule 525 (base_variable) state 171 - 524 base_variable: simple_indirect_reference . reference_variable - 542 simple_indirect_reference: simple_indirect_reference . '$' + 526 base_variable: simple_indirect_reference . reference_variable + 544 simple_indirect_reference: simple_indirect_reference . '$' "variable (T_VARIABLE)" shift, and go to state 35 - '$' shift, and go to state 301 + '$' shift, and go to state 303 - reference_variable go to state 323 + reference_variable go to state 325 compound_variable go to state 117 state 172 - 410 exit_expr: '(' . ')' - 492 parenthesis_expr: '(' . expr ')' - 493 | '(' . yield_expr ')' + 412 exit_expr: '(' . ')' + 494 parenthesis_expr: '(' . expr ')' + 495 | '(' . yield_expr ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -6183,7 +6240,7 @@ state 172 "__DIR__ (T_DIR)" shift, and go to state 76 "\\ (T_NS_SEPARATOR)" shift, and go to state 77 '(' shift, and go to state 78 - ')' shift, and go to state 324 + ')' shift, and go to state 326 '$' shift, and go to state 81 '`' shift, and go to state 82 '"' shift, and go to state 83 @@ -6220,22 +6277,22 @@ state 172 state 173 - 348 expr_without_variable: "exit (T_EXIT)" exit_expr . + 350 expr_without_variable: "exit (T_EXIT)" exit_expr . - $default reduce using rule 348 (expr_without_variable) + $default reduce using rule 350 (expr_without_variable) state 174 - 411 exit_expr: parenthesis_expr . + 413 exit_expr: parenthesis_expr . - $default reduce using rule 411 (exit_expr) + $default reduce using rule 413 (exit_expr) state 175 - 492 parenthesis_expr: '(' . expr ')' - 493 | '(' . yield_expr ')' + 494 parenthesis_expr: '(' . expr ')' + 495 | '(' . yield_expr ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -6325,11 +6382,11 @@ state 176 52 unticked_statement: "if (T_IF)" parenthesis_expr . $@5 statement $@6 elseif_list else_single 55 | "if (T_IF)" parenthesis_expr . ':' $@7 inner_statement_list $@8 new_elseif_list new_else_single "endif (T_ENDIF)" ';' - ':' shift, and go to state 325 + ':' shift, and go to state 327 $default reduce using rule 50 ($@5) - $@5 go to state 326 + $@5 go to state 328 state 177 @@ -6341,7 +6398,7 @@ state 177 state 178 - 367 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' . dim_offset ']' + 369 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -6396,7 +6453,7 @@ state 178 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -6408,7 +6465,7 @@ state 178 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -6421,7 +6478,7 @@ state 178 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 328 + dim_offset go to state 330 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 @@ -6433,40 +6490,41 @@ state 179 78 unticked_statement: "echo (T_ECHO)" echo_expr_list . ';' 256 echo_expr_list: echo_expr_list . ',' expr - ',' shift, and go to state 329 - ';' shift, and go to state 330 + ',' shift, and go to state 331 + ';' shift, and go to state 332 state 180 257 echo_expr_list: expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -6494,6 +6552,7 @@ state 180 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 257 (echo_expr_list) @@ -6575,7 +6634,7 @@ state 181 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 331 + statement go to state 333 unticked_statement go to state 88 new_expr go to state 95 expr_without_variable go to state 96 @@ -6612,7 +6671,7 @@ state 182 '(' shift, and go to state 175 - parenthesis_expr go to state 332 + parenthesis_expr go to state 334 state 183 @@ -6675,8 +6734,8 @@ state 183 $default reduce using rule 258 (for_expr) namespace_name go to state 84 - for_expr go to state 333 - non_empty_for_expr go to state 334 + for_expr go to state 335 + non_empty_for_expr go to state 336 new_expr go to state 95 expr_without_variable go to state 96 combined_scalar_offset go to state 98 @@ -6686,7 +6745,7 @@ state 183 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 335 + expr go to state 337 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -6765,7 +6824,7 @@ state 184 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 336 + expr_without_variable go to state 338 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -6777,7 +6836,7 @@ state 184 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 337 + variable go to state 339 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -6796,7 +6855,7 @@ state 185 89 unticked_statement: "declare (T_DECLARE)" $@21 . '(' declare_list ')' declare_statement - '(' shift, and go to state 338 + '(' shift, and go to state 340 state 186 @@ -6805,7 +6864,7 @@ state 186 $default reduce using rule 66 ($@16) - $@16 go to state 339 + $@16 go to state 341 state 187 @@ -6818,33 +6877,34 @@ state 187 state 188 69 unticked_statement: "break (T_BREAK)" expr . ';' - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -6872,7 +6932,8 @@ state 188 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ';' shift, and go to state 340 + "** (T_POW)" shift, and go to state 280 + ';' shift, and go to state 342 state 189 @@ -6885,33 +6946,34 @@ state 189 state 190 71 unticked_statement: "continue (T_CONTINUE)" expr . ';' - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -6939,21 +7001,22 @@ state 190 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ';' shift, and go to state 341 + "** (T_POW)" shift, and go to state 280 + ';' shift, and go to state 343 state 191 95 unticked_statement: "goto (T_GOTO)" "identifier (T_STRING)" . ';' - ';' shift, and go to state 342 + ';' shift, and go to state 344 state 192 39 constant_declaration: "const (T_CONST)" "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 343 + '=' shift, and go to state 345 state 193 @@ -6966,42 +7029,43 @@ state 193 state 194 73 unticked_statement: "return (T_RETURN)" expr_without_variable . ';' - 491 expr: expr_without_variable . + 493 expr: expr_without_variable . - ';' shift, and go to state 344 + ';' shift, and go to state 346 - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) state 195 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -7029,6 +7093,7 @@ state 195 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 state 196 @@ -7040,73 +7105,76 @@ state 196 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - ';' shift, and go to state 345 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + ';' shift, and go to state 347 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + $default reduce using rule 496 (r_variable) state 197 93 unticked_statement: "try (T_TRY)" $@22 . '{' inner_statement_list '}' catch_statement $@23 finally_statement - '{' shift, and go to state 346 + '{' shift, and go to state 348 state 198 94 unticked_statement: "throw (T_THROW)" expr . ';' - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -7134,7 +7202,8 @@ state 198 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ';' shift, and go to state 347 + "** (T_POW)" shift, and go to state 280 + ';' shift, and go to state 349 state 199 @@ -7142,11 +7211,11 @@ state 199 17 top_statement: "use (T_USE)" "function (T_FUNCTION)" . use_function_declarations ';' "identifier (T_STRING)" shift, and go to state 123 - "\\ (T_NS_SEPARATOR)" shift, and go to state 348 + "\\ (T_NS_SEPARATOR)" shift, and go to state 350 - namespace_name go to state 349 - use_function_declarations go to state 350 - use_function_declaration go to state 351 + namespace_name go to state 351 + use_function_declarations go to state 352 + use_function_declaration go to state 353 state 200 @@ -7154,11 +7223,11 @@ state 200 18 top_statement: "use (T_USE)" "const (T_CONST)" . use_const_declarations ';' "identifier (T_STRING)" shift, and go to state 123 - "\\ (T_NS_SEPARATOR)" shift, and go to state 352 + "\\ (T_NS_SEPARATOR)" shift, and go to state 354 - namespace_name go to state 353 - use_const_declarations go to state 354 - use_const_declaration go to state 355 + namespace_name go to state 355 + use_const_declarations go to state 356 + use_const_declaration go to state 357 state 201 @@ -7168,7 +7237,7 @@ state 201 "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 356 + namespace_name go to state 358 state 202 @@ -7177,7 +7246,7 @@ state 202 22 use_declaration: namespace_name . 23 | namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 357 + "as (T_AS)" shift, and go to state 359 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 22 (use_declaration) @@ -7188,8 +7257,8 @@ state 203 16 top_statement: "use (T_USE)" use_declarations . ';' 20 use_declarations: use_declarations . ',' use_declaration - ',' shift, and go to state 358 - ';' shift, and go to state 359 + ',' shift, and go to state 360 + ';' shift, and go to state 361 state 204 @@ -7216,14 +7285,14 @@ state 206 "static (T_STATIC)" shift, and go to state 148 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 - '{' shift, and go to state 360 + '{' shift, and go to state 362 '$' shift, and go to state 81 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - r_variable go to state 361 - variable go to state 362 + r_variable go to state 363 + variable go to state 364 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -7240,8 +7309,8 @@ state 207 76 unticked_statement: "global (T_GLOBAL)" global_var_list . ';' 198 global_var_list: global_var_list . ',' global_var - ',' shift, and go to state 363 - ';' shift, and go to state 364 + ',' shift, and go to state 365 + ';' shift, and go to state 366 state 208 @@ -7270,7 +7339,7 @@ state 211 205 static_var_list: "variable (T_VARIABLE)" . 206 | "variable (T_VARIABLE)" . '=' static_scalar - '=' shift, and go to state 365 + '=' shift, and go to state 367 $default reduce using rule 205 (static_var_list) @@ -7281,19 +7350,19 @@ state 212 203 static_var_list: static_var_list . ',' "variable (T_VARIABLE)" 204 | static_var_list . ',' "variable (T_VARIABLE)" '=' static_scalar - ',' shift, and go to state 366 - ';' shift, and go to state 367 + ',' shift, and go to state 368 + ';' shift, and go to state 369 state 213 - 360 expr_without_variable: "static (T_STATIC)" function . is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function . is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' '&' shift, and go to state 250 $default reduce using rule 117 (is_reference) - is_reference go to state 368 + is_reference go to state 370 state 214 @@ -7308,11 +7377,11 @@ state 214 '$' shift, and go to state 81 namespace_name go to state 151 - unset_variables go to state 369 - unset_variable go to state 370 + unset_variables go to state 371 + unset_variable go to state 372 function_call go to state 101 class_name go to state 152 - variable go to state 371 + variable go to state 373 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -7326,7 +7395,7 @@ state 214 state 215 - 573 internal_functions_in_yacc: "isset (T_ISSET)" '(' . isset_variables ')' + 575 internal_functions_in_yacc: "isset (T_ISSET)" '(' . isset_variables ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -7383,7 +7452,7 @@ state 215 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 372 + expr_without_variable go to state 374 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -7395,7 +7464,7 @@ state 215 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 373 + variable go to state 375 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -7406,16 +7475,16 @@ state 215 compound_variable go to state 117 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 - isset_variables go to state 374 - isset_variable go to state 375 + isset_variables go to state 376 + isset_variable go to state 377 class_constant go to state 120 class_name_scalar go to state 121 state 216 - 574 internal_functions_in_yacc: "empty (T_EMPTY)" '(' . variable ')' - 575 | "empty (T_EMPTY)" '(' . expr_without_variable ')' + 576 internal_functions_in_yacc: "empty (T_EMPTY)" '(' . variable ')' + 577 | "empty (T_EMPTY)" '(' . expr_without_variable ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -7472,7 +7541,7 @@ state 216 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 376 + expr_without_variable go to state 378 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -7484,7 +7553,7 @@ state 216 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 377 + variable go to state 379 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -7503,7 +7572,7 @@ state 217 10 top_statement: "__halt_compiler (T_HALT_COMPILER)" '(' . ')' ';' - ')' shift, and go to state 378 + ')' shift, and go to state 380 state 218 @@ -7512,12 +7581,12 @@ state 218 $default reduce using rule 276 ($@45) - $@45 go to state 379 + $@45 go to state 381 state 219 - 368 combined_scalar: "array (T_ARRAY)" '(' . array_pair_list ')' + 370 combined_scalar: "array (T_ARRAY)" '(' . array_pair_list ')' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -7573,7 +7642,7 @@ state 219 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 549 (array_pair_list) + $default reduce using rule 551 (array_pair_list) namespace_name go to state 84 new_expr go to state 95 @@ -7599,7 +7668,7 @@ state 219 reference_variable go to state 116 compound_variable go to state 117 simple_indirect_reference go to state 118 - array_pair_list go to state 380 + array_pair_list go to state 382 non_empty_array_pair_list go to state 160 internal_functions_in_yacc go to state 119 class_constant go to state 120 @@ -7608,40 +7677,40 @@ state 219 state 220 - 563 encaps_var: "variable (T_VARIABLE)" . - 565 | "variable (T_VARIABLE)" . '[' $@75 encaps_var_offset ']' - 566 | "variable (T_VARIABLE)" . "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" + 565 encaps_var: "variable (T_VARIABLE)" . + 567 | "variable (T_VARIABLE)" . '[' $@75 encaps_var_offset ']' + 568 | "variable (T_VARIABLE)" . "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" - '[' shift, and go to state 381 - "-> (T_OBJECT_OPERATOR)" shift, and go to state 382 + '[' shift, and go to state 383 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 384 - $default reduce using rule 563 (encaps_var) + $default reduce using rule 565 (encaps_var) state 221 - 427 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . "heredoc end (T_END_HEREDOC)" - 562 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var + 429 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . "heredoc end (T_END_HEREDOC)" + 564 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var "variable (T_VARIABLE)" shift, and go to state 220 - "heredoc end (T_END_HEREDOC)" shift, and go to state 383 + "heredoc end (T_END_HEREDOC)" shift, and go to state 385 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - encaps_var go to state 384 + encaps_var go to state 386 state 222 - 428 common_scalar: "heredoc start (T_START_HEREDOC)" "heredoc end (T_END_HEREDOC)" . + 430 common_scalar: "heredoc start (T_START_HEREDOC)" "heredoc end (T_END_HEREDOC)" . - $default reduce using rule 428 (common_scalar) + $default reduce using rule 430 (common_scalar) state 223 - 567 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" . expr '}' - 568 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" . "variable name (T_STRING_VARNAME)" '[' expr ']' '}' + 569 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" . expr '}' + 570 | "${ (T_DOLLAR_OPEN_CURLY_BRACES)" . "variable name (T_STRING_VARNAME)" '[' expr ']' '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -7671,7 +7740,7 @@ state 223 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "variable name (T_STRING_VARNAME)" shift, and go to state 385 + "variable name (T_STRING_VARNAME)" shift, and go to state 387 "variable (T_VARIABLE)" shift, and go to state 35 "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 37 "function (T_FUNCTION)" shift, and go to state 48 @@ -7706,7 +7775,7 @@ state 223 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 386 + expr go to state 388 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -7727,7 +7796,7 @@ state 223 state 224 - 569 encaps_var: "{$ (T_CURLY_OPEN)" . variable '}' + 571 encaps_var: "{$ (T_CURLY_OPEN)" . variable '}' "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -7739,7 +7808,7 @@ state 224 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 387 + variable go to state 389 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -7753,35 +7822,35 @@ state 224 state 225 - 480 scalar: "heredoc start (T_START_HEREDOC)" encaps_list . "heredoc end (T_END_HEREDOC)" - 559 encaps_list: encaps_list . encaps_var - 560 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" + 482 scalar: "heredoc start (T_START_HEREDOC)" encaps_list . "heredoc end (T_END_HEREDOC)" + 561 encaps_list: encaps_list . encaps_var + 562 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "variable (T_VARIABLE)" shift, and go to state 220 - "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 388 - "heredoc end (T_END_HEREDOC)" shift, and go to state 389 + "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 390 + "heredoc end (T_END_HEREDOC)" shift, and go to state 391 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - encaps_var go to state 390 + encaps_var go to state 392 state 226 - 561 encaps_list: encaps_var . + 563 encaps_list: encaps_var . - $default reduce using rule 561 (encaps_list) + $default reduce using rule 563 (encaps_list) state 227 - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name - 476 scalar: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 478 scalar: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 391 + namespace_name go to state 393 state 228 @@ -7790,7 +7859,7 @@ state 228 $default reduce using rule 14 ($@3) - $@3 go to state 392 + $@3 go to state 394 state 229 @@ -7800,74 +7869,75 @@ state 229 13 | "namespace (T_NAMESPACE)" namespace_name . '{' $@2 top_statement_list '}' "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ';' shift, and go to state 393 - '{' shift, and go to state 394 + ';' shift, and go to state 395 + '{' shift, and go to state 396 state 230 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 382 function_call: "\\ (T_NS_SEPARATOR)" namespace_name . @60 function_call_parameter_list - 396 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . - 477 scalar: "\\ (T_NS_SEPARATOR)" namespace_name . + 384 function_call: "\\ (T_NS_SEPARATOR)" namespace_name . @60 function_call_parameter_list + 398 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . + 479 scalar: "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) - '(' reduce using rule 381 (@60) - $default reduce using rule 477 (scalar) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 398 (class_name) + '(' reduce using rule 383 (@60) + $default reduce using rule 479 (scalar) - @60 go to state 395 + @60 go to state 397 state 231 - 332 expr_without_variable: new_expr . - 334 | '(' new_expr . ')' @51 instance_call + 334 expr_without_variable: new_expr . + 336 | '(' new_expr . ')' @51 instance_call - ')' shift, and go to state 396 + ')' shift, and go to state 398 - ')' [reduce using rule 332 (expr_without_variable)] - $default reduce using rule 332 (expr_without_variable) + ')' [reduce using rule 334 (expr_without_variable)] + $default reduce using rule 334 (expr_without_variable) state 232 - 493 parenthesis_expr: '(' yield_expr . ')' + 495 parenthesis_expr: '(' yield_expr . ')' - ')' shift, and go to state 397 + ')' shift, and go to state 399 state 233 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 492 parenthesis_expr: '(' expr . ')' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 494 parenthesis_expr: '(' expr . ')' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -7895,7 +7965,8 @@ state 233 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ')' shift, and go to state 398 + "** (T_POW)" shift, and go to state 280 + ')' shift, and go to state 400 state 234 @@ -7903,16 +7974,16 @@ state 234 41 inner_statement_list: inner_statement_list . $@4 inner_statement 49 unticked_statement: '{' inner_statement_list . '}' - '}' shift, and go to state 399 + '}' shift, and go to state 401 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 state 235 - 530 compound_variable: '$' '{' . expr '}' + 532 compound_variable: '$' '{' . expr '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -7977,7 +8048,7 @@ state 235 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 401 + expr go to state 403 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -7998,88 +8069,88 @@ state 235 state 236 - 413 backticks_expr: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . - 562 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var + 415 backticks_expr: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . + 564 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var "variable (T_VARIABLE)" shift, and go to state 220 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - $default reduce using rule 413 (backticks_expr) + $default reduce using rule 415 (backticks_expr) - encaps_var go to state 384 + encaps_var go to state 386 state 237 - 354 expr_without_variable: '`' backticks_expr . '`' + 356 expr_without_variable: '`' backticks_expr . '`' - '`' shift, and go to state 402 + '`' shift, and go to state 404 state 238 - 414 backticks_expr: encaps_list . - 559 encaps_list: encaps_list . encaps_var - 560 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" + 416 backticks_expr: encaps_list . + 561 encaps_list: encaps_list . encaps_var + 562 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "variable (T_VARIABLE)" shift, and go to state 220 - "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 388 + "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 390 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - $default reduce using rule 414 (backticks_expr) + $default reduce using rule 416 (backticks_expr) - encaps_var go to state 390 + encaps_var go to state 392 state 239 - 562 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var + 564 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . encaps_var "variable (T_VARIABLE)" shift, and go to state 220 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - encaps_var go to state 384 + encaps_var go to state 386 state 240 - 479 scalar: '"' encaps_list . '"' - 559 encaps_list: encaps_list . encaps_var - 560 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" + 481 scalar: '"' encaps_list . '"' + 561 encaps_list: encaps_list . encaps_var + 562 | encaps_list . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "variable (T_VARIABLE)" shift, and go to state 220 - "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 388 + "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 390 "${ (T_DOLLAR_OPEN_CURLY_BRACES)" shift, and go to state 223 "{$ (T_CURLY_OPEN)" shift, and go to state 224 - '"' shift, and go to state 403 + '"' shift, and go to state 405 - encaps_var go to state 390 + encaps_var go to state 392 state 241 6 namespace_name: namespace_name "\\ (T_NS_SEPARATOR)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 404 + "identifier (T_STRING)" shift, and go to state 406 state 242 - 378 function_call: namespace_name @58 . function_call_parameter_list + 380 function_call: namespace_name @58 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 406 + function_call_parameter_list go to state 408 state 243 38 constant_declaration: constant_declaration ',' . "identifier (T_STRING)" '=' static_scalar - "identifier (T_STRING)" shift, and go to state 407 + "identifier (T_STRING)" shift, and go to state 409 state 244 @@ -8093,11 +8164,11 @@ state 245 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" . extends_from $@32 implements_list '{' class_statement_list '}' - "extends (T_EXTENDS)" shift, and go to state 408 + "extends (T_EXTENDS)" shift, and go to state 410 $default reduce using rule 131 (extends_from) - extends_from go to state 409 + extends_from go to state 411 state 246 @@ -8106,7 +8177,7 @@ state 246 $default reduce using rule 125 ($@33) - $@33 go to state 410 + $@33 go to state 412 state 247 @@ -8118,7 +8189,7 @@ state 247 state 248 - 366 combined_scalar_offset: combined_scalar_offset '[' . dim_offset ']' + 368 combined_scalar_offset: combined_scalar_offset '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8173,7 +8244,7 @@ state 248 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -8185,7 +8256,7 @@ state 248 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8198,7 +8269,7 @@ state 248 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 411 + dim_offset go to state 413 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 @@ -8207,7 +8278,7 @@ state 248 state 249 - 365 combined_scalar_offset: combined_scalar '[' . dim_offset ']' + 367 combined_scalar_offset: combined_scalar '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8262,7 +8333,7 @@ state 249 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -8274,7 +8345,7 @@ state 249 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8287,7 +8358,7 @@ state 249 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 412 + dim_offset go to state 414 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 @@ -8304,55 +8375,55 @@ state 250 state 251 122 unticked_function_declaration_statement: function is_reference . "identifier (T_STRING)" $@31 '(' parameter_list ')' '{' inner_statement_list '}' - 358 expr_without_variable: function is_reference . @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference . @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - "identifier (T_STRING)" shift, and go to state 413 + "identifier (T_STRING)" shift, and go to state 415 - $default reduce using rule 357 (@56) + $default reduce using rule 359 (@56) - @56 go to state 414 + @56 go to state 416 state 252 - 519 array_function_dereference: function_call $@72 . '[' dim_offset ']' + 521 array_function_dereference: function_call $@72 . '[' dim_offset ']' - '[' shift, and go to state 415 + '[' shift, and go to state 417 state 253 - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name @61 function_call_parameter_list - 386 | class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@62 function_call_parameter_list - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects - 586 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" - 589 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "class (T_CLASS)" + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name @61 function_call_parameter_list + 388 | class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@62 function_call_parameter_list + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 588 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" + 591 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "class (T_CLASS)" - "identifier (T_STRING)" shift, and go to state 416 + "identifier (T_STRING)" shift, and go to state 418 "variable (T_VARIABLE)" shift, and go to state 35 - "class (T_CLASS)" shift, and go to state 417 - '{' shift, and go to state 418 + "class (T_CLASS)" shift, and go to state 419 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 419 - reference_variable go to state 420 + variable_without_objects go to state 421 + reference_variable go to state 422 compound_variable go to state 117 - variable_name go to state 421 - simple_indirect_reference go to state 422 + variable_name go to state 423 + simple_indirect_reference go to state 424 state 254 - 303 expr_without_variable: expr "or (T_LOGICAL_OR)" . $@49 expr + 304 expr_without_variable: expr "or (T_LOGICAL_OR)" . $@49 expr - $default reduce using rule 302 ($@49) + $default reduce using rule 303 ($@49) - $@49 go to state 423 + $@49 go to state 425 state 255 - 306 expr_without_variable: expr "xor (T_LOGICAL_XOR)" . expr + 307 expr_without_variable: expr "xor (T_LOGICAL_XOR)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8417,7 +8488,7 @@ state 255 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 424 + expr go to state 426 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8438,46 +8509,46 @@ state 255 state 256 - 305 expr_without_variable: expr "and (T_LOGICAL_AND)" . $@50 expr + 306 expr_without_variable: expr "and (T_LOGICAL_AND)" . $@50 expr - $default reduce using rule 304 ($@50) + $default reduce using rule 305 ($@50) - $@50 go to state 425 + $@50 go to state 427 state 257 - 337 expr_without_variable: expr '?' . $@52 expr ':' $@53 expr - 339 | expr '?' . ':' $@54 expr + 339 expr_without_variable: expr '?' . $@52 expr ':' $@53 expr + 341 | expr '?' . ':' $@54 expr - ':' shift, and go to state 426 + ':' shift, and go to state 428 - $default reduce using rule 335 ($@52) + $default reduce using rule 337 ($@52) - $@52 go to state 427 + $@52 go to state 429 state 258 - 299 expr_without_variable: expr "|| (T_BOOLEAN_OR)" . $@47 expr + 300 expr_without_variable: expr "|| (T_BOOLEAN_OR)" . $@47 expr - $default reduce using rule 298 ($@47) + $default reduce using rule 299 ($@47) - $@47 go to state 428 + $@47 go to state 430 state 259 - 301 expr_without_variable: expr "&& (T_BOOLEAN_AND)" . $@48 expr + 302 expr_without_variable: expr "&& (T_BOOLEAN_AND)" . $@48 expr - $default reduce using rule 300 ($@48) + $default reduce using rule 301 ($@48) - $@48 go to state 429 + $@48 go to state 431 state 260 - 307 expr_without_variable: expr '|' . expr + 308 expr_without_variable: expr '|' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8542,7 +8613,7 @@ state 260 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 430 + expr go to state 432 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8563,7 +8634,7 @@ state 260 state 261 - 309 expr_without_variable: expr '^' . expr + 310 expr_without_variable: expr '^' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8628,7 +8699,7 @@ state 261 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 431 + expr go to state 433 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8649,7 +8720,7 @@ state 261 state 262 - 308 expr_without_variable: expr '&' . expr + 309 expr_without_variable: expr '&' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8714,7 +8785,7 @@ state 262 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 432 + expr go to state 434 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8735,7 +8806,7 @@ state 262 state 263 - 323 expr_without_variable: expr "!== (T_IS_NOT_IDENTICAL)" . expr + 325 expr_without_variable: expr "!== (T_IS_NOT_IDENTICAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8800,7 +8871,7 @@ state 263 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 433 + expr go to state 435 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8821,7 +8892,7 @@ state 263 state 264 - 322 expr_without_variable: expr "=== (T_IS_IDENTICAL)" . expr + 324 expr_without_variable: expr "=== (T_IS_IDENTICAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8886,7 +8957,7 @@ state 264 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 434 + expr go to state 436 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8907,7 +8978,7 @@ state 264 state 265 - 325 expr_without_variable: expr "!= (T_IS_NOT_EQUAL)" . expr + 327 expr_without_variable: expr "!= (T_IS_NOT_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -8972,7 +9043,7 @@ state 265 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 435 + expr go to state 437 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -8993,7 +9064,7 @@ state 265 state 266 - 324 expr_without_variable: expr "== (T_IS_EQUAL)" . expr + 326 expr_without_variable: expr "== (T_IS_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9058,7 +9129,7 @@ state 266 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 436 + expr go to state 438 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9079,7 +9150,7 @@ state 266 state 267 - 326 expr_without_variable: expr '<' . expr + 328 expr_without_variable: expr '<' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9144,7 +9215,7 @@ state 267 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 437 + expr go to state 439 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9165,7 +9236,7 @@ state 267 state 268 - 328 expr_without_variable: expr '>' . expr + 330 expr_without_variable: expr '>' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9230,7 +9301,7 @@ state 268 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 438 + expr go to state 440 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9251,7 +9322,7 @@ state 268 state 269 - 329 expr_without_variable: expr ">= (T_IS_GREATER_OR_EQUAL)" . expr + 331 expr_without_variable: expr ">= (T_IS_GREATER_OR_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9316,7 +9387,7 @@ state 269 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 439 + expr go to state 441 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9337,7 +9408,7 @@ state 269 state 270 - 327 expr_without_variable: expr "<= (T_IS_SMALLER_OR_EQUAL)" . expr + 329 expr_without_variable: expr "<= (T_IS_SMALLER_OR_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9402,7 +9473,7 @@ state 270 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 440 + expr go to state 442 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9423,7 +9494,7 @@ state 270 state 271 - 317 expr_without_variable: expr ">> (T_SR)" . expr + 319 expr_without_variable: expr ">> (T_SR)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9488,7 +9559,7 @@ state 271 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 441 + expr go to state 443 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9509,7 +9580,7 @@ state 271 state 272 - 316 expr_without_variable: expr "<< (T_SL)" . expr + 318 expr_without_variable: expr "<< (T_SL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9574,7 +9645,7 @@ state 272 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 442 + expr go to state 444 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9595,7 +9666,7 @@ state 272 state 273 - 311 expr_without_variable: expr '+' . expr + 312 expr_without_variable: expr '+' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9660,7 +9731,7 @@ state 273 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 443 + expr go to state 445 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9681,7 +9752,7 @@ state 273 state 274 - 312 expr_without_variable: expr '-' . expr + 313 expr_without_variable: expr '-' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9746,7 +9817,7 @@ state 274 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 444 + expr go to state 446 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9767,7 +9838,7 @@ state 274 state 275 - 310 expr_without_variable: expr '.' . expr + 311 expr_without_variable: expr '.' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9832,7 +9903,7 @@ state 275 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 445 + expr go to state 447 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9853,7 +9924,7 @@ state 275 state 276 - 313 expr_without_variable: expr '*' . expr + 314 expr_without_variable: expr '*' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -9918,7 +9989,7 @@ state 276 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 446 + expr go to state 448 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -9939,7 +10010,7 @@ state 276 state 277 - 314 expr_without_variable: expr '/' . expr + 316 expr_without_variable: expr '/' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10004,7 +10075,7 @@ state 277 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 447 + expr go to state 449 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10025,7 +10096,7 @@ state 277 state 278 - 315 expr_without_variable: expr '%' . expr + 317 expr_without_variable: expr '%' . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10090,7 +10161,7 @@ state 278 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 448 + expr go to state 450 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10111,7 +10182,7 @@ state 278 state 279 - 330 expr_without_variable: expr "instanceof (T_INSTANCEOF)" . class_name_reference + 332 expr_without_variable: expr "instanceof (T_INSTANCEOF)" . class_name_reference "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -10122,7 +10193,7 @@ state 279 namespace_name go to state 164 class_name go to state 165 - class_name_reference go to state 449 + class_name_reference go to state 451 dynamic_class_name_reference go to state 167 static_member go to state 111 variable_class_name go to state 168 @@ -10134,27 +10205,113 @@ state 279 state 280 - 80 unticked_statement: expr ';' . + 315 expr_without_variable: expr "** (T_POW)" . expr - $default reduce using rule 80 (unticked_statement) + "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 + "require (T_REQUIRE)" shift, and go to state 6 + "eval (T_EVAL)" shift, and go to state 7 + "include_once (T_INCLUDE_ONCE)" shift, and go to state 8 + "include (T_INCLUDE)" shift, and go to state 9 + "print (T_PRINT)" shift, and go to state 10 + "yield (T_YIELD)" shift, and go to state 122 + '+' shift, and go to state 12 + '-' shift, and go to state 13 + '!' shift, and go to state 14 + '~' shift, and go to state 15 + '@' shift, and go to state 16 + "(unset) (T_UNSET_CAST)" shift, and go to state 17 + "(bool) (T_BOOL_CAST)" shift, and go to state 18 + "(object) (T_OBJECT_CAST)" shift, and go to state 19 + "(array) (T_ARRAY_CAST)" shift, and go to state 20 + "(string) (T_STRING_CAST)" shift, and go to state 21 + "(double) (T_DOUBLE_CAST)" shift, and go to state 22 + "(int) (T_INT_CAST)" shift, and go to state 23 + "-- (T_DEC)" shift, and go to state 24 + "++ (T_INC)" shift, and go to state 25 + '[' shift, and go to state 26 + "clone (T_CLONE)" shift, and go to state 27 + "new (T_NEW)" shift, and go to state 28 + "exit (T_EXIT)" shift, and go to state 29 + "integer number (T_LNUMBER)" shift, and go to state 31 + "floating-point number (T_DNUMBER)" shift, and go to state 32 + "identifier (T_STRING)" shift, and go to state 123 + "variable name (T_STRING_VARNAME)" shift, and go to state 34 + "variable (T_VARIABLE)" shift, and go to state 35 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 37 + "function (T_FUNCTION)" shift, and go to state 48 + "static (T_STATIC)" shift, and go to state 124 + "isset (T_ISSET)" shift, and go to state 59 + "empty (T_EMPTY)" shift, and go to state 60 + "list (T_LIST)" shift, and go to state 65 + "array (T_ARRAY)" shift, and go to state 66 + "__CLASS__ (T_CLASS_C)" shift, and go to state 67 + "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 + "__METHOD__ (T_METHOD_C)" shift, and go to state 69 + "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 + "__LINE__ (T_LINE)" shift, and go to state 71 + "__FILE__ (T_FILE)" shift, and go to state 72 + "heredoc start (T_START_HEREDOC)" shift, and go to state 73 + "namespace (T_NAMESPACE)" shift, and go to state 125 + "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 + "__DIR__ (T_DIR)" shift, and go to state 76 + "\\ (T_NS_SEPARATOR)" shift, and go to state 77 + '(' shift, and go to state 78 + '$' shift, and go to state 81 + '`' shift, and go to state 82 + '"' shift, and go to state 83 + + namespace_name go to state 84 + new_expr go to state 95 + expr_without_variable go to state 96 + combined_scalar_offset go to state 98 + combined_scalar go to state 99 + function go to state 126 + function_call go to state 101 + class_name go to state 102 + common_scalar go to state 103 + scalar go to state 104 + expr go to state 452 + parenthesis_expr go to state 106 + r_variable go to state 107 + rw_variable go to state 108 + variable go to state 109 + variable_without_objects go to state 110 + static_member go to state 111 + variable_class_name go to state 112 + array_function_dereference go to state 113 + base_variable_with_function_calls go to state 114 + base_variable go to state 115 + reference_variable go to state 116 + compound_variable go to state 117 + simple_indirect_reference go to state 118 + internal_functions_in_yacc go to state 119 + class_constant go to state 120 + class_name_scalar go to state 121 state 281 - 296 expr_without_variable: rw_variable "-- (T_DEC)" . + 80 unticked_statement: expr ';' . - $default reduce using rule 296 (expr_without_variable) + $default reduce using rule 80 (unticked_statement) state 282 - 294 expr_without_variable: rw_variable "++ (T_INC)" . + 297 expr_without_variable: rw_variable "-- (T_DEC)" . - $default reduce using rule 294 (expr_without_variable) + $default reduce using rule 297 (expr_without_variable) state 283 + 295 expr_without_variable: rw_variable "++ (T_INC)" . + + $default reduce using rule 295 (expr_without_variable) + + +state 284 + 278 expr_without_variable: variable '=' . expr 279 | variable '=' . '&' variable 281 | variable '=' . '&' "new (T_NEW)" class_name_reference $@46 ctor_arguments @@ -10166,7 +10323,7 @@ state 283 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 122 - '&' shift, and go to state 450 + '&' shift, and go to state 453 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -10223,7 +10380,7 @@ state 283 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 451 + expr go to state 454 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10242,9 +10399,9 @@ state 283 class_name_scalar go to state 121 -state 284 +state 285 - 293 expr_without_variable: variable ">>= (T_SR_EQUAL)" . expr + 286 expr_without_variable: variable "**= (T_POW_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10309,7 +10466,7 @@ state 284 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 452 + expr go to state 455 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10328,9 +10485,9 @@ state 284 class_name_scalar go to state 121 -state 285 +state 286 - 292 expr_without_variable: variable "<<= (T_SL_EQUAL)" . expr + 294 expr_without_variable: variable ">>= (T_SR_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10395,7 +10552,7 @@ state 285 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 453 + expr go to state 456 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10414,9 +10571,9 @@ state 285 class_name_scalar go to state 121 -state 286 +state 287 - 291 expr_without_variable: variable "^= (T_XOR_EQUAL)" . expr + 293 expr_without_variable: variable "<<= (T_SL_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10481,7 +10638,7 @@ state 286 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 454 + expr go to state 457 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10500,9 +10657,9 @@ state 286 class_name_scalar go to state 121 -state 287 +state 288 - 290 expr_without_variable: variable "|= (T_OR_EQUAL)" . expr + 292 expr_without_variable: variable "^= (T_XOR_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10567,7 +10724,7 @@ state 287 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 455 + expr go to state 458 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10586,9 +10743,9 @@ state 287 class_name_scalar go to state 121 -state 288 +state 289 - 289 expr_without_variable: variable "&= (T_AND_EQUAL)" . expr + 291 expr_without_variable: variable "|= (T_OR_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10653,7 +10810,7 @@ state 288 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 456 + expr go to state 459 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10672,9 +10829,9 @@ state 288 class_name_scalar go to state 121 -state 289 +state 290 - 288 expr_without_variable: variable "%= (T_MOD_EQUAL)" . expr + 290 expr_without_variable: variable "&= (T_AND_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10739,7 +10896,7 @@ state 289 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 457 + expr go to state 460 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10758,9 +10915,9 @@ state 289 class_name_scalar go to state 121 -state 290 +state 291 - 287 expr_without_variable: variable ".= (T_CONCAT_EQUAL)" . expr + 289 expr_without_variable: variable "%= (T_MOD_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10825,7 +10982,7 @@ state 290 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 458 + expr go to state 461 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10844,9 +11001,9 @@ state 290 class_name_scalar go to state 121 -state 291 +state 292 - 286 expr_without_variable: variable "/= (T_DIV_EQUAL)" . expr + 288 expr_without_variable: variable ".= (T_CONCAT_EQUAL)" . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -10911,7 +11068,7 @@ state 291 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 459 + expr go to state 462 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -10930,7 +11087,93 @@ state 291 class_name_scalar go to state 121 -state 292 +state 293 + + 287 expr_without_variable: variable "/= (T_DIV_EQUAL)" . expr + + "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 + "require (T_REQUIRE)" shift, and go to state 6 + "eval (T_EVAL)" shift, and go to state 7 + "include_once (T_INCLUDE_ONCE)" shift, and go to state 8 + "include (T_INCLUDE)" shift, and go to state 9 + "print (T_PRINT)" shift, and go to state 10 + "yield (T_YIELD)" shift, and go to state 122 + '+' shift, and go to state 12 + '-' shift, and go to state 13 + '!' shift, and go to state 14 + '~' shift, and go to state 15 + '@' shift, and go to state 16 + "(unset) (T_UNSET_CAST)" shift, and go to state 17 + "(bool) (T_BOOL_CAST)" shift, and go to state 18 + "(object) (T_OBJECT_CAST)" shift, and go to state 19 + "(array) (T_ARRAY_CAST)" shift, and go to state 20 + "(string) (T_STRING_CAST)" shift, and go to state 21 + "(double) (T_DOUBLE_CAST)" shift, and go to state 22 + "(int) (T_INT_CAST)" shift, and go to state 23 + "-- (T_DEC)" shift, and go to state 24 + "++ (T_INC)" shift, and go to state 25 + '[' shift, and go to state 26 + "clone (T_CLONE)" shift, and go to state 27 + "new (T_NEW)" shift, and go to state 28 + "exit (T_EXIT)" shift, and go to state 29 + "integer number (T_LNUMBER)" shift, and go to state 31 + "floating-point number (T_DNUMBER)" shift, and go to state 32 + "identifier (T_STRING)" shift, and go to state 123 + "variable name (T_STRING_VARNAME)" shift, and go to state 34 + "variable (T_VARIABLE)" shift, and go to state 35 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 37 + "function (T_FUNCTION)" shift, and go to state 48 + "static (T_STATIC)" shift, and go to state 124 + "isset (T_ISSET)" shift, and go to state 59 + "empty (T_EMPTY)" shift, and go to state 60 + "list (T_LIST)" shift, and go to state 65 + "array (T_ARRAY)" shift, and go to state 66 + "__CLASS__ (T_CLASS_C)" shift, and go to state 67 + "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 + "__METHOD__ (T_METHOD_C)" shift, and go to state 69 + "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 + "__LINE__ (T_LINE)" shift, and go to state 71 + "__FILE__ (T_FILE)" shift, and go to state 72 + "heredoc start (T_START_HEREDOC)" shift, and go to state 73 + "namespace (T_NAMESPACE)" shift, and go to state 125 + "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 + "__DIR__ (T_DIR)" shift, and go to state 76 + "\\ (T_NS_SEPARATOR)" shift, and go to state 77 + '(' shift, and go to state 78 + '$' shift, and go to state 81 + '`' shift, and go to state 82 + '"' shift, and go to state 83 + + namespace_name go to state 84 + new_expr go to state 95 + expr_without_variable go to state 96 + combined_scalar_offset go to state 98 + combined_scalar go to state 99 + function go to state 126 + function_call go to state 101 + class_name go to state 102 + common_scalar go to state 103 + scalar go to state 104 + expr go to state 463 + parenthesis_expr go to state 106 + r_variable go to state 107 + rw_variable go to state 108 + variable go to state 109 + variable_without_objects go to state 110 + static_member go to state 111 + variable_class_name go to state 112 + array_function_dereference go to state 113 + base_variable_with_function_calls go to state 114 + base_variable go to state 115 + reference_variable go to state 116 + compound_variable go to state 117 + simple_indirect_reference go to state 118 + internal_functions_in_yacc go to state 119 + class_constant go to state 120 + class_name_scalar go to state 121 + + +state 294 285 expr_without_variable: variable "*= (T_MUL_EQUAL)" . expr @@ -10997,7 +11240,7 @@ state 292 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 460 + expr go to state 464 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11016,7 +11259,7 @@ state 292 class_name_scalar go to state 121 -state 293 +state 295 284 expr_without_variable: variable "-= (T_MINUS_EQUAL)" . expr @@ -11083,7 +11326,7 @@ state 293 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 461 + expr go to state 465 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11102,7 +11345,7 @@ state 293 class_name_scalar go to state 121 -state 294 +state 296 283 expr_without_variable: variable "+= (T_PLUS_EQUAL)" . expr @@ -11169,7 +11412,7 @@ state 294 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 462 + expr go to state 466 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11188,37 +11431,37 @@ state 294 class_name_scalar go to state 121 -state 295 +state 297 - 392 function_call: variable_without_objects $@65 . function_call_parameter_list + 394 function_call: variable_without_objects $@65 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 463 + function_call_parameter_list go to state 467 -state 296 +state 298 - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name $@63 function_call_parameter_list - 390 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@64 function_call_parameter_list - 515 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects - 587 class_constant: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name $@63 function_call_parameter_list + 392 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@64 function_call_parameter_list + 517 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 589 class_constant: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 464 + "identifier (T_STRING)" shift, and go to state 468 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 465 - reference_variable go to state 420 + variable_without_objects go to state 469 + reference_variable go to state 422 compound_variable go to state 117 - variable_name go to state 466 - simple_indirect_reference go to state 422 + variable_name go to state 470 + simple_indirect_reference go to state 424 -state 297 +state 299 - 517 array_function_dereference: array_function_dereference '[' . dim_offset ']' + 519 array_function_dereference: array_function_dereference '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11273,7 +11516,7 @@ state 297 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -11285,7 +11528,7 @@ state 297 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11298,25 +11541,25 @@ state 297 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 467 + dim_offset go to state 471 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 298 +state 300 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" . $@68 object_property $@69 method_or_not variable_properties + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" . $@68 object_property $@69 method_or_not variable_properties - $default reduce using rule 497 ($@68) + $default reduce using rule 499 ($@68) - $@68 go to state 468 + $@68 go to state 472 -state 299 +state 301 - 526 reference_variable: reference_variable '[' . dim_offset ']' + 528 reference_variable: reference_variable '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11371,7 +11614,7 @@ state 299 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -11383,7 +11626,7 @@ state 299 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11396,16 +11639,16 @@ state 299 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 469 + dim_offset go to state 473 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 300 +state 302 - 527 reference_variable: reference_variable '{' . expr '}' + 529 reference_variable: reference_variable '{' . expr '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11470,7 +11713,7 @@ state 300 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 470 + expr go to state 474 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11489,69 +11732,70 @@ state 300 class_name_scalar go to state 121 -state 301 +state 303 - 530 compound_variable: '$' . '{' expr '}' - 542 simple_indirect_reference: simple_indirect_reference '$' . + 532 compound_variable: '$' . '{' expr '}' + 544 simple_indirect_reference: simple_indirect_reference '$' . '{' shift, and go to state 235 - $default reduce using rule 542 (simple_indirect_reference) + $default reduce using rule 544 (simple_indirect_reference) -state 302 +state 304 - 513 variable_without_objects: simple_indirect_reference reference_variable . - 524 base_variable: simple_indirect_reference reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 515 variable_without_objects: simple_indirect_reference reference_variable . + 526 base_variable: simple_indirect_reference reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - '(' reduce using rule 513 (variable_without_objects) - $default reduce using rule 524 (base_variable) + '(' reduce using rule 515 (variable_without_objects) + $default reduce using rule 526 (base_variable) -state 303 +state 305 - 358 expr_without_variable: function is_reference . @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference . @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - $default reduce using rule 357 (@56) + $default reduce using rule 359 (@56) - @56 go to state 414 + @56 go to state 416 -state 304 +state 306 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 578 internal_functions_in_yacc: "eval (T_EVAL)" '(' expr . ')' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 580 internal_functions_in_yacc: "eval (T_EVAL)" '(' expr . ')' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -11579,13 +11823,14 @@ state 304 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ')' shift, and go to state 471 + "** (T_POW)" shift, and go to state 280 + ')' shift, and go to state 475 -state 305 +state 307 - 363 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" . expr_without_variable - 364 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" . variable + 365 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" . expr_without_variable + 366 | "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" . variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11642,7 +11887,7 @@ state 305 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 472 + expr_without_variable go to state 476 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -11654,7 +11899,7 @@ state 305 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 473 + variable go to state 477 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -11669,118 +11914,121 @@ state 305 class_name_scalar go to state 121 -state 306 +state 308 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 350 | '@' $@55 expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 352 | '@' $@55 expr . + + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 350 (expr_without_variable) + $default reduce using rule 352 (expr_without_variable) -state 307 +state 309 - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 474 + namespace_name go to state 478 -state 308 +state 310 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 382 function_call: "\\ (T_NS_SEPARATOR)" namespace_name . @60 function_call_parameter_list - 396 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . + 384 function_call: "\\ (T_NS_SEPARATOR)" namespace_name . @60 function_call_parameter_list + 398 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) - $default reduce using rule 381 (@60) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 398 (class_name) + $default reduce using rule 383 (@60) - @60 go to state 395 + @60 go to state 397 -state 309 +state 311 - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name @61 function_call_parameter_list - 386 | class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@62 function_call_parameter_list - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name @61 function_call_parameter_list + 388 | class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@62 function_call_parameter_list + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 419 - reference_variable go to state 420 + variable_without_objects go to state 421 + reference_variable go to state 422 compound_variable go to state 117 - variable_name go to state 421 - simple_indirect_reference go to state 422 + variable_name go to state 423 + simple_indirect_reference go to state 424 -state 310 +state 312 - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name $@63 function_call_parameter_list - 390 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@64 function_call_parameter_list - 515 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_name $@63 function_call_parameter_list + 392 | variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects $@64 function_call_parameter_list + 517 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 465 - reference_variable go to state 420 + variable_without_objects go to state 469 + reference_variable go to state 422 compound_variable go to state 117 - variable_name go to state 466 - simple_indirect_reference go to state 422 + variable_name go to state 470 + simple_indirect_reference go to state 424 -state 311 +state 313 - 558 non_empty_array_pair_list: '&' w_variable . + 560 non_empty_array_pair_list: '&' w_variable . - $default reduce using rule 558 (non_empty_array_pair_list) + $default reduce using rule 560 (non_empty_array_pair_list) -state 312 +state 314 - 495 w_variable: variable . + 497 w_variable: variable . - $default reduce using rule 495 (w_variable) + $default reduce using rule 497 (w_variable) -state 313 +state 315 - 553 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" . expr - 557 | expr "=> (T_DOUBLE_ARROW)" . '&' w_variable + 555 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" . expr + 559 | expr "=> (T_DOUBLE_ARROW)" . '&' w_variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11789,7 +12037,7 @@ state 313 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 122 - '&' shift, and go to state 476 + '&' shift, and go to state 480 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -11846,7 +12094,7 @@ state 313 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 477 + expr go to state 481 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11865,20 +12113,20 @@ state 313 class_name_scalar go to state 121 -state 314 +state 316 - 369 combined_scalar: '[' array_pair_list ']' . + 371 combined_scalar: '[' array_pair_list ']' . - $default reduce using rule 369 (combined_scalar) + $default reduce using rule 371 (combined_scalar) -state 315 +state 317 - 485 possible_comma: ',' . - 551 non_empty_array_pair_list: non_empty_array_pair_list ',' . expr "=> (T_DOUBLE_ARROW)" expr - 552 | non_empty_array_pair_list ',' . expr - 555 | non_empty_array_pair_list ',' . expr "=> (T_DOUBLE_ARROW)" '&' w_variable - 556 | non_empty_array_pair_list ',' . '&' w_variable + 487 possible_comma: ',' . + 553 non_empty_array_pair_list: non_empty_array_pair_list ',' . expr "=> (T_DOUBLE_ARROW)" expr + 554 | non_empty_array_pair_list ',' . expr + 557 | non_empty_array_pair_list ',' . expr "=> (T_DOUBLE_ARROW)" '&' w_variable + 558 | non_empty_array_pair_list ',' . '&' w_variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -11887,7 +12135,7 @@ state 315 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 122 - '&' shift, and go to state 478 + '&' shift, and go to state 482 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -11934,7 +12182,7 @@ state 315 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 485 (possible_comma) + $default reduce using rule 487 (possible_comma) namespace_name go to state 84 new_expr go to state 95 @@ -11946,7 +12194,7 @@ state 315 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 479 + expr go to state 483 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -11965,108 +12213,108 @@ state 315 class_name_scalar go to state 121 -state 316 +state 318 - 550 array_pair_list: non_empty_array_pair_list possible_comma . + 552 array_pair_list: non_empty_array_pair_list possible_comma . - $default reduce using rule 550 (array_pair_list) + $default reduce using rule 552 (array_pair_list) -state 317 +state 319 - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 480 + namespace_name go to state 484 -state 318 +state 320 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 396 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . + 398 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 396 (class_name) + $default reduce using rule 398 (class_name) -state 319 +state 321 - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects "variable (T_VARIABLE)" shift, and go to state 35 '$' shift, and go to state 81 - variable_without_objects go to state 481 - reference_variable go to state 420 + variable_without_objects go to state 485 + reference_variable go to state 422 compound_variable go to state 117 - simple_indirect_reference go to state 422 + simple_indirect_reference go to state 424 -state 320 +state 322 275 new_expr: "new (T_NEW)" class_name_reference $@44 . ctor_arguments - '(' shift, and go to state 405 + '(' shift, and go to state 407 - $default reduce using rule 415 (ctor_arguments) + $default reduce using rule 417 (ctor_arguments) - function_call_parameter_list go to state 482 - ctor_arguments go to state 483 + function_call_parameter_list go to state 486 + ctor_arguments go to state 487 -state 321 +state 323 - 515 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects + 517 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . variable_without_objects "variable (T_VARIABLE)" shift, and go to state 35 '$' shift, and go to state 81 - variable_without_objects go to state 484 - reference_variable go to state 420 + variable_without_objects go to state 488 + reference_variable go to state 422 compound_variable go to state 117 - simple_indirect_reference go to state 422 + simple_indirect_reference go to state 424 -state 322 +state 324 - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" . $@66 object_property $@67 dynamic_class_name_variable_properties + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" . $@66 object_property $@67 dynamic_class_name_variable_properties - $default reduce using rule 402 ($@66) + $default reduce using rule 404 ($@66) - $@66 go to state 485 + $@66 go to state 489 -state 323 +state 325 - 524 base_variable: simple_indirect_reference reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 526 base_variable: simple_indirect_reference reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - $default reduce using rule 524 (base_variable) + $default reduce using rule 526 (base_variable) -state 324 +state 326 - 410 exit_expr: '(' ')' . + 412 exit_expr: '(' ')' . - $default reduce using rule 410 (exit_expr) + $default reduce using rule 412 (exit_expr) -state 325 +state 327 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' . $@7 inner_statement_list $@8 new_elseif_list new_else_single "endif (T_ENDIF)" ';' $default reduce using rule 53 ($@7) - $@7 go to state 486 + $@7 go to state 490 -state 326 +state 328 52 unticked_statement: "if (T_IF)" parenthesis_expr $@5 . statement $@6 elseif_list else_single @@ -12143,7 +12391,7 @@ state 326 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 487 + statement go to state 491 unticked_statement go to state 88 new_expr go to state 95 expr_without_variable go to state 96 @@ -12174,36 +12422,37 @@ state 326 class_name_scalar go to state 121 -state 327 +state 329 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 532 dim_offset: expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 534 dim_offset: expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -12231,18 +12480,19 @@ state 327 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 532 (dim_offset) + $default reduce using rule 534 (dim_offset) -state 328 +state 330 - 367 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset . ']' + 369 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset . ']' - ']' shift, and go to state 488 + ']' shift, and go to state 492 -state 329 +state 331 256 echo_expr_list: echo_expr_list ',' . expr @@ -12309,7 +12559,7 @@ state 329 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 489 + expr go to state 493 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -12328,76 +12578,77 @@ state 329 class_name_scalar go to state 121 -state 330 +state 332 78 unticked_statement: "echo (T_ECHO)" echo_expr_list ';' . $default reduce using rule 78 (unticked_statement) -state 331 +state 333 61 unticked_statement: "do (T_DO)" $@11 statement . "while (T_WHILE)" $@12 parenthesis_expr ';' - "while (T_WHILE)" shift, and go to state 490 + "while (T_WHILE)" shift, and go to state 494 -state 332 +state 334 58 unticked_statement: "while (T_WHILE)" $@9 parenthesis_expr . @10 while_statement $default reduce using rule 57 (@10) - @10 go to state 491 + @10 go to state 495 -state 333 +state 335 65 unticked_statement: "for (T_FOR)" '(' for_expr . ';' $@13 for_expr ';' $@14 for_expr ')' $@15 for_statement - ';' shift, and go to state 492 + ';' shift, and go to state 496 -state 334 +state 336 259 for_expr: non_empty_for_expr . 261 non_empty_for_expr: non_empty_for_expr . ',' $@41 expr - ',' shift, and go to state 493 + ',' shift, and go to state 497 $default reduce using rule 259 (for_expr) -state 335 +state 337 262 non_empty_for_expr: expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -12425,21 +12676,22 @@ state 335 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 262 (non_empty_for_expr) -state 336 +state 338 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable . "as (T_AS)" $@19 foreach_variable foreach_optional_arg ')' $@20 foreach_statement - 491 expr: expr_without_variable . + 493 expr: expr_without_variable . - "as (T_AS)" shift, and go to state 494 + "as (T_AS)" shift, and go to state 498 - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) -state 337 +state 339 84 unticked_statement: "foreach (T_FOREACH)" '(' variable . "as (T_AS)" $@17 foreach_variable foreach_optional_arg ')' $@18 foreach_statement 278 expr_without_variable: variable . '=' expr @@ -12448,240 +12700,242 @@ state 337 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - "as (T_AS)" shift, and go to state 495 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + "as (T_AS)" shift, and go to state 499 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + $default reduce using rule 496 (r_variable) -state 338 +state 340 89 unticked_statement: "declare (T_DECLARE)" $@21 '(' . declare_list ')' declare_statement - "identifier (T_STRING)" shift, and go to state 496 + "identifier (T_STRING)" shift, and go to state 500 - declare_list go to state 497 + declare_list go to state 501 -state 339 +state 341 67 unticked_statement: "switch (T_SWITCH)" parenthesis_expr $@16 . switch_case_list - ':' shift, and go to state 498 - '{' shift, and go to state 499 + ':' shift, and go to state 502 + '{' shift, and go to state 503 - switch_case_list go to state 500 + switch_case_list go to state 504 -state 340 +state 342 69 unticked_statement: "break (T_BREAK)" expr ';' . $default reduce using rule 69 (unticked_statement) -state 341 +state 343 71 unticked_statement: "continue (T_CONTINUE)" expr ';' . $default reduce using rule 71 (unticked_statement) -state 342 +state 344 95 unticked_statement: "goto (T_GOTO)" "identifier (T_STRING)" ';' . $default reduce using rule 95 (unticked_statement) -state 343 +state 345 39 constant_declaration: "const (T_CONST)" "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 517 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 521 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 344 +state 346 73 unticked_statement: "return (T_RETURN)" expr_without_variable ';' . $default reduce using rule 73 (unticked_statement) -state 345 +state 347 74 unticked_statement: "return (T_RETURN)" variable ';' . $default reduce using rule 74 (unticked_statement) -state 346 +state 348 93 unticked_statement: "try (T_TRY)" $@22 '{' . inner_statement_list '}' catch_statement $@23 finally_statement $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 521 + inner_statement_list go to state 525 -state 347 +state 349 94 unticked_statement: "throw (T_THROW)" expr ';' . $default reduce using rule 94 (unticked_statement) -state 348 +state 350 30 use_function_declaration: "\\ (T_NS_SEPARATOR)" . namespace_name 31 | "\\ (T_NS_SEPARATOR)" . namespace_name "as (T_AS)" "identifier (T_STRING)" "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 522 + namespace_name go to state 526 -state 349 +state 351 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" 28 use_function_declaration: namespace_name . 29 | namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 523 + "as (T_AS)" shift, and go to state 527 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 28 (use_function_declaration) -state 350 +state 352 17 top_statement: "use (T_USE)" "function (T_FUNCTION)" use_function_declarations . ';' 26 use_function_declarations: use_function_declarations . ',' use_function_declaration - ',' shift, and go to state 524 - ';' shift, and go to state 525 + ',' shift, and go to state 528 + ';' shift, and go to state 529 -state 351 +state 353 27 use_function_declarations: use_function_declaration . $default reduce using rule 27 (use_function_declarations) -state 352 +state 354 36 use_const_declaration: "\\ (T_NS_SEPARATOR)" . namespace_name 37 | "\\ (T_NS_SEPARATOR)" . namespace_name "as (T_AS)" "identifier (T_STRING)" "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 526 + namespace_name go to state 530 -state 353 +state 355 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" 34 use_const_declaration: namespace_name . 35 | namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 527 + "as (T_AS)" shift, and go to state 531 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 34 (use_const_declaration) -state 354 +state 356 18 top_statement: "use (T_USE)" "const (T_CONST)" use_const_declarations . ';' 32 use_const_declarations: use_const_declarations . ',' use_const_declaration - ',' shift, and go to state 528 - ';' shift, and go to state 529 + ',' shift, and go to state 532 + ';' shift, and go to state 533 -state 355 +state 357 33 use_const_declarations: use_const_declaration . $default reduce using rule 33 (use_const_declarations) -state 356 +state 358 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" 24 use_declaration: "\\ (T_NS_SEPARATOR)" namespace_name . 25 | "\\ (T_NS_SEPARATOR)" namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 530 + "as (T_AS)" shift, and go to state 534 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 24 (use_declaration) -state 357 +state 359 23 use_declaration: namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 531 + "identifier (T_STRING)" shift, and go to state 535 -state 358 +state 360 20 use_declarations: use_declarations ',' . use_declaration @@ -12689,17 +12943,17 @@ state 358 "\\ (T_NS_SEPARATOR)" shift, and go to state 201 namespace_name go to state 202 - use_declaration go to state 532 + use_declaration go to state 536 -state 359 +state 361 16 top_statement: "use (T_USE)" use_declarations ';' . $default reduce using rule 16 (top_statement) -state 360 +state 362 202 global_var: '$' '{' . expr '}' @@ -12766,7 +13020,7 @@ state 360 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 533 + expr go to state 537 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -12785,133 +13039,133 @@ state 360 class_name_scalar go to state 121 -state 361 +state 363 201 global_var: '$' r_variable . $default reduce using rule 201 (global_var) -state 362 +state 364 - 494 r_variable: variable . + 496 r_variable: variable . - $default reduce using rule 494 (r_variable) + $default reduce using rule 496 (r_variable) -state 363 +state 365 198 global_var_list: global_var_list ',' . global_var "variable (T_VARIABLE)" shift, and go to state 205 '$' shift, and go to state 206 - global_var go to state 534 + global_var go to state 538 -state 364 +state 366 76 unticked_statement: "global (T_GLOBAL)" global_var_list ';' . $default reduce using rule 76 (unticked_statement) -state 365 +state 367 206 static_var_list: "variable (T_VARIABLE)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 535 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 539 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 366 +state 368 203 static_var_list: static_var_list ',' . "variable (T_VARIABLE)" 204 | static_var_list ',' . "variable (T_VARIABLE)" '=' static_scalar - "variable (T_VARIABLE)" shift, and go to state 536 + "variable (T_VARIABLE)" shift, and go to state 540 -state 367 +state 369 77 unticked_statement: "static (T_STATIC)" static_var_list ';' . $default reduce using rule 77 (unticked_statement) -state 368 +state 370 - 360 expr_without_variable: "static (T_STATIC)" function is_reference . @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference . @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - $default reduce using rule 359 (@57) + $default reduce using rule 361 (@57) - @57 go to state 537 + @57 go to state 541 -state 369 +state 371 81 unticked_statement: "unset (T_UNSET)" '(' unset_variables . ')' ';' 113 unset_variables: unset_variables . ',' unset_variable - ',' shift, and go to state 538 - ')' shift, and go to state 539 + ',' shift, and go to state 542 + ')' shift, and go to state 543 -state 370 +state 372 112 unset_variables: unset_variable . $default reduce using rule 112 (unset_variables) -state 371 +state 373 114 unset_variable: variable . $default reduce using rule 114 (unset_variable) -state 372 +state 374 - 491 expr: expr_without_variable . - 585 isset_variable: expr_without_variable . + 493 expr: expr_without_variable . + 587 isset_variable: expr_without_variable . - ',' reduce using rule 585 (isset_variable) - ')' reduce using rule 585 (isset_variable) - $default reduce using rule 491 (expr) + ',' reduce using rule 587 (isset_variable) + ')' reduce using rule 587 (isset_variable) + $default reduce using rule 493 (expr) -state 373 +state 375 278 expr_without_variable: variable . '=' expr 279 | variable . '=' '&' variable @@ -12919,65 +13173,67 @@ state 373 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - 584 isset_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - - ',' reduce using rule 584 (isset_variable) - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - ')' reduce using rule 584 (isset_variable) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + 586 isset_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + + ',' reduce using rule 586 (isset_variable) + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + ')' reduce using rule 586 (isset_variable) + $default reduce using rule 496 (r_variable) -state 374 +state 376 - 573 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables . ')' - 583 isset_variables: isset_variables . ',' $@76 isset_variable + 575 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables . ')' + 585 isset_variables: isset_variables . ',' $@76 isset_variable - ',' shift, and go to state 540 - ')' shift, and go to state 541 + ',' shift, and go to state 544 + ')' shift, and go to state 545 -state 375 +state 377 - 581 isset_variables: isset_variable . + 583 isset_variables: isset_variable . - $default reduce using rule 581 (isset_variables) + $default reduce using rule 583 (isset_variables) -state 376 +state 378 - 491 expr: expr_without_variable . - 575 internal_functions_in_yacc: "empty (T_EMPTY)" '(' expr_without_variable . ')' + 493 expr: expr_without_variable . + 577 internal_functions_in_yacc: "empty (T_EMPTY)" '(' expr_without_variable . ')' - ')' shift, and go to state 542 + ')' shift, and go to state 546 - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) -state 377 +state 379 278 expr_without_variable: variable . '=' expr 279 | variable . '=' '&' variable @@ -12985,62 +13241,64 @@ state 377 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - 574 internal_functions_in_yacc: "empty (T_EMPTY)" '(' variable . ')' - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - ')' shift, and go to state 543 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + 576 internal_functions_in_yacc: "empty (T_EMPTY)" '(' variable . ')' + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + ')' shift, and go to state 547 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + $default reduce using rule 496 (r_variable) -state 378 +state 380 10 top_statement: "__halt_compiler (T_HALT_COMPILER)" '(' ')' . ';' - ';' shift, and go to state 544 + ';' shift, and go to state 548 -state 379 +state 381 277 expr_without_variable: "list (T_LIST)" '(' $@45 . assignment_list ')' '=' expr "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 545 + "list (T_LIST)" shift, and go to state 549 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 - $default reduce using rule 548 (assignment_list_element) + $default reduce using rule 550 (assignment_list_element) namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 546 + variable go to state 550 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -13050,87 +13308,88 @@ state 379 reference_variable go to state 116 compound_variable go to state 117 simple_indirect_reference go to state 118 - assignment_list go to state 547 - assignment_list_element go to state 548 + assignment_list go to state 551 + assignment_list_element go to state 552 -state 380 +state 382 - 368 combined_scalar: "array (T_ARRAY)" '(' array_pair_list . ')' + 370 combined_scalar: "array (T_ARRAY)" '(' array_pair_list . ')' - ')' shift, and go to state 549 + ')' shift, and go to state 553 -state 381 +state 383 - 565 encaps_var: "variable (T_VARIABLE)" '[' . $@75 encaps_var_offset ']' + 567 encaps_var: "variable (T_VARIABLE)" '[' . $@75 encaps_var_offset ']' - $default reduce using rule 564 ($@75) + $default reduce using rule 566 ($@75) - $@75 go to state 550 + $@75 go to state 554 -state 382 +state 384 - 566 encaps_var: "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" . "identifier (T_STRING)" + 568 encaps_var: "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 551 + "identifier (T_STRING)" shift, and go to state 555 -state 383 +state 385 - 427 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" . + 429 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" . - $default reduce using rule 427 (common_scalar) + $default reduce using rule 429 (common_scalar) -state 384 +state 386 - 562 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" encaps_var . + 564 encaps_list: "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" encaps_var . - $default reduce using rule 562 (encaps_list) + $default reduce using rule 564 (encaps_list) -state 385 +state 387 - 472 scalar: "variable name (T_STRING_VARNAME)" . - 568 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" . '[' expr ']' '}' + 474 scalar: "variable name (T_STRING_VARNAME)" . + 570 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" . '[' expr ']' '}' - '[' shift, and go to state 552 + '[' shift, and go to state 556 - $default reduce using rule 472 (scalar) + $default reduce using rule 474 (scalar) -state 386 +state 388 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 567 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr . '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 569 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr . '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -13158,118 +13417,119 @@ state 386 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 553 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 557 -state 387 +state 389 - 569 encaps_var: "{$ (T_CURLY_OPEN)" variable . '}' + 571 encaps_var: "{$ (T_CURLY_OPEN)" variable . '}' - '}' shift, and go to state 554 + '}' shift, and go to state 558 -state 388 +state 390 - 560 encaps_list: encaps_list "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . + 562 encaps_list: encaps_list "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . - $default reduce using rule 560 (encaps_list) + $default reduce using rule 562 (encaps_list) -state 389 +state 391 - 480 scalar: "heredoc start (T_START_HEREDOC)" encaps_list "heredoc end (T_END_HEREDOC)" . + 482 scalar: "heredoc start (T_START_HEREDOC)" encaps_list "heredoc end (T_END_HEREDOC)" . - $default reduce using rule 480 (scalar) + $default reduce using rule 482 (scalar) -state 390 +state 392 - 559 encaps_list: encaps_list encaps_var . + 561 encaps_list: encaps_list encaps_var . - $default reduce using rule 559 (encaps_list) + $default reduce using rule 561 (encaps_list) -state 391 +state 393 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . - 476 scalar: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 478 scalar: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 395 (class_name) - '(' reduce using rule 379 (@59) - $default reduce using rule 476 (scalar) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 397 (class_name) + '(' reduce using rule 381 (@59) + $default reduce using rule 478 (scalar) - @59 go to state 555 + @59 go to state 559 -state 392 +state 394 15 top_statement: "namespace (T_NAMESPACE)" '{' $@3 . top_statement_list '}' $default reduce using rule 4 (top_statement_list) - top_statement_list go to state 556 + top_statement_list go to state 560 -state 393 +state 395 11 top_statement: "namespace (T_NAMESPACE)" namespace_name ';' . $default reduce using rule 11 (top_statement) -state 394 +state 396 13 top_statement: "namespace (T_NAMESPACE)" namespace_name '{' . $@2 top_statement_list '}' $default reduce using rule 12 ($@2) - $@2 go to state 557 + $@2 go to state 561 -state 395 +state 397 - 382 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 . function_call_parameter_list + 384 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 558 + function_call_parameter_list go to state 562 -state 396 +state 398 - 334 expr_without_variable: '(' new_expr ')' . @51 instance_call + 336 expr_without_variable: '(' new_expr ')' . @51 instance_call - $default reduce using rule 333 (@51) + $default reduce using rule 335 (@51) - @51 go to state 559 + @51 go to state 563 -state 397 +state 399 - 493 parenthesis_expr: '(' yield_expr ')' . + 495 parenthesis_expr: '(' yield_expr ')' . - $default reduce using rule 493 (parenthesis_expr) + $default reduce using rule 495 (parenthesis_expr) -state 398 +state 400 - 492 parenthesis_expr: '(' expr ')' . + 494 parenthesis_expr: '(' expr ')' . - $default reduce using rule 492 (parenthesis_expr) + $default reduce using rule 494 (parenthesis_expr) -state 399 +state 401 49 unticked_statement: '{' inner_statement_list '}' . $default reduce using rule 49 (unticked_statement) -state 400 +state 402 41 inner_statement_list: inner_statement_list $@4 . inner_statement @@ -13327,7 +13587,7 @@ state 400 "unset (T_UNSET)" shift, and go to state 58 "isset (T_ISSET)" shift, and go to state 59 "empty (T_EMPTY)" shift, and go to state 60 - "__halt_compiler (T_HALT_COMPILER)" shift, and go to state 560 + "__halt_compiler (T_HALT_COMPILER)" shift, and go to state 564 "class (T_CLASS)" shift, and go to state 62 "trait (T_TRAIT)" shift, and go to state 63 "interface (T_INTERFACE)" shift, and go to state 64 @@ -13352,11 +13612,11 @@ state 400 '"' shift, and go to state 83 namespace_name go to state 84 - inner_statement go to state 561 - statement go to state 562 + inner_statement go to state 565 + statement go to state 566 unticked_statement go to state 88 - function_declaration_statement go to state 563 - class_declaration_statement go to state 564 + function_declaration_statement go to state 567 + class_declaration_statement go to state 568 unticked_function_declaration_statement go to state 91 unticked_class_declaration_statement go to state 92 class_entry_type go to state 93 @@ -13390,36 +13650,37 @@ state 400 class_name_scalar go to state 121 -state 401 +state 403 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 530 compound_variable: '$' '{' expr . '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 532 compound_variable: '$' '{' expr . '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -13447,31 +13708,32 @@ state 401 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 565 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 569 -state 402 +state 404 - 354 expr_without_variable: '`' backticks_expr '`' . + 356 expr_without_variable: '`' backticks_expr '`' . - $default reduce using rule 354 (expr_without_variable) + $default reduce using rule 356 (expr_without_variable) -state 403 +state 405 - 479 scalar: '"' encaps_list '"' . + 481 scalar: '"' encaps_list '"' . - $default reduce using rule 479 (scalar) + $default reduce using rule 481 (scalar) -state 404 +state 406 6 namespace_name: namespace_name "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" . $default reduce using rule 6 (namespace_name) -state 405 +state 407 187 function_call_parameter_list: '(' . ')' 188 | '(' . non_empty_function_call_parameter_list ')' @@ -13484,7 +13746,7 @@ state 405 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - '&' shift, and go to state 566 + '&' shift, and go to state 570 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -13526,18 +13788,18 @@ state 405 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 "\\ (T_NS_SEPARATOR)" shift, and go to state 77 - "... (T_ELLIPSIS)" shift, and go to state 567 + "... (T_ELLIPSIS)" shift, and go to state 571 '(' shift, and go to state 78 - ')' shift, and go to state 568 + ')' shift, and go to state 572 '$' shift, and go to state 81 '`' shift, and go to state 82 '"' shift, and go to state 83 namespace_name go to state 84 - non_empty_function_call_parameter_list go to state 569 + non_empty_function_call_parameter_list go to state 573 new_expr go to state 95 - expr_without_variable go to state 570 - yield_expr go to state 571 + expr_without_variable go to state 574 + yield_expr go to state 575 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -13549,7 +13811,7 @@ state 405 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 572 + variable go to state 576 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -13564,85 +13826,85 @@ state 405 class_name_scalar go to state 121 -state 406 +state 408 - 378 function_call: namespace_name @58 function_call_parameter_list . + 380 function_call: namespace_name @58 function_call_parameter_list . - $default reduce using rule 378 (function_call) + $default reduce using rule 380 (function_call) -state 407 +state 409 38 constant_declaration: constant_declaration ',' "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 573 + '=' shift, and go to state 577 -state 408 +state 410 132 extends_from: "extends (T_EXTENDS)" . fully_qualified_class_name "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 577 + namespace_name go to state 580 + fully_qualified_class_name go to state 581 -state 409 +state 411 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from . $@32 implements_list '{' class_statement_list '}' $default reduce using rule 123 ($@32) - $@32 go to state 578 + $@32 go to state 582 -state 410 +state 412 126 unticked_class_declaration_statement: interface_entry "identifier (T_STRING)" $@33 . interface_extends_list '{' class_statement_list '}' - "extends (T_EXTENDS)" shift, and go to state 579 + "extends (T_EXTENDS)" shift, and go to state 583 $default reduce using rule 134 (interface_extends_list) - interface_extends_list go to state 580 + interface_extends_list go to state 584 -state 411 +state 413 - 366 combined_scalar_offset: combined_scalar_offset '[' dim_offset . ']' + 368 combined_scalar_offset: combined_scalar_offset '[' dim_offset . ']' - ']' shift, and go to state 581 + ']' shift, and go to state 585 -state 412 +state 414 - 365 combined_scalar_offset: combined_scalar '[' dim_offset . ']' + 367 combined_scalar_offset: combined_scalar '[' dim_offset . ']' - ']' shift, and go to state 582 + ']' shift, and go to state 586 -state 413 +state 415 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" . $@31 '(' parameter_list ')' '{' inner_statement_list '}' $default reduce using rule 121 ($@31) - $@31 go to state 583 + $@31 go to state 587 -state 414 +state 416 - 358 expr_without_variable: function is_reference @56 . '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 . '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - '(' shift, and go to state 584 + '(' shift, and go to state 588 -state 415 +state 417 - 519 array_function_dereference: function_call $@72 '[' . dim_offset ']' + 521 array_function_dereference: function_call $@72 '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -13697,7 +13959,7 @@ state 415 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -13709,7 +13971,7 @@ state 415 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -13722,32 +13984,32 @@ state 415 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 585 + dim_offset go to state 589 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 416 +state 418 - 539 variable_name: "identifier (T_STRING)" . - 586 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . + 541 variable_name: "identifier (T_STRING)" . + 588 class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . - '(' reduce using rule 539 (variable_name) - $default reduce using rule 586 (class_constant) + '(' reduce using rule 541 (variable_name) + $default reduce using rule 588 (class_constant) -state 417 +state 419 - 589 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" . + 591 class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" . - $default reduce using rule 589 (class_name_scalar) + $default reduce using rule 591 (class_name_scalar) -state 418 +state 420 - 540 variable_name: '{' . expr '}' + 542 variable_name: '{' . expr '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -13812,7 +14074,7 @@ state 418 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 586 + expr go to state 590 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -13831,53 +14093,53 @@ state 418 class_name_scalar go to state 121 -state 419 +state 421 - 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . $@62 function_call_parameter_list - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . + 388 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . $@62 function_call_parameter_list + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . - '(' reduce using rule 385 ($@62) - $default reduce using rule 514 (static_member) + '(' reduce using rule 387 ($@62) + $default reduce using rule 516 (static_member) - $@62 go to state 587 + $@62 go to state 591 -state 420 +state 422 - 512 variable_without_objects: reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 514 variable_without_objects: reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - $default reduce using rule 512 (variable_without_objects) + $default reduce using rule 514 (variable_without_objects) -state 421 +state 423 - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name . @61 function_call_parameter_list + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name . @61 function_call_parameter_list - $default reduce using rule 383 (@61) + $default reduce using rule 385 (@61) - @61 go to state 588 + @61 go to state 592 -state 422 +state 424 - 513 variable_without_objects: simple_indirect_reference . reference_variable - 542 simple_indirect_reference: simple_indirect_reference . '$' + 515 variable_without_objects: simple_indirect_reference . reference_variable + 544 simple_indirect_reference: simple_indirect_reference . '$' "variable (T_VARIABLE)" shift, and go to state 35 - '$' shift, and go to state 301 + '$' shift, and go to state 303 - reference_variable go to state 589 + reference_variable go to state 593 compound_variable go to state 117 -state 423 +state 425 - 303 expr_without_variable: expr "or (T_LOGICAL_OR)" $@49 . expr + 304 expr_without_variable: expr "or (T_LOGICAL_OR)" $@49 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -13942,7 +14204,7 @@ state 423 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 590 + expr go to state 594 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -13961,36 +14223,37 @@ state 423 class_name_scalar go to state 121 -state 424 +state 426 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 306 | expr "xor (T_LOGICAL_XOR)" expr . - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 307 | expr "xor (T_LOGICAL_XOR)" expr . + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "and (T_LOGICAL_AND)" shift, and go to state 256 '?' shift, and go to state 257 @@ -14016,13 +14279,14 @@ state 424 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 306 (expr_without_variable) + $default reduce using rule 307 (expr_without_variable) -state 425 +state 427 - 305 expr_without_variable: expr "and (T_LOGICAL_AND)" $@50 . expr + 306 expr_without_variable: expr "and (T_LOGICAL_AND)" $@50 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -14087,7 +14351,7 @@ state 425 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 591 + expr go to state 595 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -14106,18 +14370,18 @@ state 425 class_name_scalar go to state 121 -state 426 +state 428 - 339 expr_without_variable: expr '?' ':' . $@54 expr + 341 expr_without_variable: expr '?' ':' . $@54 expr - $default reduce using rule 338 ($@54) + $default reduce using rule 340 ($@54) - $@54 go to state 592 + $@54 go to state 596 -state 427 +state 429 - 337 expr_without_variable: expr '?' $@52 . expr ':' $@53 expr + 339 expr_without_variable: expr '?' $@52 . expr ':' $@53 expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -14182,7 +14446,7 @@ state 427 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 593 + expr go to state 597 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -14201,9 +14465,9 @@ state 427 class_name_scalar go to state 121 -state 428 +state 430 - 299 expr_without_variable: expr "|| (T_BOOLEAN_OR)" $@47 . expr + 300 expr_without_variable: expr "|| (T_BOOLEAN_OR)" $@47 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -14268,7 +14532,7 @@ state 428 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 594 + expr go to state 598 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -14287,9 +14551,9 @@ state 428 class_name_scalar go to state 121 -state 429 +state 431 - 301 expr_without_variable: expr "&& (T_BOOLEAN_AND)" $@48 . expr + 302 expr_without_variable: expr "&& (T_BOOLEAN_AND)" $@48 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -14354,7 +14618,7 @@ state 429 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 595 + expr go to state 599 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -14373,36 +14637,37 @@ state 429 class_name_scalar go to state 121 -state 430 +state 432 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 307 | expr '|' expr . - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 308 | expr '|' expr . + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '^' shift, and go to state 261 '&' shift, and go to state 262 @@ -14423,40 +14688,42 @@ state 430 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 307 (expr_without_variable) + $default reduce using rule 308 (expr_without_variable) -state 431 +state 433 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 309 | expr '^' expr . - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 310 | expr '^' expr . + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '&' shift, and go to state 262 "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 263 @@ -14476,40 +14743,42 @@ state 431 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 309 (expr_without_variable) + $default reduce using rule 310 (expr_without_variable) -state 432 +state 434 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 308 | expr '&' expr . - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 309 | expr '&' expr . + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 263 "=== (T_IS_IDENTICAL)" shift, and go to state 264 @@ -14528,40 +14797,42 @@ state 432 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 308 (expr_without_variable) + $default reduce using rule 309 (expr_without_variable) -state 433 +state 435 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 323 | expr "!== (T_IS_NOT_IDENTICAL)" expr . - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 325 | expr "!== (T_IS_NOT_IDENTICAL)" expr . + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '<' shift, and go to state 267 '>' shift, and go to state 268 @@ -14576,45 +14847,47 @@ state 433 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 323 (expr_without_variable) + $default reduce using rule 325 (expr_without_variable) -state 434 +state 436 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 322 | expr "=== (T_IS_IDENTICAL)" expr . - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 324 | expr "=== (T_IS_IDENTICAL)" expr . + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '<' shift, and go to state 267 '>' shift, and go to state 268 @@ -14629,45 +14902,47 @@ state 434 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 322 (expr_without_variable) + $default reduce using rule 324 (expr_without_variable) -state 435 +state 437 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 325 | expr "!= (T_IS_NOT_EQUAL)" expr . - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 327 | expr "!= (T_IS_NOT_EQUAL)" expr . + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '<' shift, and go to state 267 '>' shift, and go to state 268 @@ -14682,45 +14957,47 @@ state 435 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 325 (expr_without_variable) + $default reduce using rule 327 (expr_without_variable) -state 436 +state 438 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 324 | expr "== (T_IS_EQUAL)" expr . - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 326 | expr "== (T_IS_EQUAL)" expr . + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '<' shift, and go to state 267 '>' shift, and go to state 268 @@ -14735,45 +15012,47 @@ state 436 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 324 (expr_without_variable) + $default reduce using rule 326 (expr_without_variable) -state 437 +state 439 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 326 | expr '<' expr . - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 328 | expr '<' expr . + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr ">> (T_SR)" shift, and go to state 271 "<< (T_SL)" shift, and go to state 272 @@ -14784,45 +15063,47 @@ state 437 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 326 (expr_without_variable) + $default reduce using rule 328 (expr_without_variable) -state 438 +state 440 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 328 | expr '>' expr . - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 330 | expr '>' expr . + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr ">> (T_SR)" shift, and go to state 271 "<< (T_SL)" shift, and go to state 272 @@ -14833,45 +15114,47 @@ state 438 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 328 (expr_without_variable) + $default reduce using rule 330 (expr_without_variable) -state 439 +state 441 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 329 | expr ">= (T_IS_GREATER_OR_EQUAL)" expr . - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 331 | expr ">= (T_IS_GREATER_OR_EQUAL)" expr . + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr ">> (T_SR)" shift, and go to state 271 "<< (T_SL)" shift, and go to state 272 @@ -14882,45 +15165,47 @@ state 439 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 329 (expr_without_variable) + $default reduce using rule 331 (expr_without_variable) -state 440 +state 442 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 327 | expr "<= (T_IS_SMALLER_OR_EQUAL)" expr . - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 329 | expr "<= (T_IS_SMALLER_OR_EQUAL)" expr . + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr ">> (T_SR)" shift, and go to state 271 "<< (T_SL)" shift, and go to state 272 @@ -14931,45 +15216,47 @@ state 440 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 327 (expr_without_variable) + $default reduce using rule 329 (expr_without_variable) -state 441 +state 443 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 317 | expr ">> (T_SR)" expr . - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 319 | expr ">> (T_SR)" expr . + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '+' shift, and go to state 273 '-' shift, and go to state 274 @@ -14978,40 +15265,42 @@ state 441 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 317 (expr_without_variable) + $default reduce using rule 319 (expr_without_variable) -state 442 +state 444 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 316 | expr "<< (T_SL)" expr . - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 318 | expr "<< (T_SL)" expr . + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '+' shift, and go to state 273 '-' shift, and go to state 274 @@ -15020,248 +15309,298 @@ state 442 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 316 (expr_without_variable) + $default reduce using rule 318 (expr_without_variable) -state 443 +state 445 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 311 | expr '+' expr . - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 312 | expr '+' expr . + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '*' shift, and go to state 276 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 311 (expr_without_variable) + $default reduce using rule 312 (expr_without_variable) -state 444 +state 446 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 312 | expr '-' expr . - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 313 | expr '-' expr . + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '*' shift, and go to state 276 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 312 (expr_without_variable) + $default reduce using rule 313 (expr_without_variable) -state 445 +state 447 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 310 | expr '.' expr . - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 311 | expr '.' expr . + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '*' shift, and go to state 276 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 310 (expr_without_variable) + $default reduce using rule 311 (expr_without_variable) -state 446 +state 448 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 313 | expr '*' expr . - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 314 | expr '*' expr . + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 313 (expr_without_variable) + $default reduce using rule 314 (expr_without_variable) -state 447 +state 449 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 314 | expr '/' expr . - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 316 | expr '/' expr . + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 314 (expr_without_variable) + $default reduce using rule 316 (expr_without_variable) -state 448 +state 450 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 315 | expr '%' expr . - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 317 | expr '%' expr . + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 315 (expr_without_variable) + $default reduce using rule 317 (expr_without_variable) -state 449 +state 451 - 330 expr_without_variable: expr "instanceof (T_INSTANCEOF)" class_name_reference . + 332 expr_without_variable: expr "instanceof (T_INSTANCEOF)" class_name_reference . - $default reduce using rule 330 (expr_without_variable) + $default reduce using rule 332 (expr_without_variable) -state 450 +state 452 + + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 315 | expr "** (T_POW)" expr . + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + + "** (T_POW)" shift, and go to state 280 + + $default reduce using rule 315 (expr_without_variable) + + +state 453 279 expr_without_variable: variable '=' '&' . variable 281 | variable '=' '&' . "new (T_NEW)" class_name_reference $@46 ctor_arguments - "new (T_NEW)" shift, and go to state 596 + "new (T_NEW)" shift, and go to state 600 "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 @@ -15272,7 +15611,7 @@ state 450 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 597 + variable go to state 601 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -15284,36 +15623,37 @@ state 450 simple_indirect_reference go to state 118 -state 451 +state 454 278 expr_without_variable: variable '=' expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15338,40 +15678,42 @@ state 451 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 278 (expr_without_variable) -state 452 +state 455 - 293 expr_without_variable: variable ">>= (T_SR_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 286 expr_without_variable: variable "**= (T_POW_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15396,40 +15738,42 @@ state 452 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 293 (expr_without_variable) + $default reduce using rule 286 (expr_without_variable) -state 453 +state 456 - 292 expr_without_variable: variable "<<= (T_SL_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 294 expr_without_variable: variable ">>= (T_SR_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15454,40 +15798,42 @@ state 453 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 292 (expr_without_variable) + $default reduce using rule 294 (expr_without_variable) -state 454 +state 457 - 291 expr_without_variable: variable "^= (T_XOR_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 293 expr_without_variable: variable "<<= (T_SL_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15512,40 +15858,42 @@ state 454 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 291 (expr_without_variable) + $default reduce using rule 293 (expr_without_variable) -state 455 +state 458 - 290 expr_without_variable: variable "|= (T_OR_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 292 expr_without_variable: variable "^= (T_XOR_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15570,40 +15918,42 @@ state 455 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 290 (expr_without_variable) + $default reduce using rule 292 (expr_without_variable) -state 456 +state 459 - 289 expr_without_variable: variable "&= (T_AND_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 291 expr_without_variable: variable "|= (T_OR_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15628,40 +15978,42 @@ state 456 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 289 (expr_without_variable) + $default reduce using rule 291 (expr_without_variable) -state 457 +state 460 - 288 expr_without_variable: variable "%= (T_MOD_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 290 expr_without_variable: variable "&= (T_AND_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15686,40 +16038,42 @@ state 457 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 288 (expr_without_variable) + $default reduce using rule 290 (expr_without_variable) -state 458 +state 461 - 287 expr_without_variable: variable ".= (T_CONCAT_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 289 expr_without_variable: variable "%= (T_MOD_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15744,40 +16098,42 @@ state 458 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 287 (expr_without_variable) + $default reduce using rule 289 (expr_without_variable) -state 459 +state 462 - 286 expr_without_variable: variable "/= (T_DIV_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 288 expr_without_variable: variable ".= (T_CONCAT_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15802,40 +16158,102 @@ state 459 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 286 (expr_without_variable) + $default reduce using rule 288 (expr_without_variable) -state 460 +state 463 + + 287 expr_without_variable: variable "/= (T_DIV_EQUAL)" expr . + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + + '?' shift, and go to state 257 + "|| (T_BOOLEAN_OR)" shift, and go to state 258 + "&& (T_BOOLEAN_AND)" shift, and go to state 259 + '|' shift, and go to state 260 + '^' shift, and go to state 261 + '&' shift, and go to state 262 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 263 + "=== (T_IS_IDENTICAL)" shift, and go to state 264 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 265 + "== (T_IS_EQUAL)" shift, and go to state 266 + '<' shift, and go to state 267 + '>' shift, and go to state 268 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 269 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 270 + ">> (T_SR)" shift, and go to state 271 + "<< (T_SL)" shift, and go to state 272 + '+' shift, and go to state 273 + '-' shift, and go to state 274 + '.' shift, and go to state 275 + '*' shift, and go to state 276 + '/' shift, and go to state 277 + '%' shift, and go to state 278 + "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 + + $default reduce using rule 287 (expr_without_variable) + + +state 464 285 expr_without_variable: variable "*= (T_MUL_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15860,40 +16278,42 @@ state 460 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 285 (expr_without_variable) -state 461 +state 465 284 expr_without_variable: variable "-= (T_MINUS_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15918,40 +16338,42 @@ state 461 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 284 (expr_without_variable) -state 462 +state 466 283 expr_without_variable: variable "+= (T_PLUS_EQUAL)" expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -15976,108 +16398,110 @@ state 462 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 283 (expr_without_variable) -state 463 +state 467 - 392 function_call: variable_without_objects $@65 function_call_parameter_list . + 394 function_call: variable_without_objects $@65 function_call_parameter_list . - $default reduce using rule 392 (function_call) + $default reduce using rule 394 (function_call) -state 464 +state 468 - 539 variable_name: "identifier (T_STRING)" . - 587 class_constant: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . + 541 variable_name: "identifier (T_STRING)" . + 589 class_constant: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . - '(' reduce using rule 539 (variable_name) - $default reduce using rule 587 (class_constant) + '(' reduce using rule 541 (variable_name) + $default reduce using rule 589 (class_constant) -state 465 +state 469 - 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . $@64 function_call_parameter_list - 515 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . + 392 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . $@64 function_call_parameter_list + 517 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . - '(' reduce using rule 389 ($@64) - $default reduce using rule 515 (static_member) + '(' reduce using rule 391 ($@64) + $default reduce using rule 517 (static_member) - $@64 go to state 598 + $@64 go to state 602 -state 466 +state 470 - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name . $@63 function_call_parameter_list + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name . $@63 function_call_parameter_list - $default reduce using rule 387 ($@63) + $default reduce using rule 389 ($@63) - $@63 go to state 599 + $@63 go to state 603 -state 467 +state 471 - 517 array_function_dereference: array_function_dereference '[' dim_offset . ']' + 519 array_function_dereference: array_function_dereference '[' dim_offset . ']' - ']' shift, and go to state 600 + ']' shift, and go to state 604 -state 468 +state 472 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 . object_property $@69 method_or_not variable_properties + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 . object_property $@69 method_or_not variable_properties - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 601 - reference_variable go to state 420 + variable_without_objects go to state 605 + reference_variable go to state 422 compound_variable go to state 117 - object_property go to state 602 - object_dim_list go to state 603 - variable_name go to state 604 - simple_indirect_reference go to state 422 + object_property go to state 606 + object_dim_list go to state 607 + variable_name go to state 608 + simple_indirect_reference go to state 424 -state 469 +state 473 - 526 reference_variable: reference_variable '[' dim_offset . ']' + 528 reference_variable: reference_variable '[' dim_offset . ']' - ']' shift, and go to state 605 + ']' shift, and go to state 609 -state 470 +state 474 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 527 reference_variable: reference_variable '{' expr . '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 529 reference_variable: reference_variable '{' expr . '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -16105,27 +16529,28 @@ state 470 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 606 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 610 -state 471 +state 475 - 578 internal_functions_in_yacc: "eval (T_EVAL)" '(' expr ')' . + 580 internal_functions_in_yacc: "eval (T_EVAL)" '(' expr ')' . - $default reduce using rule 578 (internal_functions_in_yacc) + $default reduce using rule 580 (internal_functions_in_yacc) -state 472 +state 476 - 363 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" expr_without_variable . - 491 expr: expr_without_variable . + 365 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" expr_without_variable . + 493 expr: expr_without_variable . - ')' reduce using rule 363 (yield_expr) - ';' reduce using rule 363 (yield_expr) - $default reduce using rule 491 (expr) + ')' reduce using rule 365 (yield_expr) + ';' reduce using rule 365 (yield_expr) + $default reduce using rule 493 (expr) -state 473 +state 477 278 expr_without_variable: variable . '=' expr 279 | variable . '=' '&' variable @@ -16133,62 +16558,64 @@ state 473 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 364 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" variable . - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 - - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) - ')' reduce using rule 364 (yield_expr) - ';' reduce using rule 364 (yield_expr) - $default reduce using rule 494 (r_variable) + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 366 yield_expr: "yield (T_YIELD)" expr "=> (T_DOUBLE_ARROW)" variable . + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 + + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) + ')' reduce using rule 366 (yield_expr) + ';' reduce using rule 366 (yield_expr) + $default reduce using rule 496 (r_variable) -state 474 +state 478 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . @59 function_call_parameter_list - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . @59 function_call_parameter_list + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 395 (class_name) - $default reduce using rule 379 (@59) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 397 (class_name) + $default reduce using rule 381 (@59) - @59 go to state 555 + @59 go to state 559 -state 475 +state 479 - 539 variable_name: "identifier (T_STRING)" . + 541 variable_name: "identifier (T_STRING)" . - $default reduce using rule 539 (variable_name) + $default reduce using rule 541 (variable_name) -state 476 +state 480 - 557 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" '&' . w_variable + 559 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" '&' . w_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -16200,8 +16627,8 @@ state 476 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 607 - variable go to state 312 + w_variable go to state 611 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -16213,36 +16640,37 @@ state 476 simple_indirect_reference go to state 118 -state 477 +state 481 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 553 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 555 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -16270,13 +16698,14 @@ state 477 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 553 (non_empty_array_pair_list) + $default reduce using rule 555 (non_empty_array_pair_list) -state 478 +state 482 - 556 non_empty_array_pair_list: non_empty_array_pair_list ',' '&' . w_variable + 558 non_empty_array_pair_list: non_empty_array_pair_list ',' '&' . w_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -16288,8 +16717,8 @@ state 478 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 608 - variable go to state 312 + w_variable go to state 612 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -16301,38 +16730,39 @@ state 478 simple_indirect_reference go to state 118 -state 479 +state 483 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 551 non_empty_array_pair_list: non_empty_array_pair_list ',' expr . "=> (T_DOUBLE_ARROW)" expr - 552 | non_empty_array_pair_list ',' expr . - 555 | non_empty_array_pair_list ',' expr . "=> (T_DOUBLE_ARROW)" '&' w_variable + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 553 non_empty_array_pair_list: non_empty_array_pair_list ',' expr . "=> (T_DOUBLE_ARROW)" expr + 554 | non_empty_array_pair_list ',' expr . + 557 | non_empty_array_pair_list ',' expr . "=> (T_DOUBLE_ARROW)" '&' w_variable "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -16360,122 +16790,124 @@ state 479 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - "=> (T_DOUBLE_ARROW)" shift, and go to state 609 + "** (T_POW)" shift, and go to state 280 + "=> (T_DOUBLE_ARROW)" shift, and go to state 613 - $default reduce using rule 552 (non_empty_array_pair_list) + $default reduce using rule 554 (non_empty_array_pair_list) -state 480 +state 484 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 395 (class_name) + $default reduce using rule 397 (class_name) -state 481 +state 485 - 514 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . + 516 static_member: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . - $default reduce using rule 514 (static_member) + $default reduce using rule 516 (static_member) -state 482 +state 486 - 416 ctor_arguments: function_call_parameter_list . + 418 ctor_arguments: function_call_parameter_list . - $default reduce using rule 416 (ctor_arguments) + $default reduce using rule 418 (ctor_arguments) -state 483 +state 487 275 new_expr: "new (T_NEW)" class_name_reference $@44 ctor_arguments . $default reduce using rule 275 (new_expr) -state 484 +state 488 - 515 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . + 517 static_member: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects . - $default reduce using rule 515 (static_member) + $default reduce using rule 517 (static_member) -state 485 +state 489 - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 . object_property $@67 dynamic_class_name_variable_properties + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 . object_property $@67 dynamic_class_name_variable_properties - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 601 - reference_variable go to state 420 + variable_without_objects go to state 605 + reference_variable go to state 422 compound_variable go to state 117 - object_property go to state 610 - object_dim_list go to state 603 - variable_name go to state 604 - simple_indirect_reference go to state 422 + object_property go to state 614 + object_dim_list go to state 607 + variable_name go to state 608 + simple_indirect_reference go to state 424 -state 486 +state 490 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 . inner_statement_list $@8 new_elseif_list new_else_single "endif (T_ENDIF)" ';' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 611 + inner_statement_list go to state 615 -state 487 +state 491 52 unticked_statement: "if (T_IF)" parenthesis_expr $@5 statement . $@6 elseif_list else_single $default reduce using rule 51 ($@6) - $@6 go to state 612 + $@6 go to state 616 -state 488 +state 492 - 367 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset ']' . + 369 combined_scalar_offset: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" '[' dim_offset ']' . - $default reduce using rule 367 (combined_scalar_offset) + $default reduce using rule 369 (combined_scalar_offset) -state 489 +state 493 256 echo_expr_list: echo_expr_list ',' expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -16503,20 +16935,21 @@ state 489 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 256 (echo_expr_list) -state 490 +state 494 61 unticked_statement: "do (T_DO)" $@11 statement "while (T_WHILE)" . $@12 parenthesis_expr ';' $default reduce using rule 60 ($@12) - $@12 go to state 613 + $@12 go to state 617 -state 491 +state 495 58 unticked_statement: "while (T_WHILE)" $@9 parenthesis_expr @10 . while_statement @@ -16527,7 +16960,7 @@ state 491 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - ':' shift, and go to state 614 + ':' shift, and go to state 618 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -16594,9 +17027,9 @@ state 491 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 615 + statement go to state 619 unticked_statement go to state 88 - while_statement go to state 616 + while_statement go to state 620 new_expr go to state 95 expr_without_variable go to state 96 yield_expr go to state 97 @@ -16626,605 +17059,606 @@ state 491 class_name_scalar go to state 121 -state 492 +state 496 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' . $@13 for_expr ';' $@14 for_expr ')' $@15 for_statement $default reduce using rule 62 ($@13) - $@13 go to state 617 + $@13 go to state 621 -state 493 +state 497 261 non_empty_for_expr: non_empty_for_expr ',' . $@41 expr $default reduce using rule 260 ($@41) - $@41 go to state 618 + $@41 go to state 622 -state 494 +state 498 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" . $@19 foreach_variable foreach_optional_arg ')' $@20 foreach_statement $default reduce using rule 85 ($@19) - $@19 go to state 619 + $@19 go to state 623 -state 495 +state 499 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" . $@17 foreach_variable foreach_optional_arg ')' $@18 foreach_statement $default reduce using rule 82 ($@17) - $@17 go to state 620 + $@17 go to state 624 -state 496 +state 500 152 declare_list: "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 621 + '=' shift, and go to state 625 -state 497 +state 501 89 unticked_statement: "declare (T_DECLARE)" $@21 '(' declare_list . ')' declare_statement 153 declare_list: declare_list . ',' "identifier (T_STRING)" '=' static_scalar - ',' shift, and go to state 622 - ')' shift, and go to state 623 + ',' shift, and go to state 626 + ')' shift, and go to state 627 -state 498 +state 502 156 switch_case_list: ':' . case_list "endswitch (T_ENDSWITCH)" ';' 157 | ':' . ';' case_list "endswitch (T_ENDSWITCH)" ';' - ';' shift, and go to state 624 + ';' shift, and go to state 628 $default reduce using rule 158 (case_list) - case_list go to state 625 + case_list go to state 629 -state 499 +state 503 154 switch_case_list: '{' . case_list '}' 155 | '{' . ';' case_list '}' - ';' shift, and go to state 626 + ';' shift, and go to state 630 $default reduce using rule 158 (case_list) - case_list go to state 627 + case_list go to state 631 -state 500 +state 504 67 unticked_statement: "switch (T_SWITCH)" parenthesis_expr $@16 switch_case_list . $default reduce using rule 67 (unticked_statement) -state 501 +state 505 - 469 static_operation: '+' . static_scalar_value + 471 static_operation: '+' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 628 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 632 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 502 +state 506 - 470 static_operation: '-' . static_scalar_value + 472 static_operation: '-' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 629 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 633 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 503 +state 507 - 446 static_operation: '!' . static_scalar_value + 448 static_operation: '!' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 630 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 634 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 504 +state 508 - 447 static_operation: '~' . static_scalar_value + 449 static_operation: '~' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 631 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 635 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 505 +state 509 - 432 static_scalar: '[' . static_array_pair_list ']' + 434 static_scalar: '[' . static_array_pair_list ']' - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - $default reduce using rule 482 (static_array_pair_list) + $default reduce using rule 484 (static_array_pair_list) - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 632 - static_scalar_value go to state 518 - static_operation go to state 519 - static_array_pair_list go to state 633 - non_empty_static_array_pair_list go to state 634 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 636 + static_scalar_value go to state 522 + static_operation go to state 523 + static_array_pair_list go to state 637 + non_empty_static_array_pair_list go to state 638 + static_class_name_scalar go to state 524 -state 506 +state 510 - 419 common_scalar: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . + 421 common_scalar: "quoted-string (T_CONSTANT_ENCAPSED_STRING)" . - $default reduce using rule 419 (common_scalar) + $default reduce using rule 421 (common_scalar) -state 507 +state 511 - 431 static_scalar: "array (T_ARRAY)" . '(' static_array_pair_list ')' + 433 static_scalar: "array (T_ARRAY)" . '(' static_array_pair_list ')' - '(' shift, and go to state 635 + '(' shift, and go to state 639 -state 508 +state 512 - 439 static_scalar_value: "__CLASS__ (T_CLASS_C)" . + 441 static_scalar_value: "__CLASS__ (T_CLASS_C)" . - $default reduce using rule 439 (static_scalar_value) + $default reduce using rule 441 (static_scalar_value) -state 509 +state 513 - 427 common_scalar: "heredoc start (T_START_HEREDOC)" . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" - 428 | "heredoc start (T_START_HEREDOC)" . "heredoc end (T_END_HEREDOC)" + 429 common_scalar: "heredoc start (T_START_HEREDOC)" . "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" "heredoc end (T_END_HEREDOC)" + 430 | "heredoc start (T_START_HEREDOC)" . "heredoc end (T_END_HEREDOC)" - "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 636 + "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" shift, and go to state 640 "heredoc end (T_END_HEREDOC)" shift, and go to state 222 -state 510 +state 514 - 395 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - 436 static_scalar_value: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 397 class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 438 static_scalar_value: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - "\\ (T_NS_SEPARATOR)" shift, and go to state 637 + "\\ (T_NS_SEPARATOR)" shift, and go to state 641 -state 511 +state 515 - 396 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name - 437 static_scalar_value: "\\ (T_NS_SEPARATOR)" . namespace_name + 398 class_name: "\\ (T_NS_SEPARATOR)" . namespace_name + 439 static_scalar_value: "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 638 + namespace_name go to state 642 -state 512 +state 516 - 471 static_operation: '(' . static_scalar_value ')' + 473 static_operation: '(' . static_scalar_value ')' - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 639 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 643 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 513 +state 517 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 394 class_name: namespace_name . - 435 static_scalar_value: namespace_name . + 396 class_name: namespace_name . + 437 static_scalar_value: namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 394 (class_name) - $default reduce using rule 435 (static_scalar_value) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) + $default reduce using rule 437 (static_scalar_value) -state 514 +state 518 - 429 static_class_constant: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - 588 static_class_name_scalar: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" + 431 static_class_constant: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" + 590 static_class_name_scalar: class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 640 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 644 -state 515 +state 519 - 433 static_scalar_value: common_scalar . + 435 static_scalar_value: common_scalar . - $default reduce using rule 433 (static_scalar_value) + $default reduce using rule 435 (static_scalar_value) -state 516 +state 520 - 438 static_scalar_value: static_class_constant . + 440 static_scalar_value: static_class_constant . - $default reduce using rule 438 (static_scalar_value) + $default reduce using rule 440 (static_scalar_value) -state 517 +state 521 39 constant_declaration: "const (T_CONST)" "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 39 (constant_declaration) -state 518 +state 522 - 430 static_scalar: static_scalar_value . - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "or (T_LOGICAL_OR)" shift, and go to state 641 - "xor (T_LOGICAL_XOR)" shift, and go to state 642 - "and (T_LOGICAL_AND)" shift, and go to state 643 - '?' shift, and go to state 644 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 - - $default reduce using rule 430 (static_scalar) + 432 static_scalar: static_scalar_value . + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "or (T_LOGICAL_OR)" shift, and go to state 645 + "xor (T_LOGICAL_XOR)" shift, and go to state 646 + "and (T_LOGICAL_AND)" shift, and go to state 647 + '?' shift, and go to state 648 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 + $default reduce using rule 432 (static_scalar) -state 519 - 440 static_scalar_value: static_operation . +state 523 - $default reduce using rule 440 (static_scalar_value) + 442 static_scalar_value: static_operation . + $default reduce using rule 442 (static_scalar_value) -state 520 - 434 static_scalar_value: static_class_name_scalar . +state 524 - $default reduce using rule 434 (static_scalar_value) + 436 static_scalar_value: static_class_name_scalar . + $default reduce using rule 436 (static_scalar_value) -state 521 + +state 525 41 inner_statement_list: inner_statement_list . $@4 inner_statement 93 unticked_statement: "try (T_TRY)" $@22 '{' inner_statement_list . '}' catch_statement $@23 finally_statement - '}' shift, and go to state 666 + '}' shift, and go to state 670 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 522 +state 526 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" 30 use_function_declaration: "\\ (T_NS_SEPARATOR)" namespace_name . 31 | "\\ (T_NS_SEPARATOR)" namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 667 + "as (T_AS)" shift, and go to state 671 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 30 (use_function_declaration) -state 523 +state 527 29 use_function_declaration: namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 668 + "identifier (T_STRING)" shift, and go to state 672 -state 524 +state 528 26 use_function_declarations: use_function_declarations ',' . use_function_declaration "identifier (T_STRING)" shift, and go to state 123 - "\\ (T_NS_SEPARATOR)" shift, and go to state 348 + "\\ (T_NS_SEPARATOR)" shift, and go to state 350 - namespace_name go to state 349 - use_function_declaration go to state 669 + namespace_name go to state 351 + use_function_declaration go to state 673 -state 525 +state 529 17 top_statement: "use (T_USE)" "function (T_FUNCTION)" use_function_declarations ';' . $default reduce using rule 17 (top_statement) -state 526 +state 530 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" 36 use_const_declaration: "\\ (T_NS_SEPARATOR)" namespace_name . 37 | "\\ (T_NS_SEPARATOR)" namespace_name . "as (T_AS)" "identifier (T_STRING)" - "as (T_AS)" shift, and go to state 670 + "as (T_AS)" shift, and go to state 674 "\\ (T_NS_SEPARATOR)" shift, and go to state 241 $default reduce using rule 36 (use_const_declaration) -state 527 +state 531 35 use_const_declaration: namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 671 + "identifier (T_STRING)" shift, and go to state 675 -state 528 +state 532 32 use_const_declarations: use_const_declarations ',' . use_const_declaration "identifier (T_STRING)" shift, and go to state 123 - "\\ (T_NS_SEPARATOR)" shift, and go to state 352 + "\\ (T_NS_SEPARATOR)" shift, and go to state 354 - namespace_name go to state 353 - use_const_declaration go to state 672 + namespace_name go to state 355 + use_const_declaration go to state 676 -state 529 +state 533 18 top_statement: "use (T_USE)" "const (T_CONST)" use_const_declarations ';' . $default reduce using rule 18 (top_statement) -state 530 +state 534 25 use_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 673 + "identifier (T_STRING)" shift, and go to state 677 -state 531 +state 535 23 use_declaration: namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 23 (use_declaration) -state 532 +state 536 20 use_declarations: use_declarations ',' use_declaration . $default reduce using rule 20 (use_declarations) -state 533 +state 537 202 global_var: '$' '{' expr . '}' - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -17252,41 +17686,42 @@ state 533 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 674 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 678 -state 534 +state 538 198 global_var_list: global_var_list ',' global_var . $default reduce using rule 198 (global_var_list) -state 535 +state 539 206 static_var_list: "variable (T_VARIABLE)" '=' static_scalar . $default reduce using rule 206 (static_var_list) -state 536 +state 540 203 static_var_list: static_var_list ',' "variable (T_VARIABLE)" . 204 | static_var_list ',' "variable (T_VARIABLE)" . '=' static_scalar - '=' shift, and go to state 675 + '=' shift, and go to state 679 $default reduce using rule 203 (static_var_list) -state 537 +state 541 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 . '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 . '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' - '(' shift, and go to state 676 + '(' shift, and go to state 680 -state 538 +state 542 113 unset_variables: unset_variables ',' . unset_variable @@ -17298,10 +17733,10 @@ state 538 '$' shift, and go to state 81 namespace_name go to state 151 - unset_variable go to state 677 + unset_variable go to state 681 function_call go to state 101 class_name go to state 152 - variable go to state 371 + variable go to state 373 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -17313,108 +17748,108 @@ state 538 simple_indirect_reference go to state 118 -state 539 +state 543 81 unticked_statement: "unset (T_UNSET)" '(' unset_variables ')' . ';' - ';' shift, and go to state 678 + ';' shift, and go to state 682 -state 540 +state 544 - 583 isset_variables: isset_variables ',' . $@76 isset_variable + 585 isset_variables: isset_variables ',' . $@76 isset_variable - $default reduce using rule 582 ($@76) + $default reduce using rule 584 ($@76) - $@76 go to state 679 + $@76 go to state 683 -state 541 +state 545 - 573 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables ')' . + 575 internal_functions_in_yacc: "isset (T_ISSET)" '(' isset_variables ')' . - $default reduce using rule 573 (internal_functions_in_yacc) + $default reduce using rule 575 (internal_functions_in_yacc) -state 542 +state 546 - 575 internal_functions_in_yacc: "empty (T_EMPTY)" '(' expr_without_variable ')' . + 577 internal_functions_in_yacc: "empty (T_EMPTY)" '(' expr_without_variable ')' . - $default reduce using rule 575 (internal_functions_in_yacc) + $default reduce using rule 577 (internal_functions_in_yacc) -state 543 +state 547 - 574 internal_functions_in_yacc: "empty (T_EMPTY)" '(' variable ')' . + 576 internal_functions_in_yacc: "empty (T_EMPTY)" '(' variable ')' . - $default reduce using rule 574 (internal_functions_in_yacc) + $default reduce using rule 576 (internal_functions_in_yacc) -state 544 +state 548 10 top_statement: "__halt_compiler (T_HALT_COMPILER)" '(' ')' ';' . $default reduce using rule 10 (top_statement) -state 545 +state 549 - 547 assignment_list_element: "list (T_LIST)" . '(' $@74 assignment_list ')' + 549 assignment_list_element: "list (T_LIST)" . '(' $@74 assignment_list ')' - '(' shift, and go to state 680 + '(' shift, and go to state 684 -state 546 +state 550 - 545 assignment_list_element: variable . + 547 assignment_list_element: variable . - $default reduce using rule 545 (assignment_list_element) + $default reduce using rule 547 (assignment_list_element) -state 547 +state 551 277 expr_without_variable: "list (T_LIST)" '(' $@45 assignment_list . ')' '=' expr - 543 assignment_list: assignment_list . ',' assignment_list_element + 545 assignment_list: assignment_list . ',' assignment_list_element - ',' shift, and go to state 681 - ')' shift, and go to state 682 + ',' shift, and go to state 685 + ')' shift, and go to state 686 -state 548 +state 552 - 544 assignment_list: assignment_list_element . + 546 assignment_list: assignment_list_element . - $default reduce using rule 544 (assignment_list) + $default reduce using rule 546 (assignment_list) -state 549 +state 553 - 368 combined_scalar: "array (T_ARRAY)" '(' array_pair_list ')' . + 370 combined_scalar: "array (T_ARRAY)" '(' array_pair_list ')' . - $default reduce using rule 368 (combined_scalar) + $default reduce using rule 370 (combined_scalar) -state 550 +state 554 - 565 encaps_var: "variable (T_VARIABLE)" '[' $@75 . encaps_var_offset ']' + 567 encaps_var: "variable (T_VARIABLE)" '[' $@75 . encaps_var_offset ']' - "identifier (T_STRING)" shift, and go to state 683 - "variable (T_VARIABLE)" shift, and go to state 684 - "number (T_NUM_STRING)" shift, and go to state 685 + "identifier (T_STRING)" shift, and go to state 687 + "variable (T_VARIABLE)" shift, and go to state 688 + "number (T_NUM_STRING)" shift, and go to state 689 - encaps_var_offset go to state 686 + encaps_var_offset go to state 690 -state 551 +state 555 - 566 encaps_var: "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" . + 568 encaps_var: "variable (T_VARIABLE)" "-> (T_OBJECT_OPERATOR)" "identifier (T_STRING)" . - $default reduce using rule 566 (encaps_var) + $default reduce using rule 568 (encaps_var) -state 552 +state 556 - 568 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' . expr ']' '}' + 570 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' . expr ']' '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -17479,7 +17914,7 @@ state 552 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 687 + expr go to state 691 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -17498,112 +17933,112 @@ state 552 class_name_scalar go to state 121 -state 553 +state 557 - 567 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr '}' . + 569 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" expr '}' . - $default reduce using rule 567 (encaps_var) + $default reduce using rule 569 (encaps_var) -state 554 +state 558 - 569 encaps_var: "{$ (T_CURLY_OPEN)" variable '}' . + 571 encaps_var: "{$ (T_CURLY_OPEN)" variable '}' . - $default reduce using rule 569 (encaps_var) + $default reduce using rule 571 (encaps_var) -state 555 +state 559 - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 . function_call_parameter_list + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 688 + function_call_parameter_list go to state 692 -state 556 +state 560 3 top_statement_list: top_statement_list . $@1 top_statement 15 top_statement: "namespace (T_NAMESPACE)" '{' $@3 top_statement_list . '}' - '}' shift, and go to state 689 + '}' shift, and go to state 693 $default reduce using rule 2 ($@1) $@1 go to state 4 -state 557 +state 561 13 top_statement: "namespace (T_NAMESPACE)" namespace_name '{' $@2 . top_statement_list '}' $default reduce using rule 4 (top_statement_list) - top_statement_list go to state 690 + top_statement_list go to state 694 -state 558 +state 562 - 382 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 function_call_parameter_list . + 384 function_call: "\\ (T_NS_SEPARATOR)" namespace_name @60 function_call_parameter_list . - $default reduce using rule 382 (function_call) + $default reduce using rule 384 (function_call) -state 559 +state 563 - 334 expr_without_variable: '(' new_expr ')' @51 . instance_call + 336 expr_without_variable: '(' new_expr ')' @51 . instance_call '[' reduce using rule 272 ($@43) "-> (T_OBJECT_OPERATOR)" reduce using rule 272 ($@43) $default reduce using rule 271 (instance_call) - instance_call go to state 691 - $@43 go to state 692 + instance_call go to state 695 + $@43 go to state 696 -state 560 +state 564 46 inner_statement: "__halt_compiler (T_HALT_COMPILER)" . '(' ')' ';' - '(' shift, and go to state 693 + '(' shift, and go to state 697 -state 561 +state 565 41 inner_statement_list: inner_statement_list $@4 inner_statement . $default reduce using rule 41 (inner_statement_list) -state 562 +state 566 43 inner_statement: statement . $default reduce using rule 43 (inner_statement) -state 563 +state 567 44 inner_statement: function_declaration_statement . $default reduce using rule 44 (inner_statement) -state 564 +state 568 45 inner_statement: class_declaration_statement . $default reduce using rule 45 (inner_statement) -state 565 +state 569 - 530 compound_variable: '$' '{' expr '}' . + 532 compound_variable: '$' '{' expr '}' . - $default reduce using rule 530 (compound_variable) + $default reduce using rule 532 (compound_variable) -state 566 +state 570 192 non_empty_function_call_parameter_list: '&' . w_variable @@ -17617,8 +18052,8 @@ state 566 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 694 - variable go to state 312 + w_variable go to state 698 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -17630,7 +18065,7 @@ state 566 simple_indirect_reference go to state 118 -state 567 +state 571 193 non_empty_function_call_parameter_list: "... (T_ELLIPSIS)" . expr @@ -17697,7 +18132,7 @@ state 567 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 695 + expr go to state 699 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -17716,14 +18151,14 @@ state 567 class_name_scalar go to state 121 -state 568 +state 572 187 function_call_parameter_list: '(' ')' . $default reduce using rule 187 (function_call_parameter_list) -state 569 +state 573 188 function_call_parameter_list: '(' non_empty_function_call_parameter_list . ')' 194 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list . ',' expr_without_variable @@ -17731,28 +18166,28 @@ state 569 196 | non_empty_function_call_parameter_list . ',' '&' w_variable 197 | non_empty_function_call_parameter_list . ',' "... (T_ELLIPSIS)" expr - ',' shift, and go to state 696 - ')' shift, and go to state 697 + ',' shift, and go to state 700 + ')' shift, and go to state 701 -state 570 +state 574 190 non_empty_function_call_parameter_list: expr_without_variable . - 491 expr: expr_without_variable . + 493 expr: expr_without_variable . ',' reduce using rule 190 (non_empty_function_call_parameter_list) ')' reduce using rule 190 (non_empty_function_call_parameter_list) - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) -state 571 +state 575 189 function_call_parameter_list: '(' yield_expr . ')' - ')' shift, and go to state 698 + ')' shift, and go to state 702 -state 572 +state 576 191 non_empty_function_call_parameter_list: variable . 278 expr_without_variable: variable . '=' expr @@ -17761,218 +18196,221 @@ state 572 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 ',' reduce using rule 191 (non_empty_function_call_parameter_list) - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) ')' reduce using rule 191 (non_empty_function_call_parameter_list) - $default reduce using rule 494 (r_variable) + $default reduce using rule 496 (r_variable) -state 573 +state 577 38 constant_declaration: constant_declaration ',' "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 699 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 703 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 574 +state 578 - 398 fully_qualified_class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name + 400 fully_qualified_class_name: "namespace (T_NAMESPACE)" . "\\ (T_NS_SEPARATOR)" namespace_name - "\\ (T_NS_SEPARATOR)" shift, and go to state 700 + "\\ (T_NS_SEPARATOR)" shift, and go to state 704 -state 575 +state 579 - 399 fully_qualified_class_name: "\\ (T_NS_SEPARATOR)" . namespace_name + 401 fully_qualified_class_name: "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 701 + namespace_name go to state 705 -state 576 +state 580 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 397 fully_qualified_class_name: namespace_name . + 399 fully_qualified_class_name: namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 397 (fully_qualified_class_name) + $default reduce using rule 399 (fully_qualified_class_name) -state 577 +state 581 132 extends_from: "extends (T_EXTENDS)" fully_qualified_class_name . $default reduce using rule 132 (extends_from) -state 578 +state 582 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from $@32 . implements_list '{' class_statement_list '}' - "implements (T_IMPLEMENTS)" shift, and go to state 702 + "implements (T_IMPLEMENTS)" shift, and go to state 706 $default reduce using rule 136 (implements_list) - implements_list go to state 703 + implements_list go to state 707 -state 579 +state 583 135 interface_extends_list: "extends (T_EXTENDS)" . interface_list "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - interface_list go to state 704 - fully_qualified_class_name go to state 705 + namespace_name go to state 580 + interface_list go to state 708 + fully_qualified_class_name go to state 709 -state 580 +state 584 126 unticked_class_declaration_statement: interface_entry "identifier (T_STRING)" $@33 interface_extends_list . '{' class_statement_list '}' - '{' shift, and go to state 706 + '{' shift, and go to state 710 -state 581 +state 585 - 366 combined_scalar_offset: combined_scalar_offset '[' dim_offset ']' . + 368 combined_scalar_offset: combined_scalar_offset '[' dim_offset ']' . - $default reduce using rule 366 (combined_scalar_offset) + $default reduce using rule 368 (combined_scalar_offset) -state 582 +state 586 - 365 combined_scalar_offset: combined_scalar '[' dim_offset ']' . + 367 combined_scalar_offset: combined_scalar '[' dim_offset ']' . - $default reduce using rule 365 (combined_scalar_offset) + $default reduce using rule 367 (combined_scalar_offset) -state 583 +state 587 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 . '(' parameter_list ')' '{' inner_statement_list '}' - '(' shift, and go to state 707 + '(' shift, and go to state 711 -state 584 +state 588 - 358 expr_without_variable: function is_reference @56 '(' . parameter_list ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 '(' . parameter_list ')' lexical_vars '{' inner_statement_list '}' "identifier (T_STRING)" shift, and go to state 123 - "array (T_ARRAY)" shift, and go to state 708 - "callable (T_CALLABLE)" shift, and go to state 709 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "array (T_ARRAY)" shift, and go to state 712 + "callable (T_CALLABLE)" shift, and go to state 713 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 ')' reduce using rule 178 (parameter_list) $default reduce using rule 183 (optional_class_type) - namespace_name go to state 576 - parameter_list go to state 710 - non_empty_parameter_list go to state 711 - parameter go to state 712 - optional_class_type go to state 713 - fully_qualified_class_name go to state 714 + namespace_name go to state 580 + parameter_list go to state 714 + non_empty_parameter_list go to state 715 + parameter go to state 716 + optional_class_type go to state 717 + fully_qualified_class_name go to state 718 -state 585 +state 589 - 519 array_function_dereference: function_call $@72 '[' dim_offset . ']' + 521 array_function_dereference: function_call $@72 '[' dim_offset . ']' - ']' shift, and go to state 715 + ']' shift, and go to state 719 -state 586 +state 590 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 540 variable_name: '{' expr . '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 542 variable_name: '{' expr . '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -18000,69 +18438,71 @@ state 586 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 716 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 720 -state 587 +state 591 - 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 . function_call_parameter_list + 388 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 717 + function_call_parameter_list go to state 721 -state 588 +state 592 - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 . function_call_parameter_list + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 718 + function_call_parameter_list go to state 722 -state 589 +state 593 - 513 variable_without_objects: simple_indirect_reference reference_variable . - 526 reference_variable: reference_variable . '[' dim_offset ']' - 527 | reference_variable . '{' expr '}' + 515 variable_without_objects: simple_indirect_reference reference_variable . + 528 reference_variable: reference_variable . '[' dim_offset ']' + 529 | reference_variable . '{' expr '}' - '[' shift, and go to state 299 - '{' shift, and go to state 300 + '[' shift, and go to state 301 + '{' shift, and go to state 302 - $default reduce using rule 513 (variable_without_objects) + $default reduce using rule 515 (variable_without_objects) -state 590 +state 594 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 303 | expr "or (T_LOGICAL_OR)" $@49 expr . - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 304 | expr "or (T_LOGICAL_OR)" $@49 expr . + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "xor (T_LOGICAL_XOR)" shift, and go to state 255 "and (T_LOGICAL_AND)" shift, and go to state 256 @@ -18089,40 +18529,42 @@ state 590 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 303 (expr_without_variable) + $default reduce using rule 304 (expr_without_variable) -state 591 +state 595 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 305 | expr "and (T_LOGICAL_AND)" $@50 expr . - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 306 | expr "and (T_LOGICAL_AND)" $@50 expr . + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -18147,13 +18589,14 @@ state 591 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 305 (expr_without_variable) + $default reduce using rule 306 (expr_without_variable) -state 592 +state 596 - 339 expr_without_variable: expr '?' ':' $@54 . expr + 341 expr_without_variable: expr '?' ':' $@54 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -18218,7 +18661,7 @@ state 592 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 719 + expr go to state 723 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -18237,42 +18680,43 @@ state 592 class_name_scalar go to state 121 -state 593 +state 597 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 337 | expr '?' $@52 expr . ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 339 | expr '?' $@52 expr . ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 "and (T_LOGICAL_AND)" shift, and go to state 256 '?' shift, and go to state 257 - ':' shift, and go to state 720 + ':' shift, and go to state 724 "|| (T_BOOLEAN_OR)" shift, and go to state 258 "&& (T_BOOLEAN_AND)" shift, and go to state 259 '|' shift, and go to state 260 @@ -18295,38 +18739,40 @@ state 593 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 -state 594 +state 598 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 299 | expr "|| (T_BOOLEAN_OR)" $@47 expr . - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 300 | expr "|| (T_BOOLEAN_OR)" $@47 expr . + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "&& (T_BOOLEAN_AND)" shift, and go to state 259 '|' shift, and go to state 260 @@ -18349,40 +18795,42 @@ state 594 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 299 (expr_without_variable) + $default reduce using rule 300 (expr_without_variable) -state 595 +state 599 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 301 | expr "&& (T_BOOLEAN_AND)" $@48 expr . - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 302 | expr "&& (T_BOOLEAN_AND)" $@48 expr . + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '|' shift, and go to state 260 '^' shift, and go to state 261 @@ -18404,11 +18852,12 @@ state 595 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 301 (expr_without_variable) + $default reduce using rule 302 (expr_without_variable) -state 596 +state 600 281 expr_without_variable: variable '=' '&' "new (T_NEW)" . class_name_reference $@46 ctor_arguments @@ -18421,7 +18870,7 @@ state 596 namespace_name go to state 164 class_name go to state 165 - class_name_reference go to state 721 + class_name_reference go to state 725 dynamic_class_name_reference go to state 167 static_member go to state 111 variable_class_name go to state 168 @@ -18431,107 +18880,107 @@ state 596 simple_indirect_reference go to state 171 -state 597 +state 601 279 expr_without_variable: variable '=' '&' variable . $default reduce using rule 279 (expr_without_variable) -state 598 +state 602 - 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 . function_call_parameter_list + 392 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 722 + function_call_parameter_list go to state 726 -state 599 +state 603 - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 . function_call_parameter_list + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 723 + function_call_parameter_list go to state 727 -state 600 +state 604 - 517 array_function_dereference: array_function_dereference '[' dim_offset ']' . + 519 array_function_dereference: array_function_dereference '[' dim_offset ']' . - $default reduce using rule 517 (array_function_dereference) + $default reduce using rule 519 (array_function_dereference) -state 601 +state 605 - 535 object_property: variable_without_objects . $@73 + 537 object_property: variable_without_objects . $@73 - $default reduce using rule 534 ($@73) + $default reduce using rule 536 ($@73) - $@73 go to state 724 + $@73 go to state 728 -state 602 +state 606 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property . $@69 method_or_not variable_properties + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property . $@69 method_or_not variable_properties - $default reduce using rule 498 ($@69) + $default reduce using rule 500 ($@69) - $@69 go to state 725 + $@69 go to state 729 -state 603 +state 607 - 533 object_property: object_dim_list . - 536 object_dim_list: object_dim_list . '[' dim_offset ']' - 537 | object_dim_list . '{' expr '}' + 535 object_property: object_dim_list . + 538 object_dim_list: object_dim_list . '[' dim_offset ']' + 539 | object_dim_list . '{' expr '}' - '[' shift, and go to state 726 - '{' shift, and go to state 727 + '[' shift, and go to state 730 + '{' shift, and go to state 731 - $default reduce using rule 533 (object_property) + $default reduce using rule 535 (object_property) -state 604 +state 608 - 538 object_dim_list: variable_name . + 540 object_dim_list: variable_name . - $default reduce using rule 538 (object_dim_list) + $default reduce using rule 540 (object_dim_list) -state 605 +state 609 - 526 reference_variable: reference_variable '[' dim_offset ']' . + 528 reference_variable: reference_variable '[' dim_offset ']' . - $default reduce using rule 526 (reference_variable) + $default reduce using rule 528 (reference_variable) -state 606 +state 610 - 527 reference_variable: reference_variable '{' expr '}' . + 529 reference_variable: reference_variable '{' expr '}' . - $default reduce using rule 527 (reference_variable) + $default reduce using rule 529 (reference_variable) -state 607 +state 611 - 557 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" '&' w_variable . + 559 non_empty_array_pair_list: expr "=> (T_DOUBLE_ARROW)" '&' w_variable . - $default reduce using rule 557 (non_empty_array_pair_list) + $default reduce using rule 559 (non_empty_array_pair_list) -state 608 +state 612 - 556 non_empty_array_pair_list: non_empty_array_pair_list ',' '&' w_variable . + 558 non_empty_array_pair_list: non_empty_array_pair_list ',' '&' w_variable . - $default reduce using rule 556 (non_empty_array_pair_list) + $default reduce using rule 558 (non_empty_array_pair_list) -state 609 +state 613 - 551 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" . expr - 555 | non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" . '&' w_variable + 553 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" . expr + 557 | non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" . '&' w_variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -18540,7 +18989,7 @@ state 609 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 122 - '&' shift, and go to state 728 + '&' shift, and go to state 732 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -18597,7 +19046,7 @@ state 609 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 729 + expr go to state 733 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -18616,16 +19065,16 @@ state 609 class_name_scalar go to state 121 -state 610 +state 614 - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property . $@67 dynamic_class_name_variable_properties + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property . $@67 dynamic_class_name_variable_properties - $default reduce using rule 403 ($@67) + $default reduce using rule 405 ($@67) - $@67 go to state 730 + $@67 go to state 734 -state 611 +state 615 41 inner_statement_list: inner_statement_list . $@4 inner_statement 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list . $@8 new_elseif_list new_else_single "endif (T_ENDIF)" ';' @@ -18635,52 +19084,52 @@ state 611 "endif (T_ENDIF)" reduce using rule 54 ($@8) $default reduce using rule 40 ($@4) - $@4 go to state 400 - $@8 go to state 731 + $@4 go to state 402 + $@8 go to state 735 -state 612 +state 616 52 unticked_statement: "if (T_IF)" parenthesis_expr $@5 statement $@6 . elseif_list else_single $default reduce using rule 167 (elseif_list) - elseif_list go to state 732 + elseif_list go to state 736 -state 613 +state 617 61 unticked_statement: "do (T_DO)" $@11 statement "while (T_WHILE)" $@12 . parenthesis_expr ';' '(' shift, and go to state 175 - parenthesis_expr go to state 733 + parenthesis_expr go to state 737 -state 614 +state 618 166 while_statement: ':' . inner_statement_list "endwhile (T_ENDWHILE)" ';' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 734 + inner_statement_list go to state 738 -state 615 +state 619 165 while_statement: statement . $default reduce using rule 165 (while_statement) -state 616 +state 620 58 unticked_statement: "while (T_WHILE)" $@9 parenthesis_expr @10 while_statement . $default reduce using rule 58 (unticked_statement) -state 617 +state 621 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 . for_expr ';' $@14 for_expr ')' $@15 for_statement @@ -18740,8 +19189,8 @@ state 617 $default reduce using rule 258 (for_expr) namespace_name go to state 84 - for_expr go to state 735 - non_empty_for_expr go to state 334 + for_expr go to state 739 + non_empty_for_expr go to state 336 new_expr go to state 95 expr_without_variable go to state 96 combined_scalar_offset go to state 98 @@ -18751,7 +19200,7 @@ state 617 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 335 + expr go to state 337 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -18770,7 +19219,7 @@ state 617 class_name_scalar go to state 121 -state 618 +state 622 261 non_empty_for_expr: non_empty_for_expr ',' $@41 . expr @@ -18837,7 +19286,7 @@ state 618 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 736 + expr go to state 740 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -18856,24 +19305,24 @@ state 618 class_name_scalar go to state 121 -state 619 +state 623 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 . foreach_variable foreach_optional_arg ')' $@20 foreach_statement - '&' shift, and go to state 737 + '&' shift, and go to state 741 "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 738 + "list (T_LIST)" shift, and go to state 742 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 namespace_name go to state 151 - foreach_variable go to state 739 + foreach_variable go to state 743 function_call go to state 101 class_name go to state 152 - variable go to state 740 + variable go to state 744 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -18885,24 +19334,24 @@ state 619 simple_indirect_reference go to state 118 -state 620 +state 624 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 . foreach_variable foreach_optional_arg ')' $@18 foreach_statement - '&' shift, and go to state 737 + '&' shift, and go to state 741 "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 738 + "list (T_LIST)" shift, and go to state 742 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 namespace_name go to state 151 - foreach_variable go to state 741 + foreach_variable go to state 745 function_call go to state 101 class_name go to state 152 - variable go to state 740 + variable go to state 744 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -18914,52 +19363,52 @@ state 620 simple_indirect_reference go to state 118 -state 621 +state 625 152 declare_list: "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 742 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 746 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 622 +state 626 153 declare_list: declare_list ',' . "identifier (T_STRING)" '=' static_scalar - "identifier (T_STRING)" shift, and go to state 743 + "identifier (T_STRING)" shift, and go to state 747 -state 623 +state 627 89 unticked_statement: "declare (T_DECLARE)" $@21 '(' declare_list ')' . declare_statement @@ -18970,7 +19419,7 @@ state 623 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - ':' shift, and go to state 744 + ':' shift, and go to state 748 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -19037,9 +19486,9 @@ state 623 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 745 + statement go to state 749 unticked_statement go to state 88 - declare_statement go to state 746 + declare_statement go to state 750 new_expr go to state 95 expr_without_variable go to state 96 yield_expr go to state 97 @@ -19069,1374 +19518,1374 @@ state 623 class_name_scalar go to state 121 -state 624 +state 628 157 switch_case_list: ':' ';' . case_list "endswitch (T_ENDSWITCH)" ';' $default reduce using rule 158 (case_list) - case_list go to state 747 + case_list go to state 751 -state 625 +state 629 156 switch_case_list: ':' case_list . "endswitch (T_ENDSWITCH)" ';' 160 case_list: case_list . "case (T_CASE)" expr case_separator $@35 inner_statement_list 162 | case_list . "default (T_DEFAULT)" case_separator $@36 inner_statement_list - "endswitch (T_ENDSWITCH)" shift, and go to state 748 - "case (T_CASE)" shift, and go to state 749 - "default (T_DEFAULT)" shift, and go to state 750 + "endswitch (T_ENDSWITCH)" shift, and go to state 752 + "case (T_CASE)" shift, and go to state 753 + "default (T_DEFAULT)" shift, and go to state 754 -state 626 +state 630 155 switch_case_list: '{' ';' . case_list '}' $default reduce using rule 158 (case_list) - case_list go to state 751 + case_list go to state 755 -state 627 +state 631 154 switch_case_list: '{' case_list . '}' 160 case_list: case_list . "case (T_CASE)" expr case_separator $@35 inner_statement_list 162 | case_list . "default (T_DEFAULT)" case_separator $@36 inner_statement_list - "case (T_CASE)" shift, and go to state 749 - "default (T_DEFAULT)" shift, and go to state 750 - '}' shift, and go to state 752 - + "case (T_CASE)" shift, and go to state 753 + "default (T_DEFAULT)" shift, and go to state 754 + '}' shift, and go to state 756 -state 628 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - 469 | '+' static_scalar_value . - - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 +state 632 - $default reduce using rule 469 (static_operation) + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 471 | '+' static_scalar_value . + + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 + $default reduce using rule 471 (static_operation) -state 629 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - 470 | '-' static_scalar_value . - - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 +state 633 - $default reduce using rule 470 (static_operation) + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 472 | '-' static_scalar_value . + + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 + + $default reduce using rule 472 (static_operation) -state 630 +state 634 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 446 | '!' static_scalar_value . - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 448 | '!' static_scalar_value . + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - $default reduce using rule 446 (static_operation) + $default reduce using rule 448 (static_operation) -state 631 +state 635 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 447 | '~' static_scalar_value . - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 449 | '~' static_scalar_value . + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - $default reduce using rule 447 (static_operation) + $default reduce using rule 449 (static_operation) -state 632 +state 636 - 488 non_empty_static_array_pair_list: static_scalar . "=> (T_DOUBLE_ARROW)" static_scalar - 489 | static_scalar . + 490 non_empty_static_array_pair_list: static_scalar . "=> (T_DOUBLE_ARROW)" static_scalar + 491 | static_scalar . - "=> (T_DOUBLE_ARROW)" shift, and go to state 753 + "=> (T_DOUBLE_ARROW)" shift, and go to state 757 - $default reduce using rule 489 (non_empty_static_array_pair_list) + $default reduce using rule 491 (non_empty_static_array_pair_list) -state 633 +state 637 - 432 static_scalar: '[' static_array_pair_list . ']' + 434 static_scalar: '[' static_array_pair_list . ']' - ']' shift, and go to state 754 + ']' shift, and go to state 758 -state 634 +state 638 - 483 static_array_pair_list: non_empty_static_array_pair_list . possible_comma - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list . ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar - 487 | non_empty_static_array_pair_list . ',' static_scalar + 485 static_array_pair_list: non_empty_static_array_pair_list . possible_comma + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list . ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar + 489 | non_empty_static_array_pair_list . ',' static_scalar - ',' shift, and go to state 755 + ',' shift, and go to state 759 - $default reduce using rule 484 (possible_comma) + $default reduce using rule 486 (possible_comma) - possible_comma go to state 756 + possible_comma go to state 760 -state 635 +state 639 - 431 static_scalar: "array (T_ARRAY)" '(' . static_array_pair_list ')' + 433 static_scalar: "array (T_ARRAY)" '(' . static_array_pair_list ')' - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - $default reduce using rule 482 (static_array_pair_list) + $default reduce using rule 484 (static_array_pair_list) - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 632 - static_scalar_value go to state 518 - static_operation go to state 519 - static_array_pair_list go to state 757 - non_empty_static_array_pair_list go to state 634 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 636 + static_scalar_value go to state 522 + static_operation go to state 523 + static_array_pair_list go to state 761 + non_empty_static_array_pair_list go to state 638 + static_class_name_scalar go to state 524 -state 636 +state 640 - 427 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . "heredoc end (T_END_HEREDOC)" + 429 common_scalar: "heredoc start (T_START_HEREDOC)" "quoted-string and whitespace (T_ENCAPSED_AND_WHITESPACE)" . "heredoc end (T_END_HEREDOC)" - "heredoc end (T_END_HEREDOC)" shift, and go to state 383 + "heredoc end (T_END_HEREDOC)" shift, and go to state 385 -state 637 +state 641 - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name - 436 static_scalar_value: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 438 static_scalar_value: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 758 + namespace_name go to state 762 -state 638 +state 642 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 396 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . - 437 static_scalar_value: "\\ (T_NS_SEPARATOR)" namespace_name . + 398 class_name: "\\ (T_NS_SEPARATOR)" namespace_name . + 439 static_scalar_value: "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 396 (class_name) - $default reduce using rule 437 (static_scalar_value) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 398 (class_name) + $default reduce using rule 439 (static_scalar_value) -state 639 +state 643 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - 471 | '(' static_scalar_value . ')' - - "or (T_LOGICAL_OR)" shift, and go to state 641 - "xor (T_LOGICAL_XOR)" shift, and go to state 642 - "and (T_LOGICAL_AND)" shift, and go to state 643 - '?' shift, and go to state 644 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 - ')' shift, and go to state 759 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 473 | '(' static_scalar_value . ')' + + "or (T_LOGICAL_OR)" shift, and go to state 645 + "xor (T_LOGICAL_XOR)" shift, and go to state 646 + "and (T_LOGICAL_AND)" shift, and go to state 647 + '?' shift, and go to state 648 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 + ')' shift, and go to state 763 -state 640 +state 644 - 429 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" - 588 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "class (T_CLASS)" + 431 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" + 590 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "class (T_CLASS)" - "identifier (T_STRING)" shift, and go to state 760 - "class (T_CLASS)" shift, and go to state 761 + "identifier (T_STRING)" shift, and go to state 764 + "class (T_CLASS)" shift, and go to state 765 -state 641 +state 645 - 456 static_operation: static_scalar_value "or (T_LOGICAL_OR)" . static_scalar_value + 458 static_operation: static_scalar_value "or (T_LOGICAL_OR)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 762 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 766 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 642 +state 646 - 454 static_operation: static_scalar_value "xor (T_LOGICAL_XOR)" . static_scalar_value + 456 static_operation: static_scalar_value "xor (T_LOGICAL_XOR)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 763 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 767 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 643 +state 647 - 455 static_operation: static_scalar_value "and (T_LOGICAL_AND)" . static_scalar_value + 457 static_operation: static_scalar_value "and (T_LOGICAL_AND)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 764 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 768 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 644 +state 648 - 467 static_operation: static_scalar_value '?' . ':' static_scalar_value - 468 | static_scalar_value '?' . static_scalar_value ':' static_scalar_value + 469 static_operation: static_scalar_value '?' . ':' static_scalar_value + 470 | static_scalar_value '?' . static_scalar_value ':' static_scalar_value - ':' shift, and go to state 765 - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + ':' shift, and go to state 769 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 766 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 770 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 645 +state 649 - 458 static_operation: static_scalar_value "|| (T_BOOLEAN_OR)" . static_scalar_value + 460 static_operation: static_scalar_value "|| (T_BOOLEAN_OR)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 767 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 771 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 646 +state 650 - 457 static_operation: static_scalar_value "&& (T_BOOLEAN_AND)" . static_scalar_value + 459 static_operation: static_scalar_value "&& (T_BOOLEAN_AND)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 768 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 772 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 647 +state 651 - 448 static_operation: static_scalar_value '|' . static_scalar_value + 450 static_operation: static_scalar_value '|' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 769 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 773 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 648 +state 652 - 450 static_operation: static_scalar_value '^' . static_scalar_value + 452 static_operation: static_scalar_value '^' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 770 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 774 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 649 +state 653 - 449 static_operation: static_scalar_value '&' . static_scalar_value + 451 static_operation: static_scalar_value '&' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 771 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 775 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 650 +state 654 - 460 static_operation: static_scalar_value "!== (T_IS_NOT_IDENTICAL)" . static_scalar_value + 462 static_operation: static_scalar_value "!== (T_IS_NOT_IDENTICAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 772 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 776 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 651 +state 655 - 459 static_operation: static_scalar_value "=== (T_IS_IDENTICAL)" . static_scalar_value + 461 static_operation: static_scalar_value "=== (T_IS_IDENTICAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 773 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 777 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 652 +state 656 - 462 static_operation: static_scalar_value "!= (T_IS_NOT_EQUAL)" . static_scalar_value + 464 static_operation: static_scalar_value "!= (T_IS_NOT_EQUAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 774 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 778 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 653 +state 657 - 461 static_operation: static_scalar_value "== (T_IS_EQUAL)" . static_scalar_value + 463 static_operation: static_scalar_value "== (T_IS_EQUAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 775 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 779 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 654 +state 658 - 463 static_operation: static_scalar_value '<' . static_scalar_value + 465 static_operation: static_scalar_value '<' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 776 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 780 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 655 +state 659 - 464 static_operation: static_scalar_value '>' . static_scalar_value + 466 static_operation: static_scalar_value '>' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 777 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 781 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 656 +state 660 - 466 static_operation: static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" . static_scalar_value + 468 static_operation: static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 778 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 782 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 657 +state 661 - 465 static_operation: static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" . static_scalar_value + 467 static_operation: static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 779 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 783 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 658 +state 662 - 452 static_operation: static_scalar_value ">> (T_SR)" . static_scalar_value + 454 static_operation: static_scalar_value ">> (T_SR)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 780 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 784 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 659 +state 663 - 451 static_operation: static_scalar_value "<< (T_SL)" . static_scalar_value + 453 static_operation: static_scalar_value "<< (T_SL)" . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 781 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 785 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 660 +state 664 - 441 static_operation: static_scalar_value '+' . static_scalar_value + 443 static_operation: static_scalar_value '+' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 782 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 786 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 661 +state 665 - 442 static_operation: static_scalar_value '-' . static_scalar_value + 444 static_operation: static_scalar_value '-' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 783 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 787 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 662 +state 666 - 453 static_operation: static_scalar_value '.' . static_scalar_value + 455 static_operation: static_scalar_value '.' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 784 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 788 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 663 +state 667 - 443 static_operation: static_scalar_value '*' . static_scalar_value + 445 static_operation: static_scalar_value '*' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 785 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 789 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 664 +state 668 - 444 static_operation: static_scalar_value '/' . static_scalar_value + 446 static_operation: static_scalar_value '/' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 786 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 790 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 665 +state 669 - 445 static_operation: static_scalar_value '%' . static_scalar_value + 447 static_operation: static_scalar_value '%' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 787 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 791 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 666 +state 670 93 unticked_statement: "try (T_TRY)" $@22 '{' inner_statement_list '}' . catch_statement $@23 finally_statement - "catch (T_CATCH)" shift, and go to state 788 + "catch (T_CATCH)" shift, and go to state 792 $default reduce using rule 96 (catch_statement) - catch_statement go to state 789 + catch_statement go to state 793 -state 667 +state 671 31 use_function_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 790 + "identifier (T_STRING)" shift, and go to state 794 -state 668 +state 672 29 use_function_declaration: namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 29 (use_function_declaration) -state 669 +state 673 26 use_function_declarations: use_function_declarations ',' use_function_declaration . $default reduce using rule 26 (use_function_declarations) -state 670 +state 674 37 use_const_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 791 + "identifier (T_STRING)" shift, and go to state 795 -state 671 +state 675 35 use_const_declaration: namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 35 (use_const_declaration) -state 672 +state 676 32 use_const_declarations: use_const_declarations ',' use_const_declaration . $default reduce using rule 32 (use_const_declarations) -state 673 +state 677 25 use_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 25 (use_declaration) -state 674 +state 678 202 global_var: '$' '{' expr '}' . $default reduce using rule 202 (global_var) -state 675 +state 679 204 static_var_list: static_var_list ',' "variable (T_VARIABLE)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 792 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 796 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 676 +state 680 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' . parameter_list ')' lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' . parameter_list ')' lexical_vars '{' inner_statement_list '}' "identifier (T_STRING)" shift, and go to state 123 - "array (T_ARRAY)" shift, and go to state 708 - "callable (T_CALLABLE)" shift, and go to state 709 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "array (T_ARRAY)" shift, and go to state 712 + "callable (T_CALLABLE)" shift, and go to state 713 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 ')' reduce using rule 178 (parameter_list) $default reduce using rule 183 (optional_class_type) - namespace_name go to state 576 - parameter_list go to state 793 - non_empty_parameter_list go to state 711 - parameter go to state 712 - optional_class_type go to state 713 - fully_qualified_class_name go to state 714 + namespace_name go to state 580 + parameter_list go to state 797 + non_empty_parameter_list go to state 715 + parameter go to state 716 + optional_class_type go to state 717 + fully_qualified_class_name go to state 718 -state 677 +state 681 113 unset_variables: unset_variables ',' unset_variable . $default reduce using rule 113 (unset_variables) -state 678 +state 682 81 unticked_statement: "unset (T_UNSET)" '(' unset_variables ')' ';' . $default reduce using rule 81 (unticked_statement) -state 679 +state 683 - 583 isset_variables: isset_variables ',' $@76 . isset_variable + 585 isset_variables: isset_variables ',' $@76 . isset_variable "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -20493,7 +20942,7 @@ state 679 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 372 + expr_without_variable go to state 374 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -20505,7 +20954,7 @@ state 679 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 373 + variable go to state 375 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -20516,38 +20965,38 @@ state 679 compound_variable go to state 117 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 - isset_variable go to state 794 + isset_variable go to state 798 class_constant go to state 120 class_name_scalar go to state 121 -state 680 +state 684 - 547 assignment_list_element: "list (T_LIST)" '(' . $@74 assignment_list ')' + 549 assignment_list_element: "list (T_LIST)" '(' . $@74 assignment_list ')' - $default reduce using rule 546 ($@74) + $default reduce using rule 548 ($@74) - $@74 go to state 795 + $@74 go to state 799 -state 681 +state 685 - 543 assignment_list: assignment_list ',' . assignment_list_element + 545 assignment_list: assignment_list ',' . assignment_list_element "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 545 + "list (T_LIST)" shift, and go to state 549 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 - $default reduce using rule 548 (assignment_list_element) + $default reduce using rule 550 (assignment_list_element) namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 546 + variable go to state 550 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -20557,74 +21006,75 @@ state 681 reference_variable go to state 116 compound_variable go to state 117 simple_indirect_reference go to state 118 - assignment_list_element go to state 796 + assignment_list_element go to state 800 -state 682 +state 686 277 expr_without_variable: "list (T_LIST)" '(' $@45 assignment_list ')' . '=' expr - '=' shift, and go to state 797 + '=' shift, and go to state 801 -state 683 +state 687 - 570 encaps_var_offset: "identifier (T_STRING)" . + 572 encaps_var_offset: "identifier (T_STRING)" . - $default reduce using rule 570 (encaps_var_offset) + $default reduce using rule 572 (encaps_var_offset) -state 684 +state 688 - 572 encaps_var_offset: "variable (T_VARIABLE)" . + 574 encaps_var_offset: "variable (T_VARIABLE)" . - $default reduce using rule 572 (encaps_var_offset) + $default reduce using rule 574 (encaps_var_offset) -state 685 +state 689 - 571 encaps_var_offset: "number (T_NUM_STRING)" . + 573 encaps_var_offset: "number (T_NUM_STRING)" . - $default reduce using rule 571 (encaps_var_offset) + $default reduce using rule 573 (encaps_var_offset) -state 686 +state 690 - 565 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset . ']' + 567 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset . ']' - ']' shift, and go to state 798 + ']' shift, and go to state 802 -state 687 +state 691 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 568 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr . ']' '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 570 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr . ']' '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -20652,99 +21102,101 @@ state 687 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ']' shift, and go to state 799 + "** (T_POW)" shift, and go to state 280 + ']' shift, and go to state 803 -state 688 +state 692 - 380 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list . + 382 function_call: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name @59 function_call_parameter_list . - $default reduce using rule 380 (function_call) + $default reduce using rule 382 (function_call) -state 689 +state 693 15 top_statement: "namespace (T_NAMESPACE)" '{' $@3 top_statement_list '}' . $default reduce using rule 15 (top_statement) -state 690 +state 694 3 top_statement_list: top_statement_list . $@1 top_statement 13 top_statement: "namespace (T_NAMESPACE)" namespace_name '{' $@2 top_statement_list . '}' - '}' shift, and go to state 800 + '}' shift, and go to state 804 $default reduce using rule 2 ($@1) $@1 go to state 4 -state 691 +state 695 - 334 expr_without_variable: '(' new_expr ')' @51 instance_call . + 336 expr_without_variable: '(' new_expr ')' @51 instance_call . - $default reduce using rule 334 (expr_without_variable) + $default reduce using rule 336 (expr_without_variable) -state 692 +state 696 273 instance_call: $@43 . chaining_instance_call - '[' shift, and go to state 801 - "-> (T_OBJECT_OPERATOR)" shift, and go to state 802 + '[' shift, and go to state 805 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 806 - chaining_method_or_property go to state 803 - chaining_dereference go to state 804 - chaining_instance_call go to state 805 - variable_property go to state 806 + chaining_method_or_property go to state 807 + chaining_dereference go to state 808 + chaining_instance_call go to state 809 + variable_property go to state 810 -state 693 +state 697 46 inner_statement: "__halt_compiler (T_HALT_COMPILER)" '(' . ')' ';' - ')' shift, and go to state 807 + ')' shift, and go to state 811 -state 694 +state 698 192 non_empty_function_call_parameter_list: '&' w_variable . $default reduce using rule 192 (non_empty_function_call_parameter_list) -state 695 +state 699 193 non_empty_function_call_parameter_list: "... (T_ELLIPSIS)" expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -20772,11 +21224,12 @@ state 695 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 193 (non_empty_function_call_parameter_list) -state 696 +state 700 194 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' . expr_without_variable 195 | non_empty_function_call_parameter_list ',' . variable @@ -20790,7 +21243,7 @@ state 696 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 122 - '&' shift, and go to state 808 + '&' shift, and go to state 812 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -20832,7 +21285,7 @@ state 696 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 "\\ (T_NS_SEPARATOR)" shift, and go to state 77 - "... (T_ELLIPSIS)" shift, and go to state 809 + "... (T_ELLIPSIS)" shift, and go to state 813 '(' shift, and go to state 78 '$' shift, and go to state 81 '`' shift, and go to state 82 @@ -20840,7 +21293,7 @@ state 696 namespace_name go to state 84 new_expr go to state 95 - expr_without_variable go to state 810 + expr_without_variable go to state 814 combined_scalar_offset go to state 98 combined_scalar go to state 99 function go to state 126 @@ -20852,7 +21305,7 @@ state 696 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 - variable go to state 811 + variable go to state 815 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 112 @@ -20867,152 +21320,152 @@ state 696 class_name_scalar go to state 121 -state 697 +state 701 188 function_call_parameter_list: '(' non_empty_function_call_parameter_list ')' . $default reduce using rule 188 (function_call_parameter_list) -state 698 +state 702 189 function_call_parameter_list: '(' yield_expr ')' . $default reduce using rule 189 (function_call_parameter_list) -state 699 +state 703 38 constant_declaration: constant_declaration ',' "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 38 (constant_declaration) -state 700 +state 704 - 398 fully_qualified_class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name + 400 fully_qualified_class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" . namespace_name "identifier (T_STRING)" shift, and go to state 123 - namespace_name go to state 812 + namespace_name go to state 816 -state 701 +state 705 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 399 fully_qualified_class_name: "\\ (T_NS_SEPARATOR)" namespace_name . + 401 fully_qualified_class_name: "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 399 (fully_qualified_class_name) + $default reduce using rule 401 (fully_qualified_class_name) -state 702 +state 706 137 implements_list: "implements (T_IMPLEMENTS)" . interface_list "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - interface_list go to state 813 - fully_qualified_class_name go to state 705 + namespace_name go to state 580 + interface_list go to state 817 + fully_qualified_class_name go to state 709 -state 703 +state 707 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from $@32 implements_list . '{' class_statement_list '}' - '{' shift, and go to state 814 + '{' shift, and go to state 818 -state 704 +state 708 135 interface_extends_list: "extends (T_EXTENDS)" interface_list . 139 interface_list: interface_list . ',' fully_qualified_class_name - ',' shift, and go to state 815 + ',' shift, and go to state 819 $default reduce using rule 135 (interface_extends_list) -state 705 +state 709 138 interface_list: fully_qualified_class_name . $default reduce using rule 138 (interface_list) -state 706 +state 710 126 unticked_class_declaration_statement: interface_entry "identifier (T_STRING)" $@33 interface_extends_list '{' . class_statement_list '}' $default reduce using rule 208 (class_statement_list) - class_statement_list go to state 816 + class_statement_list go to state 820 -state 707 +state 711 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' . parameter_list ')' '{' inner_statement_list '}' "identifier (T_STRING)" shift, and go to state 123 - "array (T_ARRAY)" shift, and go to state 708 - "callable (T_CALLABLE)" shift, and go to state 709 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "array (T_ARRAY)" shift, and go to state 712 + "callable (T_CALLABLE)" shift, and go to state 713 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 ')' reduce using rule 178 (parameter_list) $default reduce using rule 183 (optional_class_type) - namespace_name go to state 576 - parameter_list go to state 817 - non_empty_parameter_list go to state 711 - parameter go to state 712 - optional_class_type go to state 713 - fully_qualified_class_name go to state 714 + namespace_name go to state 580 + parameter_list go to state 821 + non_empty_parameter_list go to state 715 + parameter go to state 716 + optional_class_type go to state 717 + fully_qualified_class_name go to state 718 -state 708 +state 712 184 optional_class_type: "array (T_ARRAY)" . $default reduce using rule 184 (optional_class_type) -state 709 +state 713 185 optional_class_type: "callable (T_CALLABLE)" . $default reduce using rule 185 (optional_class_type) -state 710 +state 714 - 358 expr_without_variable: function is_reference @56 '(' parameter_list . ')' lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 '(' parameter_list . ')' lexical_vars '{' inner_statement_list '}' - ')' shift, and go to state 818 + ')' shift, and go to state 822 -state 711 +state 715 177 parameter_list: non_empty_parameter_list . 180 non_empty_parameter_list: non_empty_parameter_list . ',' parameter - ',' shift, and go to state 819 + ',' shift, and go to state 823 $default reduce using rule 177 (parameter_list) -state 712 +state 716 179 non_empty_parameter_list: parameter . $default reduce using rule 179 (non_empty_parameter_list) -state 713 +state 717 181 parameter: optional_class_type . is_reference is_variadic "variable (T_VARIABLE)" 182 | optional_class_type . is_reference is_variadic "variable (T_VARIABLE)" '=' static_scalar @@ -21021,74 +21474,75 @@ state 713 $default reduce using rule 117 (is_reference) - is_reference go to state 820 + is_reference go to state 824 -state 714 +state 718 186 optional_class_type: fully_qualified_class_name . $default reduce using rule 186 (optional_class_type) -state 715 +state 719 - 519 array_function_dereference: function_call $@72 '[' dim_offset ']' . + 521 array_function_dereference: function_call $@72 '[' dim_offset ']' . - $default reduce using rule 519 (array_function_dereference) + $default reduce using rule 521 (array_function_dereference) -state 716 +state 720 - 540 variable_name: '{' expr '}' . + 542 variable_name: '{' expr '}' . - $default reduce using rule 540 (variable_name) + $default reduce using rule 542 (variable_name) -state 717 +state 721 - 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list . + 388 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@62 function_call_parameter_list . - $default reduce using rule 386 (function_call) + $default reduce using rule 388 (function_call) -state 718 +state 722 - 384 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list . + 386 function_call: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name @61 function_call_parameter_list . - $default reduce using rule 384 (function_call) + $default reduce using rule 386 (function_call) -state 719 +state 723 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 339 | expr '?' ':' $@54 expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 341 | expr '?' ':' $@54 expr . "|| (T_BOOLEAN_OR)" shift, and go to state 258 "&& (T_BOOLEAN_AND)" shift, and go to state 259 @@ -21112,65 +21566,66 @@ state 719 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 339 (expr_without_variable) + $default reduce using rule 341 (expr_without_variable) -state 720 +state 724 - 337 expr_without_variable: expr '?' $@52 expr ':' . $@53 expr + 339 expr_without_variable: expr '?' $@52 expr ':' . $@53 expr - $default reduce using rule 336 ($@53) + $default reduce using rule 338 ($@53) - $@53 go to state 821 + $@53 go to state 825 -state 721 +state 725 281 expr_without_variable: variable '=' '&' "new (T_NEW)" class_name_reference . $@46 ctor_arguments $default reduce using rule 280 ($@46) - $@46 go to state 822 + $@46 go to state 826 -state 722 +state 726 - 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list . + 392 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_without_objects $@64 function_call_parameter_list . - $default reduce using rule 390 (function_call) + $default reduce using rule 392 (function_call) -state 723 +state 727 - 388 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list . + 390 function_call: variable_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" variable_name $@63 function_call_parameter_list . - $default reduce using rule 388 (function_call) + $default reduce using rule 390 (function_call) -state 724 +state 728 - 535 object_property: variable_without_objects $@73 . + 537 object_property: variable_without_objects $@73 . - $default reduce using rule 535 (object_property) + $default reduce using rule 537 (object_property) -state 725 +state 729 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 . method_or_not variable_properties + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 . method_or_not variable_properties - '(' reduce using rule 507 (@71) - $default reduce using rule 511 (method_or_not) + '(' reduce using rule 509 (@71) + $default reduce using rule 513 (method_or_not) - array_method_dereference go to state 823 - method go to state 824 - @71 go to state 825 - method_or_not go to state 826 + array_method_dereference go to state 827 + method go to state 828 + @71 go to state 829 + method_or_not go to state 830 -state 726 +state 730 - 536 object_dim_list: object_dim_list '[' . dim_offset ']' + 538 object_dim_list: object_dim_list '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -21225,7 +21680,7 @@ state 726 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -21237,7 +21692,7 @@ state 726 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -21250,16 +21705,16 @@ state 726 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 827 + dim_offset go to state 831 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 727 +state 731 - 537 object_dim_list: object_dim_list '{' . expr '}' + 539 object_dim_list: object_dim_list '{' . expr '}' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -21324,7 +21779,7 @@ state 727 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 828 + expr go to state 832 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -21343,9 +21798,9 @@ state 727 class_name_scalar go to state 121 -state 728 +state 732 - 555 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' . w_variable + 557 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' . w_variable "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 @@ -21357,8 +21812,8 @@ state 728 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 829 - variable go to state 312 + w_variable go to state 833 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -21370,36 +21825,37 @@ state 728 simple_indirect_reference go to state 118 -state 729 +state 733 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 551 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" expr . + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 553 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" expr . "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -21427,99 +21883,101 @@ state 729 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 551 (non_empty_array_pair_list) + $default reduce using rule 553 (non_empty_array_pair_list) -state 730 +state 734 - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 . dynamic_class_name_variable_properties + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 . dynamic_class_name_variable_properties - $default reduce using rule 407 (dynamic_class_name_variable_properties) + $default reduce using rule 409 (dynamic_class_name_variable_properties) - dynamic_class_name_variable_properties go to state 830 + dynamic_class_name_variable_properties go to state 834 -state 731 +state 735 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list $@8 . new_elseif_list new_else_single "endif (T_ENDIF)" ';' $default reduce using rule 170 (new_elseif_list) - new_elseif_list go to state 831 + new_elseif_list go to state 835 -state 732 +state 736 52 unticked_statement: "if (T_IF)" parenthesis_expr $@5 statement $@6 elseif_list . else_single 169 elseif_list: elseif_list . "elseif (T_ELSEIF)" parenthesis_expr $@37 statement - "elseif (T_ELSEIF)" shift, and go to state 832 - "else (T_ELSE)" shift, and go to state 833 + "elseif (T_ELSEIF)" shift, and go to state 836 + "else (T_ELSE)" shift, and go to state 837 "elseif (T_ELSEIF)" [reduce using rule 173 (else_single)] "else (T_ELSE)" [reduce using rule 173 (else_single)] $default reduce using rule 173 (else_single) - else_single go to state 834 + else_single go to state 838 -state 733 +state 737 61 unticked_statement: "do (T_DO)" $@11 statement "while (T_WHILE)" $@12 parenthesis_expr . ';' - ';' shift, and go to state 835 + ';' shift, and go to state 839 -state 734 +state 738 41 inner_statement_list: inner_statement_list . $@4 inner_statement 166 while_statement: ':' inner_statement_list . "endwhile (T_ENDWHILE)" ';' - "endwhile (T_ENDWHILE)" shift, and go to state 836 + "endwhile (T_ENDWHILE)" shift, and go to state 840 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 735 +state 739 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr . ';' $@14 for_expr ')' $@15 for_statement - ';' shift, and go to state 837 + ';' shift, and go to state 841 -state 736 +state 740 261 non_empty_for_expr: non_empty_for_expr ',' $@41 expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -21547,11 +22005,12 @@ state 736 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 261 (non_empty_for_expr) -state 737 +state 741 143 foreach_variable: '&' . variable @@ -21565,7 +22024,7 @@ state 737 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 838 + variable go to state 842 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -21577,98 +22036,98 @@ state 737 simple_indirect_reference go to state 118 -state 738 +state 742 145 foreach_variable: "list (T_LIST)" . '(' $@34 assignment_list ')' - '(' shift, and go to state 839 + '(' shift, and go to state 843 -state 739 +state 743 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 foreach_variable . foreach_optional_arg ')' $@20 foreach_statement - "=> (T_DOUBLE_ARROW)" shift, and go to state 840 + "=> (T_DOUBLE_ARROW)" shift, and go to state 844 $default reduce using rule 140 (foreach_optional_arg) - foreach_optional_arg go to state 841 + foreach_optional_arg go to state 845 -state 740 +state 744 142 foreach_variable: variable . $default reduce using rule 142 (foreach_variable) -state 741 +state 745 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 foreach_variable . foreach_optional_arg ')' $@18 foreach_statement - "=> (T_DOUBLE_ARROW)" shift, and go to state 840 + "=> (T_DOUBLE_ARROW)" shift, and go to state 844 $default reduce using rule 140 (foreach_optional_arg) - foreach_optional_arg go to state 842 + foreach_optional_arg go to state 846 -state 742 +state 746 152 declare_list: "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 152 (declare_list) -state 743 +state 747 153 declare_list: declare_list ',' "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 843 + '=' shift, and go to state 847 -state 744 +state 748 151 declare_statement: ':' . inner_statement_list "enddeclare (T_ENDDECLARE)" ';' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 844 + inner_statement_list go to state 848 -state 745 +state 749 150 declare_statement: statement . $default reduce using rule 150 (declare_statement) -state 746 +state 750 89 unticked_statement: "declare (T_DECLARE)" $@21 '(' declare_list ')' declare_statement . $default reduce using rule 89 (unticked_statement) -state 747 +state 751 157 switch_case_list: ':' ';' case_list . "endswitch (T_ENDSWITCH)" ';' 160 case_list: case_list . "case (T_CASE)" expr case_separator $@35 inner_statement_list 162 | case_list . "default (T_DEFAULT)" case_separator $@36 inner_statement_list - "endswitch (T_ENDSWITCH)" shift, and go to state 845 - "case (T_CASE)" shift, and go to state 749 - "default (T_DEFAULT)" shift, and go to state 750 + "endswitch (T_ENDSWITCH)" shift, and go to state 849 + "case (T_CASE)" shift, and go to state 753 + "default (T_DEFAULT)" shift, and go to state 754 -state 748 +state 752 156 switch_case_list: ':' case_list "endswitch (T_ENDSWITCH)" . ';' - ';' shift, and go to state 846 + ';' shift, and go to state 850 -state 749 +state 753 160 case_list: case_list "case (T_CASE)" . expr case_separator $@35 inner_statement_list @@ -21735,7 +22194,7 @@ state 749 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 847 + expr go to state 851 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -21754,1443 +22213,1443 @@ state 749 class_name_scalar go to state 121 -state 750 +state 754 162 case_list: case_list "default (T_DEFAULT)" . case_separator $@36 inner_statement_list - ':' shift, and go to state 848 - ';' shift, and go to state 849 + ':' shift, and go to state 852 + ';' shift, and go to state 853 - case_separator go to state 850 + case_separator go to state 854 -state 751 +state 755 155 switch_case_list: '{' ';' case_list . '}' 160 case_list: case_list . "case (T_CASE)" expr case_separator $@35 inner_statement_list 162 | case_list . "default (T_DEFAULT)" case_separator $@36 inner_statement_list - "case (T_CASE)" shift, and go to state 749 - "default (T_DEFAULT)" shift, and go to state 750 - '}' shift, and go to state 851 + "case (T_CASE)" shift, and go to state 753 + "default (T_DEFAULT)" shift, and go to state 754 + '}' shift, and go to state 855 -state 752 +state 756 154 switch_case_list: '{' case_list '}' . $default reduce using rule 154 (switch_case_list) -state 753 +state 757 - 488 non_empty_static_array_pair_list: static_scalar "=> (T_DOUBLE_ARROW)" . static_scalar + 490 non_empty_static_array_pair_list: static_scalar "=> (T_DOUBLE_ARROW)" . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 852 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 856 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 754 +state 758 - 432 static_scalar: '[' static_array_pair_list ']' . + 434 static_scalar: '[' static_array_pair_list ']' . - $default reduce using rule 432 (static_scalar) + $default reduce using rule 434 (static_scalar) -state 755 +state 759 - 485 possible_comma: ',' . - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' . static_scalar "=> (T_DOUBLE_ARROW)" static_scalar - 487 | non_empty_static_array_pair_list ',' . static_scalar + 487 possible_comma: ',' . + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' . static_scalar "=> (T_DOUBLE_ARROW)" static_scalar + 489 | non_empty_static_array_pair_list ',' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - $default reduce using rule 485 (possible_comma) + $default reduce using rule 487 (possible_comma) - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 853 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 857 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 756 +state 760 - 483 static_array_pair_list: non_empty_static_array_pair_list possible_comma . + 485 static_array_pair_list: non_empty_static_array_pair_list possible_comma . - $default reduce using rule 483 (static_array_pair_list) + $default reduce using rule 485 (static_array_pair_list) -state 757 +state 761 - 431 static_scalar: "array (T_ARRAY)" '(' static_array_pair_list . ')' + 433 static_scalar: "array (T_ARRAY)" '(' static_array_pair_list . ')' - ')' shift, and go to state 854 + ')' shift, and go to state 858 -state 758 +state 762 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 395 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . - 436 static_scalar_value: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 397 class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 438 static_scalar_value: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 395 (class_name) - $default reduce using rule 436 (static_scalar_value) + ":: (T_PAAMAYIM_NEKUDOTAYIM)" reduce using rule 397 (class_name) + $default reduce using rule 438 (static_scalar_value) -state 759 +state 763 - 471 static_operation: '(' static_scalar_value ')' . + 473 static_operation: '(' static_scalar_value ')' . - $default reduce using rule 471 (static_operation) + $default reduce using rule 473 (static_operation) -state 760 +state 764 - 429 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . + 431 static_class_constant: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . - $default reduce using rule 429 (static_class_constant) + $default reduce using rule 431 (static_class_constant) -state 761 +state 765 - 588 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" . + 590 static_class_name_scalar: class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "class (T_CLASS)" . - $default reduce using rule 588 (static_class_name_scalar) + $default reduce using rule 590 (static_class_name_scalar) -state 762 +state 766 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 456 | static_scalar_value "or (T_LOGICAL_OR)" static_scalar_value . - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "xor (T_LOGICAL_XOR)" shift, and go to state 642 - "and (T_LOGICAL_AND)" shift, and go to state 643 - '?' shift, and go to state 644 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 458 | static_scalar_value "or (T_LOGICAL_OR)" static_scalar_value . + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "xor (T_LOGICAL_XOR)" shift, and go to state 646 + "and (T_LOGICAL_AND)" shift, and go to state 647 + '?' shift, and go to state 648 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 456 (static_operation) + $default reduce using rule 458 (static_operation) -state 763 +state 767 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 454 | static_scalar_value "xor (T_LOGICAL_XOR)" static_scalar_value . - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "and (T_LOGICAL_AND)" shift, and go to state 643 - '?' shift, and go to state 644 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 456 | static_scalar_value "xor (T_LOGICAL_XOR)" static_scalar_value . + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "and (T_LOGICAL_AND)" shift, and go to state 647 + '?' shift, and go to state 648 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 454 (static_operation) + $default reduce using rule 456 (static_operation) -state 764 +state 768 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 455 | static_scalar_value "and (T_LOGICAL_AND)" static_scalar_value . - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '?' shift, and go to state 644 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 457 | static_scalar_value "and (T_LOGICAL_AND)" static_scalar_value . + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '?' shift, and go to state 648 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 455 (static_operation) + $default reduce using rule 457 (static_operation) -state 765 +state 769 - 467 static_operation: static_scalar_value '?' ':' . static_scalar_value + 469 static_operation: static_scalar_value '?' ':' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 855 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 859 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 766 +state 770 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - 468 | static_scalar_value '?' static_scalar_value . ':' static_scalar_value - - "or (T_LOGICAL_OR)" shift, and go to state 641 - "xor (T_LOGICAL_XOR)" shift, and go to state 642 - "and (T_LOGICAL_AND)" shift, and go to state 643 - '?' shift, and go to state 644 - ':' shift, and go to state 856 - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 470 | static_scalar_value '?' static_scalar_value . ':' static_scalar_value + + "or (T_LOGICAL_OR)" shift, and go to state 645 + "xor (T_LOGICAL_XOR)" shift, and go to state 646 + "and (T_LOGICAL_AND)" shift, and go to state 647 + '?' shift, and go to state 648 + ':' shift, and go to state 860 + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 -state 767 +state 771 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 458 | static_scalar_value "|| (T_BOOLEAN_OR)" static_scalar_value . - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 460 | static_scalar_value "|| (T_BOOLEAN_OR)" static_scalar_value . + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 458 (static_operation) + $default reduce using rule 460 (static_operation) -state 768 +state 772 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 457 | static_scalar_value "&& (T_BOOLEAN_AND)" static_scalar_value . - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 459 | static_scalar_value "&& (T_BOOLEAN_AND)" static_scalar_value . + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 457 (static_operation) + $default reduce using rule 459 (static_operation) -state 769 +state 773 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 448 | static_scalar_value '|' static_scalar_value . - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 450 | static_scalar_value '|' static_scalar_value . + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 448 (static_operation) + $default reduce using rule 450 (static_operation) -state 770 +state 774 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 450 | static_scalar_value '^' static_scalar_value . - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 452 | static_scalar_value '^' static_scalar_value . + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 450 (static_operation) + $default reduce using rule 452 (static_operation) -state 771 +state 775 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 449 | static_scalar_value '&' static_scalar_value . - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 451 | static_scalar_value '&' static_scalar_value . + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 449 (static_operation) + $default reduce using rule 451 (static_operation) -state 772 +state 776 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 460 | static_scalar_value "!== (T_IS_NOT_IDENTICAL)" static_scalar_value . - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 462 | static_scalar_value "!== (T_IS_NOT_IDENTICAL)" static_scalar_value . + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 460 (static_operation) + $default reduce using rule 462 (static_operation) -state 773 +state 777 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 459 | static_scalar_value "=== (T_IS_IDENTICAL)" static_scalar_value . - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 461 | static_scalar_value "=== (T_IS_IDENTICAL)" static_scalar_value . + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 459 (static_operation) + $default reduce using rule 461 (static_operation) -state 774 +state 778 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 462 | static_scalar_value "!= (T_IS_NOT_EQUAL)" static_scalar_value . - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 464 | static_scalar_value "!= (T_IS_NOT_EQUAL)" static_scalar_value . + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 462 (static_operation) + $default reduce using rule 464 (static_operation) -state 775 +state 779 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 461 | static_scalar_value "== (T_IS_EQUAL)" static_scalar_value . - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 463 | static_scalar_value "== (T_IS_EQUAL)" static_scalar_value . + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 "!== (T_IS_NOT_IDENTICAL)" error (nonassociative) "=== (T_IS_IDENTICAL)" error (nonassociative) "!= (T_IS_NOT_EQUAL)" error (nonassociative) "== (T_IS_EQUAL)" error (nonassociative) - $default reduce using rule 461 (static_operation) + $default reduce using rule 463 (static_operation) -state 776 +state 780 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 463 | static_scalar_value '<' static_scalar_value . - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 465 | static_scalar_value '<' static_scalar_value . + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 463 (static_operation) + $default reduce using rule 465 (static_operation) -state 777 +state 781 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 464 | static_scalar_value '>' static_scalar_value . - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 466 | static_scalar_value '>' static_scalar_value . + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 464 (static_operation) + $default reduce using rule 466 (static_operation) -state 778 +state 782 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value . - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value . + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 466 (static_operation) + $default reduce using rule 468 (static_operation) -state 779 +state 783 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 465 | static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value . - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 467 | static_scalar_value "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value . + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 '<' error (nonassociative) '>' error (nonassociative) ">= (T_IS_GREATER_OR_EQUAL)" error (nonassociative) "<= (T_IS_SMALLER_OR_EQUAL)" error (nonassociative) - $default reduce using rule 465 (static_operation) + $default reduce using rule 467 (static_operation) -state 780 +state 784 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 452 | static_scalar_value ">> (T_SR)" static_scalar_value . - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 454 | static_scalar_value ">> (T_SR)" static_scalar_value . + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 452 (static_operation) + $default reduce using rule 454 (static_operation) -state 781 +state 785 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 451 | static_scalar_value "<< (T_SL)" static_scalar_value . - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 453 | static_scalar_value "<< (T_SL)" static_scalar_value . + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 451 (static_operation) + $default reduce using rule 453 (static_operation) -state 782 +state 786 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 441 | static_scalar_value '+' static_scalar_value . - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 - - $default reduce using rule 441 (static_operation) + 443 static_operation: static_scalar_value . '+' static_scalar_value + 443 | static_scalar_value '+' static_scalar_value . + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 + $default reduce using rule 443 (static_operation) -state 783 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 442 | static_scalar_value '-' static_scalar_value . - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 - - $default reduce using rule 442 (static_operation) +state 787 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 444 | static_scalar_value '-' static_scalar_value . + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 -state 784 + $default reduce using rule 444 (static_operation) - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 453 | static_scalar_value '.' static_scalar_value . - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 - $default reduce using rule 453 (static_operation) +state 788 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 455 | static_scalar_value '.' static_scalar_value . + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 -state 785 + $default reduce using rule 455 (static_operation) - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 443 | static_scalar_value '*' static_scalar_value . - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - $default reduce using rule 443 (static_operation) +state 789 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 445 | static_scalar_value '*' static_scalar_value . + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value -state 786 + $default reduce using rule 445 (static_operation) - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 444 | static_scalar_value '/' static_scalar_value . - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - $default reduce using rule 444 (static_operation) +state 790 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 446 | static_scalar_value '/' static_scalar_value . + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value -state 787 + $default reduce using rule 446 (static_operation) - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 445 | static_scalar_value '%' static_scalar_value . - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - $default reduce using rule 445 (static_operation) +state 791 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 447 | static_scalar_value '%' static_scalar_value . + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value -state 788 + $default reduce using rule 447 (static_operation) + + +state 792 101 catch_statement: "catch (T_CATCH)" . '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches - '(' shift, and go to state 857 + '(' shift, and go to state 861 -state 789 +state 793 93 unticked_statement: "try (T_TRY)" $@22 '{' inner_statement_list '}' catch_statement . $@23 finally_statement $default reduce using rule 92 ($@23) - $@23 go to state 858 + $@23 go to state 862 -state 790 +state 794 31 use_function_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 31 (use_function_declaration) -state 791 +state 795 37 use_const_declaration: "\\ (T_NS_SEPARATOR)" namespace_name "as (T_AS)" "identifier (T_STRING)" . $default reduce using rule 37 (use_const_declaration) -state 792 +state 796 204 static_var_list: static_var_list ',' "variable (T_VARIABLE)" '=' static_scalar . $default reduce using rule 204 (static_var_list) -state 793 +state 797 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list . ')' lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list . ')' lexical_vars '{' inner_statement_list '}' - ')' shift, and go to state 859 + ')' shift, and go to state 863 -state 794 +state 798 - 583 isset_variables: isset_variables ',' $@76 isset_variable . + 585 isset_variables: isset_variables ',' $@76 isset_variable . - $default reduce using rule 583 (isset_variables) + $default reduce using rule 585 (isset_variables) -state 795 +state 799 - 547 assignment_list_element: "list (T_LIST)" '(' $@74 . assignment_list ')' + 549 assignment_list_element: "list (T_LIST)" '(' $@74 . assignment_list ')' "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 545 + "list (T_LIST)" shift, and go to state 549 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 - $default reduce using rule 548 (assignment_list_element) + $default reduce using rule 550 (assignment_list_element) namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 546 + variable go to state 550 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -23200,18 +23659,18 @@ state 795 reference_variable go to state 116 compound_variable go to state 117 simple_indirect_reference go to state 118 - assignment_list go to state 860 - assignment_list_element go to state 548 + assignment_list go to state 864 + assignment_list_element go to state 552 -state 796 +state 800 - 543 assignment_list: assignment_list ',' assignment_list_element . + 545 assignment_list: assignment_list ',' assignment_list_element . - $default reduce using rule 543 (assignment_list) + $default reduce using rule 545 (assignment_list) -state 797 +state 801 277 expr_without_variable: "list (T_LIST)" '(' $@45 assignment_list ')' '=' . expr @@ -23278,7 +23737,7 @@ state 797 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 861 + expr go to state 865 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -23297,28 +23756,28 @@ state 797 class_name_scalar go to state 121 -state 798 +state 802 - 565 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset ']' . + 567 encaps_var: "variable (T_VARIABLE)" '[' $@75 encaps_var_offset ']' . - $default reduce using rule 565 (encaps_var) + $default reduce using rule 567 (encaps_var) -state 799 +state 803 - 568 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' . '}' + 570 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' . '}' - '}' shift, and go to state 862 + '}' shift, and go to state 866 -state 800 +state 804 13 top_statement: "namespace (T_NAMESPACE)" namespace_name '{' $@2 top_statement_list '}' . $default reduce using rule 13 (top_statement) -state 801 +state 805 266 chaining_dereference: '[' . dim_offset ']' @@ -23375,7 +23834,7 @@ state 801 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -23387,7 +23846,7 @@ state 801 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -23400,79 +23859,79 @@ state 801 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 863 + dim_offset go to state 867 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 802 +state 806 - 504 variable_property: "-> (T_OBJECT_OPERATOR)" . object_property $@70 method_or_not + 506 variable_property: "-> (T_OBJECT_OPERATOR)" . object_property $@70 method_or_not - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 601 - reference_variable go to state 420 + variable_without_objects go to state 605 + reference_variable go to state 422 compound_variable go to state 117 - object_property go to state 864 - object_dim_list go to state 603 - variable_name go to state 604 - simple_indirect_reference go to state 422 + object_property go to state 868 + object_dim_list go to state 607 + variable_name go to state 608 + simple_indirect_reference go to state 424 -state 803 +state 807 263 chaining_method_or_property: chaining_method_or_property . variable_property 270 chaining_instance_call: chaining_method_or_property . - "-> (T_OBJECT_OPERATOR)" shift, and go to state 802 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 806 $default reduce using rule 270 (chaining_instance_call) - variable_property go to state 865 + variable_property go to state 869 -state 804 +state 808 265 chaining_dereference: chaining_dereference . '[' dim_offset ']' 268 chaining_instance_call: chaining_dereference . $@42 chaining_method_or_property 269 | chaining_dereference . - '[' shift, and go to state 866 + '[' shift, and go to state 870 "-> (T_OBJECT_OPERATOR)" reduce using rule 267 ($@42) $default reduce using rule 269 (chaining_instance_call) - $@42 go to state 867 + $@42 go to state 871 -state 805 +state 809 273 instance_call: $@43 chaining_instance_call . $default reduce using rule 273 (instance_call) -state 806 +state 810 264 chaining_method_or_property: variable_property . $default reduce using rule 264 (chaining_method_or_property) -state 807 +state 811 46 inner_statement: "__halt_compiler (T_HALT_COMPILER)" '(' ')' . ';' - ';' shift, and go to state 868 + ';' shift, and go to state 872 -state 808 +state 812 196 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' '&' . w_variable @@ -23486,8 +23945,8 @@ state 808 namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - w_variable go to state 869 - variable go to state 312 + w_variable go to state 873 + variable go to state 314 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -23499,7 +23958,7 @@ state 808 simple_indirect_reference go to state 118 -state 809 +state 813 197 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' "... (T_ELLIPSIS)" . expr @@ -23566,7 +24025,7 @@ state 809 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 870 + expr go to state 874 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -23585,17 +24044,17 @@ state 809 class_name_scalar go to state 121 -state 810 +state 814 194 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' expr_without_variable . - 491 expr: expr_without_variable . + 493 expr: expr_without_variable . ',' reduce using rule 194 (non_empty_function_call_parameter_list) ')' reduce using rule 194 (non_empty_function_call_parameter_list) - $default reduce using rule 491 (expr) + $default reduce using rule 493 (expr) -state 811 +state 815 195 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' variable . 278 expr_without_variable: variable . '=' expr @@ -23604,156 +24063,158 @@ state 811 283 | variable . "+= (T_PLUS_EQUAL)" expr 284 | variable . "-= (T_MINUS_EQUAL)" expr 285 | variable . "*= (T_MUL_EQUAL)" expr - 286 | variable . "/= (T_DIV_EQUAL)" expr - 287 | variable . ".= (T_CONCAT_EQUAL)" expr - 288 | variable . "%= (T_MOD_EQUAL)" expr - 289 | variable . "&= (T_AND_EQUAL)" expr - 290 | variable . "|= (T_OR_EQUAL)" expr - 291 | variable . "^= (T_XOR_EQUAL)" expr - 292 | variable . "<<= (T_SL_EQUAL)" expr - 293 | variable . ">>= (T_SR_EQUAL)" expr - 494 r_variable: variable . - 496 rw_variable: variable . - - '=' shift, and go to state 283 - ">>= (T_SR_EQUAL)" shift, and go to state 284 - "<<= (T_SL_EQUAL)" shift, and go to state 285 - "^= (T_XOR_EQUAL)" shift, and go to state 286 - "|= (T_OR_EQUAL)" shift, and go to state 287 - "&= (T_AND_EQUAL)" shift, and go to state 288 - "%= (T_MOD_EQUAL)" shift, and go to state 289 - ".= (T_CONCAT_EQUAL)" shift, and go to state 290 - "/= (T_DIV_EQUAL)" shift, and go to state 291 - "*= (T_MUL_EQUAL)" shift, and go to state 292 - "-= (T_MINUS_EQUAL)" shift, and go to state 293 - "+= (T_PLUS_EQUAL)" shift, and go to state 294 + 286 | variable . "**= (T_POW_EQUAL)" expr + 287 | variable . "/= (T_DIV_EQUAL)" expr + 288 | variable . ".= (T_CONCAT_EQUAL)" expr + 289 | variable . "%= (T_MOD_EQUAL)" expr + 290 | variable . "&= (T_AND_EQUAL)" expr + 291 | variable . "|= (T_OR_EQUAL)" expr + 292 | variable . "^= (T_XOR_EQUAL)" expr + 293 | variable . "<<= (T_SL_EQUAL)" expr + 294 | variable . ">>= (T_SR_EQUAL)" expr + 496 r_variable: variable . + 498 rw_variable: variable . + + '=' shift, and go to state 284 + "**= (T_POW_EQUAL)" shift, and go to state 285 + ">>= (T_SR_EQUAL)" shift, and go to state 286 + "<<= (T_SL_EQUAL)" shift, and go to state 287 + "^= (T_XOR_EQUAL)" shift, and go to state 288 + "|= (T_OR_EQUAL)" shift, and go to state 289 + "&= (T_AND_EQUAL)" shift, and go to state 290 + "%= (T_MOD_EQUAL)" shift, and go to state 291 + ".= (T_CONCAT_EQUAL)" shift, and go to state 292 + "/= (T_DIV_EQUAL)" shift, and go to state 293 + "*= (T_MUL_EQUAL)" shift, and go to state 294 + "-= (T_MINUS_EQUAL)" shift, and go to state 295 + "+= (T_PLUS_EQUAL)" shift, and go to state 296 ',' reduce using rule 195 (non_empty_function_call_parameter_list) - "-- (T_DEC)" reduce using rule 496 (rw_variable) - "++ (T_INC)" reduce using rule 496 (rw_variable) + "-- (T_DEC)" reduce using rule 498 (rw_variable) + "++ (T_INC)" reduce using rule 498 (rw_variable) ')' reduce using rule 195 (non_empty_function_call_parameter_list) - $default reduce using rule 494 (r_variable) + $default reduce using rule 496 (r_variable) -state 812 +state 816 6 namespace_name: namespace_name . "\\ (T_NS_SEPARATOR)" "identifier (T_STRING)" - 398 fully_qualified_class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . + 400 fully_qualified_class_name: "namespace (T_NAMESPACE)" "\\ (T_NS_SEPARATOR)" namespace_name . "\\ (T_NS_SEPARATOR)" shift, and go to state 241 - $default reduce using rule 398 (fully_qualified_class_name) + $default reduce using rule 400 (fully_qualified_class_name) -state 813 +state 817 137 implements_list: "implements (T_IMPLEMENTS)" interface_list . 139 interface_list: interface_list . ',' fully_qualified_class_name - ',' shift, and go to state 815 + ',' shift, and go to state 819 $default reduce using rule 137 (implements_list) -state 814 +state 818 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from $@32 implements_list '{' . class_statement_list '}' $default reduce using rule 208 (class_statement_list) - class_statement_list go to state 871 + class_statement_list go to state 875 -state 815 +state 819 139 interface_list: interface_list ',' . fully_qualified_class_name "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 872 + namespace_name go to state 580 + fully_qualified_class_name go to state 876 -state 816 +state 820 126 unticked_class_declaration_statement: interface_entry "identifier (T_STRING)" $@33 interface_extends_list '{' class_statement_list . '}' 207 class_statement_list: class_statement_list . class_statement - "const (T_CONST)" shift, and go to state 873 - "use (T_USE)" shift, and go to state 874 - "public (T_PUBLIC)" shift, and go to state 875 - "protected (T_PROTECTED)" shift, and go to state 876 - "private (T_PRIVATE)" shift, and go to state 877 - "final (T_FINAL)" shift, and go to state 878 - "abstract (T_ABSTRACT)" shift, and go to state 879 - "static (T_STATIC)" shift, and go to state 880 - "var (T_VAR)" shift, and go to state 881 - '}' shift, and go to state 882 + "const (T_CONST)" shift, and go to state 877 + "use (T_USE)" shift, and go to state 878 + "public (T_PUBLIC)" shift, and go to state 879 + "protected (T_PROTECTED)" shift, and go to state 880 + "private (T_PRIVATE)" shift, and go to state 881 + "final (T_FINAL)" shift, and go to state 882 + "abstract (T_ABSTRACT)" shift, and go to state 883 + "static (T_STATIC)" shift, and go to state 884 + "var (T_VAR)" shift, and go to state 885 + '}' shift, and go to state 886 $default reduce using rule 240 (method_modifiers) - class_statement go to state 883 - trait_use_statement go to state 884 - variable_modifiers go to state 885 - method_modifiers go to state 886 - non_empty_member_modifiers go to state 887 - member_modifier go to state 888 - class_constant_declaration go to state 889 + class_statement go to state 887 + trait_use_statement go to state 888 + variable_modifiers go to state 889 + method_modifiers go to state 890 + non_empty_member_modifiers go to state 891 + member_modifier go to state 892 + class_constant_declaration go to state 893 -state 817 +state 821 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' parameter_list . ')' '{' inner_statement_list '}' - ')' shift, and go to state 890 + ')' shift, and go to state 894 -state 818 +state 822 - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' . lexical_vars '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' . lexical_vars '{' inner_statement_list '}' - "use (T_USE)" shift, and go to state 891 + "use (T_USE)" shift, and go to state 895 - $default reduce using rule 371 (lexical_vars) + $default reduce using rule 373 (lexical_vars) - lexical_vars go to state 892 + lexical_vars go to state 896 -state 819 +state 823 180 non_empty_parameter_list: non_empty_parameter_list ',' . parameter "identifier (T_STRING)" shift, and go to state 123 - "array (T_ARRAY)" shift, and go to state 708 - "callable (T_CALLABLE)" shift, and go to state 709 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "array (T_ARRAY)" shift, and go to state 712 + "callable (T_CALLABLE)" shift, and go to state 713 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 $default reduce using rule 183 (optional_class_type) - namespace_name go to state 576 - parameter go to state 893 - optional_class_type go to state 713 - fully_qualified_class_name go to state 714 + namespace_name go to state 580 + parameter go to state 897 + optional_class_type go to state 717 + fully_qualified_class_name go to state 718 -state 820 +state 824 181 parameter: optional_class_type is_reference . is_variadic "variable (T_VARIABLE)" 182 | optional_class_type is_reference . is_variadic "variable (T_VARIABLE)" '=' static_scalar - "... (T_ELLIPSIS)" shift, and go to state 894 + "... (T_ELLIPSIS)" shift, and go to state 898 $default reduce using rule 119 (is_variadic) - is_variadic go to state 895 + is_variadic go to state 899 -state 821 +state 825 - 337 expr_without_variable: expr '?' $@52 expr ':' $@53 . expr + 339 expr_without_variable: expr '?' $@52 expr ':' $@53 . expr "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -23818,7 +24279,7 @@ state 821 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 896 + expr go to state 900 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -23837,93 +24298,94 @@ state 821 class_name_scalar go to state 121 -state 822 +state 826 281 expr_without_variable: variable '=' '&' "new (T_NEW)" class_name_reference $@46 . ctor_arguments - '(' shift, and go to state 405 + '(' shift, and go to state 407 - $default reduce using rule 415 (ctor_arguments) + $default reduce using rule 417 (ctor_arguments) - function_call_parameter_list go to state 482 - ctor_arguments go to state 897 + function_call_parameter_list go to state 486 + ctor_arguments go to state 901 -state 823 +state 827 - 505 array_method_dereference: array_method_dereference . '[' dim_offset ']' - 510 method_or_not: array_method_dereference . + 507 array_method_dereference: array_method_dereference . '[' dim_offset ']' + 512 method_or_not: array_method_dereference . - '[' shift, and go to state 898 + '[' shift, and go to state 902 - $default reduce using rule 510 (method_or_not) + $default reduce using rule 512 (method_or_not) -state 824 +state 828 - 506 array_method_dereference: method . '[' dim_offset ']' - 509 method_or_not: method . + 508 array_method_dereference: method . '[' dim_offset ']' + 511 method_or_not: method . - '[' shift, and go to state 899 + '[' shift, and go to state 903 - $default reduce using rule 509 (method_or_not) + $default reduce using rule 511 (method_or_not) -state 825 +state 829 - 508 method: @71 . function_call_parameter_list + 510 method: @71 . function_call_parameter_list - '(' shift, and go to state 405 + '(' shift, and go to state 407 - function_call_parameter_list go to state 900 + function_call_parameter_list go to state 904 -state 826 +state 830 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not . variable_properties + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not . variable_properties - $default reduce using rule 502 (variable_properties) + $default reduce using rule 504 (variable_properties) - variable_properties go to state 901 + variable_properties go to state 905 -state 827 +state 831 - 536 object_dim_list: object_dim_list '[' dim_offset . ']' + 538 object_dim_list: object_dim_list '[' dim_offset . ']' - ']' shift, and go to state 902 + ']' shift, and go to state 906 -state 828 +state 832 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr - 537 object_dim_list: object_dim_list '{' expr . '}' + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr + 539 object_dim_list: object_dim_list '{' expr . '}' "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -23951,51 +24413,52 @@ state 828 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - '}' shift, and go to state 903 + "** (T_POW)" shift, and go to state 280 + '}' shift, and go to state 907 -state 829 +state 833 - 555 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable . + 557 non_empty_array_pair_list: non_empty_array_pair_list ',' expr "=> (T_DOUBLE_ARROW)" '&' w_variable . - $default reduce using rule 555 (non_empty_array_pair_list) + $default reduce using rule 557 (non_empty_array_pair_list) -state 830 +state 834 - 404 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties . - 406 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties . dynamic_class_name_variable_property + 406 dynamic_class_name_reference: base_variable "-> (T_OBJECT_OPERATOR)" $@66 object_property $@67 dynamic_class_name_variable_properties . + 408 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties . dynamic_class_name_variable_property - "-> (T_OBJECT_OPERATOR)" shift, and go to state 904 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 908 - $default reduce using rule 404 (dynamic_class_name_reference) + $default reduce using rule 406 (dynamic_class_name_reference) - dynamic_class_name_variable_property go to state 905 + dynamic_class_name_variable_property go to state 909 -state 831 +state 835 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list $@8 new_elseif_list . new_else_single "endif (T_ENDIF)" ';' 172 new_elseif_list: new_elseif_list . "elseif (T_ELSEIF)" parenthesis_expr ':' $@38 inner_statement_list - "elseif (T_ELSEIF)" shift, and go to state 906 - "else (T_ELSE)" shift, and go to state 907 + "elseif (T_ELSEIF)" shift, and go to state 910 + "else (T_ELSE)" shift, and go to state 911 $default reduce using rule 175 (new_else_single) - new_else_single go to state 908 + new_else_single go to state 912 -state 832 +state 836 169 elseif_list: elseif_list "elseif (T_ELSEIF)" . parenthesis_expr $@37 statement '(' shift, and go to state 175 - parenthesis_expr go to state 909 + parenthesis_expr go to state 913 -state 833 +state 837 174 else_single: "else (T_ELSE)" . statement @@ -24072,7 +24535,7 @@ state 833 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 910 + statement go to state 914 unticked_statement go to state 88 new_expr go to state 95 expr_without_variable go to state 96 @@ -24103,70 +24566,70 @@ state 833 class_name_scalar go to state 121 -state 834 +state 838 52 unticked_statement: "if (T_IF)" parenthesis_expr $@5 statement $@6 elseif_list else_single . $default reduce using rule 52 (unticked_statement) -state 835 +state 839 61 unticked_statement: "do (T_DO)" $@11 statement "while (T_WHILE)" $@12 parenthesis_expr ';' . $default reduce using rule 61 (unticked_statement) -state 836 +state 840 166 while_statement: ':' inner_statement_list "endwhile (T_ENDWHILE)" . ';' - ';' shift, and go to state 911 + ';' shift, and go to state 915 -state 837 +state 841 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' . $@14 for_expr ')' $@15 for_statement $default reduce using rule 63 ($@14) - $@14 go to state 912 + $@14 go to state 916 -state 838 +state 842 143 foreach_variable: '&' variable . $default reduce using rule 143 (foreach_variable) -state 839 +state 843 145 foreach_variable: "list (T_LIST)" '(' . $@34 assignment_list ')' $default reduce using rule 144 ($@34) - $@34 go to state 913 + $@34 go to state 917 -state 840 +state 844 141 foreach_optional_arg: "=> (T_DOUBLE_ARROW)" . foreach_variable - '&' shift, and go to state 737 + '&' shift, and go to state 741 "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 738 + "list (T_LIST)" shift, and go to state 742 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 namespace_name go to state 151 - foreach_variable go to state 914 + foreach_variable go to state 918 function_call go to state 101 class_name go to state 152 - variable go to state 740 + variable go to state 744 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -24178,120 +24641,121 @@ state 840 simple_indirect_reference go to state 118 -state 841 +state 845 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 foreach_variable foreach_optional_arg . ')' $@20 foreach_statement - ')' shift, and go to state 915 + ')' shift, and go to state 919 -state 842 +state 846 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 foreach_variable foreach_optional_arg . ')' $@18 foreach_statement - ')' shift, and go to state 916 + ')' shift, and go to state 920 -state 843 +state 847 153 declare_list: declare_list ',' "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 917 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 921 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 844 +state 848 41 inner_statement_list: inner_statement_list . $@4 inner_statement 151 declare_statement: ':' inner_statement_list . "enddeclare (T_ENDDECLARE)" ';' - "enddeclare (T_ENDDECLARE)" shift, and go to state 918 + "enddeclare (T_ENDDECLARE)" shift, and go to state 922 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 845 +state 849 157 switch_case_list: ':' ';' case_list "endswitch (T_ENDSWITCH)" . ';' - ';' shift, and go to state 919 + ';' shift, and go to state 923 -state 846 +state 850 156 switch_case_list: ':' case_list "endswitch (T_ENDSWITCH)" ';' . $default reduce using rule 156 (switch_case_list) -state 847 +state 851 160 case_list: case_list "case (T_CASE)" expr . case_separator $@35 inner_statement_list - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 "and (T_LOGICAL_AND)" shift, and go to state 256 '?' shift, and go to state 257 - ':' shift, and go to state 848 + ':' shift, and go to state 852 "|| (T_BOOLEAN_OR)" shift, and go to state 258 "&& (T_BOOLEAN_AND)" shift, and go to state 259 '|' shift, and go to state 260 @@ -24314,225 +24778,227 @@ state 847 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 - ';' shift, and go to state 849 + "** (T_POW)" shift, and go to state 280 + ';' shift, and go to state 853 - case_separator go to state 920 + case_separator go to state 924 -state 848 +state 852 163 case_separator: ':' . $default reduce using rule 163 (case_separator) -state 849 +state 853 164 case_separator: ';' . $default reduce using rule 164 (case_separator) -state 850 +state 854 162 case_list: case_list "default (T_DEFAULT)" case_separator . $@36 inner_statement_list $default reduce using rule 161 ($@36) - $@36 go to state 921 + $@36 go to state 925 -state 851 +state 855 155 switch_case_list: '{' ';' case_list '}' . $default reduce using rule 155 (switch_case_list) -state 852 +state 856 - 488 non_empty_static_array_pair_list: static_scalar "=> (T_DOUBLE_ARROW)" static_scalar . + 490 non_empty_static_array_pair_list: static_scalar "=> (T_DOUBLE_ARROW)" static_scalar . - $default reduce using rule 488 (non_empty_static_array_pair_list) + $default reduce using rule 490 (non_empty_static_array_pair_list) -state 853 +state 857 - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar . "=> (T_DOUBLE_ARROW)" static_scalar - 487 | non_empty_static_array_pair_list ',' static_scalar . + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar . "=> (T_DOUBLE_ARROW)" static_scalar + 489 | non_empty_static_array_pair_list ',' static_scalar . - "=> (T_DOUBLE_ARROW)" shift, and go to state 922 + "=> (T_DOUBLE_ARROW)" shift, and go to state 926 - $default reduce using rule 487 (non_empty_static_array_pair_list) + $default reduce using rule 489 (non_empty_static_array_pair_list) -state 854 +state 858 - 431 static_scalar: "array (T_ARRAY)" '(' static_array_pair_list ')' . + 433 static_scalar: "array (T_ARRAY)" '(' static_array_pair_list ')' . - $default reduce using rule 431 (static_scalar) + $default reduce using rule 433 (static_scalar) -state 855 +state 859 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 467 | static_scalar_value '?' ':' static_scalar_value . - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 469 | static_scalar_value '?' ':' static_scalar_value . + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 467 (static_operation) + $default reduce using rule 469 (static_operation) -state 856 +state 860 - 468 static_operation: static_scalar_value '?' static_scalar_value ':' . static_scalar_value + 470 static_operation: static_scalar_value '?' static_scalar_value ':' . static_scalar_value - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar_value go to state 923 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar_value go to state 927 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 857 +state 861 101 catch_statement: "catch (T_CATCH)" '(' . $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches $default reduce using rule 97 ($@24) - $@24 go to state 924 + $@24 go to state 928 -state 858 +state 862 93 unticked_statement: "try (T_TRY)" $@22 '{' inner_statement_list '}' catch_statement $@23 . finally_statement - "finally (T_FINALLY)" shift, and go to state 925 + "finally (T_FINALLY)" shift, and go to state 929 $default reduce using rule 102 (finally_statement) - finally_statement go to state 926 + finally_statement go to state 930 -state 859 +state 863 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' . lexical_vars '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' . lexical_vars '{' inner_statement_list '}' - "use (T_USE)" shift, and go to state 891 + "use (T_USE)" shift, and go to state 895 - $default reduce using rule 371 (lexical_vars) + $default reduce using rule 373 (lexical_vars) - lexical_vars go to state 927 + lexical_vars go to state 931 -state 860 +state 864 - 543 assignment_list: assignment_list . ',' assignment_list_element - 547 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list . ')' + 545 assignment_list: assignment_list . ',' assignment_list_element + 549 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list . ')' - ',' shift, and go to state 681 - ')' shift, and go to state 928 + ',' shift, and go to state 685 + ')' shift, and go to state 932 -state 861 +state 865 277 expr_without_variable: "list (T_LIST)" '(' $@45 assignment_list ')' '=' expr . - 299 | expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 | expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr '?' shift, and go to state 257 "|| (T_BOOLEAN_OR)" shift, and go to state 258 @@ -24557,41 +25023,42 @@ state 861 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 277 (expr_without_variable) -state 862 +state 866 - 568 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' '}' . + 570 encaps_var: "${ (T_DOLLAR_OPEN_CURLY_BRACES)" "variable name (T_STRING_VARNAME)" '[' expr ']' '}' . - $default reduce using rule 568 (encaps_var) + $default reduce using rule 570 (encaps_var) -state 863 +state 867 266 chaining_dereference: '[' dim_offset . ']' - ']' shift, and go to state 929 + ']' shift, and go to state 933 -state 864 +state 868 - 504 variable_property: "-> (T_OBJECT_OPERATOR)" object_property . $@70 method_or_not + 506 variable_property: "-> (T_OBJECT_OPERATOR)" object_property . $@70 method_or_not - $default reduce using rule 503 ($@70) + $default reduce using rule 505 ($@70) - $@70 go to state 930 + $@70 go to state 934 -state 865 +state 869 263 chaining_method_or_property: chaining_method_or_property variable_property . $default reduce using rule 263 (chaining_method_or_property) -state 866 +state 870 265 chaining_dereference: chaining_dereference '[' . dim_offset ']' @@ -24648,7 +25115,7 @@ state 866 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -24660,7 +25127,7 @@ state 866 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -24673,67 +25140,68 @@ state 866 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 931 + dim_offset go to state 935 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 867 +state 871 268 chaining_instance_call: chaining_dereference $@42 . chaining_method_or_property - "-> (T_OBJECT_OPERATOR)" shift, and go to state 802 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 806 - chaining_method_or_property go to state 932 - variable_property go to state 806 + chaining_method_or_property go to state 936 + variable_property go to state 810 -state 868 +state 872 46 inner_statement: "__halt_compiler (T_HALT_COMPILER)" '(' ')' ';' . $default reduce using rule 46 (inner_statement) -state 869 +state 873 196 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' '&' w_variable . $default reduce using rule 196 (non_empty_function_call_parameter_list) -state 870 +state 874 197 non_empty_function_call_parameter_list: non_empty_function_call_parameter_list ',' "... (T_ELLIPSIS)" expr . - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 341 | expr . '?' ':' $@54 expr "or (T_LOGICAL_OR)" shift, and go to state 254 "xor (T_LOGICAL_XOR)" shift, and go to state 255 @@ -24761,260 +25229,262 @@ state 870 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 $default reduce using rule 197 (non_empty_function_call_parameter_list) -state 871 +state 875 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from $@32 implements_list '{' class_statement_list . '}' 207 class_statement_list: class_statement_list . class_statement - "const (T_CONST)" shift, and go to state 873 - "use (T_USE)" shift, and go to state 874 - "public (T_PUBLIC)" shift, and go to state 875 - "protected (T_PROTECTED)" shift, and go to state 876 - "private (T_PRIVATE)" shift, and go to state 877 - "final (T_FINAL)" shift, and go to state 878 - "abstract (T_ABSTRACT)" shift, and go to state 879 - "static (T_STATIC)" shift, and go to state 880 - "var (T_VAR)" shift, and go to state 881 - '}' shift, and go to state 933 + "const (T_CONST)" shift, and go to state 877 + "use (T_USE)" shift, and go to state 878 + "public (T_PUBLIC)" shift, and go to state 879 + "protected (T_PROTECTED)" shift, and go to state 880 + "private (T_PRIVATE)" shift, and go to state 881 + "final (T_FINAL)" shift, and go to state 882 + "abstract (T_ABSTRACT)" shift, and go to state 883 + "static (T_STATIC)" shift, and go to state 884 + "var (T_VAR)" shift, and go to state 885 + '}' shift, and go to state 937 $default reduce using rule 240 (method_modifiers) - class_statement go to state 883 - trait_use_statement go to state 884 - variable_modifiers go to state 885 - method_modifiers go to state 886 - non_empty_member_modifiers go to state 887 - member_modifier go to state 888 - class_constant_declaration go to state 889 + class_statement go to state 887 + trait_use_statement go to state 888 + variable_modifiers go to state 889 + method_modifiers go to state 890 + non_empty_member_modifiers go to state 891 + member_modifier go to state 892 + class_constant_declaration go to state 893 -state 872 +state 876 139 interface_list: interface_list ',' fully_qualified_class_name . $default reduce using rule 139 (interface_list) -state 873 +state 877 255 class_constant_declaration: "const (T_CONST)" . "identifier (T_STRING)" '=' static_scalar - "identifier (T_STRING)" shift, and go to state 934 + "identifier (T_STRING)" shift, and go to state 938 -state 874 +state 878 215 trait_use_statement: "use (T_USE)" . trait_list trait_adaptations "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - trait_list go to state 935 - fully_qualified_class_name go to state 936 + namespace_name go to state 580 + trait_list go to state 939 + fully_qualified_class_name go to state 940 -state 875 +state 879 244 member_modifier: "public (T_PUBLIC)" . $default reduce using rule 244 (member_modifier) -state 876 +state 880 245 member_modifier: "protected (T_PROTECTED)" . $default reduce using rule 245 (member_modifier) -state 877 +state 881 246 member_modifier: "private (T_PRIVATE)" . $default reduce using rule 246 (member_modifier) -state 878 +state 882 249 member_modifier: "final (T_FINAL)" . $default reduce using rule 249 (member_modifier) -state 879 +state 883 248 member_modifier: "abstract (T_ABSTRACT)" . $default reduce using rule 248 (member_modifier) -state 880 +state 884 247 member_modifier: "static (T_STATIC)" . $default reduce using rule 247 (member_modifier) -state 881 +state 885 239 variable_modifiers: "var (T_VAR)" . $default reduce using rule 239 (variable_modifiers) -state 882 +state 886 126 unticked_class_declaration_statement: interface_entry "identifier (T_STRING)" $@33 interface_extends_list '{' class_statement_list '}' . $default reduce using rule 126 (unticked_class_declaration_statement) -state 883 +state 887 207 class_statement_list: class_statement_list class_statement . $default reduce using rule 207 (class_statement_list) -state 884 +state 888 212 class_statement: trait_use_statement . $default reduce using rule 212 (class_statement) -state 885 +state 889 210 class_statement: variable_modifiers . $@39 class_variable_declaration ';' $default reduce using rule 209 ($@39) - $@39 go to state 937 + $@39 go to state 941 -state 886 +state 890 214 class_statement: method_modifiers . function is_reference "identifier (T_STRING)" $@40 '(' parameter_list ')' method_body "function (T_FUNCTION)" shift, and go to state 48 - function go to state 938 + function go to state 942 -state 887 +state 891 238 variable_modifiers: non_empty_member_modifiers . 241 method_modifiers: non_empty_member_modifiers . 243 non_empty_member_modifiers: non_empty_member_modifiers . member_modifier - "public (T_PUBLIC)" shift, and go to state 875 - "protected (T_PROTECTED)" shift, and go to state 876 - "private (T_PRIVATE)" shift, and go to state 877 - "final (T_FINAL)" shift, and go to state 878 - "abstract (T_ABSTRACT)" shift, and go to state 879 - "static (T_STATIC)" shift, and go to state 880 + "public (T_PUBLIC)" shift, and go to state 879 + "protected (T_PROTECTED)" shift, and go to state 880 + "private (T_PRIVATE)" shift, and go to state 881 + "final (T_FINAL)" shift, and go to state 882 + "abstract (T_ABSTRACT)" shift, and go to state 883 + "static (T_STATIC)" shift, and go to state 884 "function (T_FUNCTION)" reduce using rule 241 (method_modifiers) $default reduce using rule 238 (variable_modifiers) - member_modifier go to state 939 + member_modifier go to state 943 -state 888 +state 892 242 non_empty_member_modifiers: member_modifier . $default reduce using rule 242 (non_empty_member_modifiers) -state 889 +state 893 211 class_statement: class_constant_declaration . ';' 254 class_constant_declaration: class_constant_declaration . ',' "identifier (T_STRING)" '=' static_scalar - ',' shift, and go to state 940 - ';' shift, and go to state 941 + ',' shift, and go to state 944 + ';' shift, and go to state 945 -state 890 +state 894 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' parameter_list ')' . '{' inner_statement_list '}' - '{' shift, and go to state 942 + '{' shift, and go to state 946 -state 891 +state 895 - 372 lexical_vars: "use (T_USE)" . '(' lexical_var_list ')' + 374 lexical_vars: "use (T_USE)" . '(' lexical_var_list ')' - '(' shift, and go to state 943 + '(' shift, and go to state 947 -state 892 +state 896 - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars . '{' inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars . '{' inner_statement_list '}' - '{' shift, and go to state 944 + '{' shift, and go to state 948 -state 893 +state 897 180 non_empty_parameter_list: non_empty_parameter_list ',' parameter . $default reduce using rule 180 (non_empty_parameter_list) -state 894 +state 898 120 is_variadic: "... (T_ELLIPSIS)" . $default reduce using rule 120 (is_variadic) -state 895 +state 899 181 parameter: optional_class_type is_reference is_variadic . "variable (T_VARIABLE)" 182 | optional_class_type is_reference is_variadic . "variable (T_VARIABLE)" '=' static_scalar - "variable (T_VARIABLE)" shift, and go to state 945 + "variable (T_VARIABLE)" shift, and go to state 949 -state 896 +state 900 - 299 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr - 301 | expr . "&& (T_BOOLEAN_AND)" $@48 expr - 303 | expr . "or (T_LOGICAL_OR)" $@49 expr - 305 | expr . "and (T_LOGICAL_AND)" $@50 expr - 306 | expr . "xor (T_LOGICAL_XOR)" expr - 307 | expr . '|' expr - 308 | expr . '&' expr - 309 | expr . '^' expr - 310 | expr . '.' expr - 311 | expr . '+' expr - 312 | expr . '-' expr - 313 | expr . '*' expr - 314 | expr . '/' expr - 315 | expr . '%' expr - 316 | expr . "<< (T_SL)" expr - 317 | expr . ">> (T_SR)" expr - 322 | expr . "=== (T_IS_IDENTICAL)" expr - 323 | expr . "!== (T_IS_NOT_IDENTICAL)" expr - 324 | expr . "== (T_IS_EQUAL)" expr - 325 | expr . "!= (T_IS_NOT_EQUAL)" expr - 326 | expr . '<' expr - 327 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr - 328 | expr . '>' expr - 329 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr - 330 | expr . "instanceof (T_INSTANCEOF)" class_name_reference - 337 | expr . '?' $@52 expr ':' $@53 expr - 337 | expr '?' $@52 expr ':' $@53 expr . - 339 | expr . '?' ':' $@54 expr + 300 expr_without_variable: expr . "|| (T_BOOLEAN_OR)" $@47 expr + 302 | expr . "&& (T_BOOLEAN_AND)" $@48 expr + 304 | expr . "or (T_LOGICAL_OR)" $@49 expr + 306 | expr . "and (T_LOGICAL_AND)" $@50 expr + 307 | expr . "xor (T_LOGICAL_XOR)" expr + 308 | expr . '|' expr + 309 | expr . '&' expr + 310 | expr . '^' expr + 311 | expr . '.' expr + 312 | expr . '+' expr + 313 | expr . '-' expr + 314 | expr . '*' expr + 315 | expr . "** (T_POW)" expr + 316 | expr . '/' expr + 317 | expr . '%' expr + 318 | expr . "<< (T_SL)" expr + 319 | expr . ">> (T_SR)" expr + 324 | expr . "=== (T_IS_IDENTICAL)" expr + 325 | expr . "!== (T_IS_NOT_IDENTICAL)" expr + 326 | expr . "== (T_IS_EQUAL)" expr + 327 | expr . "!= (T_IS_NOT_EQUAL)" expr + 328 | expr . '<' expr + 329 | expr . "<= (T_IS_SMALLER_OR_EQUAL)" expr + 330 | expr . '>' expr + 331 | expr . ">= (T_IS_GREATER_OR_EQUAL)" expr + 332 | expr . "instanceof (T_INSTANCEOF)" class_name_reference + 339 | expr . '?' $@52 expr ':' $@53 expr + 339 | expr '?' $@52 expr ':' $@53 expr . + 341 | expr . '?' ':' $@54 expr "|| (T_BOOLEAN_OR)" shift, and go to state 258 "&& (T_BOOLEAN_AND)" shift, and go to state 259 @@ -25038,20 +25508,21 @@ state 896 '/' shift, and go to state 277 '%' shift, and go to state 278 "instanceof (T_INSTANCEOF)" shift, and go to state 279 + "** (T_POW)" shift, and go to state 280 - $default reduce using rule 337 (expr_without_variable) + $default reduce using rule 339 (expr_without_variable) -state 897 +state 901 281 expr_without_variable: variable '=' '&' "new (T_NEW)" class_name_reference $@46 ctor_arguments . $default reduce using rule 281 (expr_without_variable) -state 898 +state 902 - 505 array_method_dereference: array_method_dereference '[' . dim_offset ']' + 507 array_method_dereference: array_method_dereference '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -25106,7 +25577,7 @@ state 898 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -25118,7 +25589,7 @@ state 898 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -25131,16 +25602,16 @@ state 898 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 946 + dim_offset go to state 950 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 899 +state 903 - 506 array_method_dereference: method '[' . dim_offset ']' + 508 array_method_dereference: method '[' . dim_offset ']' "require_once (T_REQUIRE_ONCE)" shift, and go to state 5 "require (T_REQUIRE)" shift, and go to state 6 @@ -25195,7 +25666,7 @@ state 899 '`' shift, and go to state 82 '"' shift, and go to state 83 - $default reduce using rule 531 (dim_offset) + $default reduce using rule 533 (dim_offset) namespace_name go to state 84 new_expr go to state 95 @@ -25207,7 +25678,7 @@ state 899 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 327 + expr go to state 329 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -25220,118 +25691,118 @@ state 899 base_variable go to state 115 reference_variable go to state 116 compound_variable go to state 117 - dim_offset go to state 947 + dim_offset go to state 951 simple_indirect_reference go to state 118 internal_functions_in_yacc go to state 119 class_constant go to state 120 class_name_scalar go to state 121 -state 900 +state 904 - 508 method: @71 function_call_parameter_list . + 510 method: @71 function_call_parameter_list . - $default reduce using rule 508 (method) + $default reduce using rule 510 (method) -state 901 +state 905 - 499 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties . - 501 variable_properties: variable_properties . variable_property + 501 variable: base_variable_with_function_calls "-> (T_OBJECT_OPERATOR)" $@68 object_property $@69 method_or_not variable_properties . + 503 variable_properties: variable_properties . variable_property - "-> (T_OBJECT_OPERATOR)" shift, and go to state 802 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 806 - $default reduce using rule 499 (variable) + $default reduce using rule 501 (variable) - variable_property go to state 948 + variable_property go to state 952 -state 902 +state 906 - 536 object_dim_list: object_dim_list '[' dim_offset ']' . + 538 object_dim_list: object_dim_list '[' dim_offset ']' . - $default reduce using rule 536 (object_dim_list) + $default reduce using rule 538 (object_dim_list) -state 903 +state 907 - 537 object_dim_list: object_dim_list '{' expr '}' . + 539 object_dim_list: object_dim_list '{' expr '}' . - $default reduce using rule 537 (object_dim_list) + $default reduce using rule 539 (object_dim_list) -state 904 +state 908 - 408 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" . object_property + 410 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" . object_property - "identifier (T_STRING)" shift, and go to state 475 + "identifier (T_STRING)" shift, and go to state 479 "variable (T_VARIABLE)" shift, and go to state 35 - '{' shift, and go to state 418 + '{' shift, and go to state 420 '$' shift, and go to state 81 - variable_without_objects go to state 601 - reference_variable go to state 420 + variable_without_objects go to state 605 + reference_variable go to state 422 compound_variable go to state 117 - object_property go to state 949 - object_dim_list go to state 603 - variable_name go to state 604 - simple_indirect_reference go to state 422 + object_property go to state 953 + object_dim_list go to state 607 + variable_name go to state 608 + simple_indirect_reference go to state 424 -state 905 +state 909 - 406 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties dynamic_class_name_variable_property . + 408 dynamic_class_name_variable_properties: dynamic_class_name_variable_properties dynamic_class_name_variable_property . - $default reduce using rule 406 (dynamic_class_name_variable_properties) + $default reduce using rule 408 (dynamic_class_name_variable_properties) -state 906 +state 910 172 new_elseif_list: new_elseif_list "elseif (T_ELSEIF)" . parenthesis_expr ':' $@38 inner_statement_list '(' shift, and go to state 175 - parenthesis_expr go to state 950 + parenthesis_expr go to state 954 -state 907 +state 911 176 new_else_single: "else (T_ELSE)" . ':' inner_statement_list - ':' shift, and go to state 951 + ':' shift, and go to state 955 -state 908 +state 912 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list $@8 new_elseif_list new_else_single . "endif (T_ENDIF)" ';' - "endif (T_ENDIF)" shift, and go to state 952 + "endif (T_ENDIF)" shift, and go to state 956 -state 909 +state 913 169 elseif_list: elseif_list "elseif (T_ELSEIF)" parenthesis_expr . $@37 statement $default reduce using rule 168 ($@37) - $@37 go to state 953 + $@37 go to state 957 -state 910 +state 914 174 else_single: "else (T_ELSE)" statement . $default reduce using rule 174 (else_single) -state 911 +state 915 166 while_statement: ':' inner_statement_list "endwhile (T_ENDWHILE)" ';' . $default reduce using rule 166 (while_statement) -state 912 +state 916 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' $@14 . for_expr ')' $@15 for_statement @@ -25391,8 +25862,8 @@ state 912 $default reduce using rule 258 (for_expr) namespace_name go to state 84 - for_expr go to state 954 - non_empty_for_expr go to state 334 + for_expr go to state 958 + non_empty_for_expr go to state 336 new_expr go to state 95 expr_without_variable go to state 96 combined_scalar_offset go to state 98 @@ -25402,7 +25873,7 @@ state 912 class_name go to state 102 common_scalar go to state 103 scalar go to state 104 - expr go to state 335 + expr go to state 337 parenthesis_expr go to state 106 r_variable go to state 107 rw_variable go to state 108 @@ -25421,24 +25892,24 @@ state 912 class_name_scalar go to state 121 -state 913 +state 917 145 foreach_variable: "list (T_LIST)" '(' $@34 . assignment_list ')' "identifier (T_STRING)" shift, and go to state 123 "variable (T_VARIABLE)" shift, and go to state 35 "static (T_STATIC)" shift, and go to state 148 - "list (T_LIST)" shift, and go to state 545 + "list (T_LIST)" shift, and go to state 549 "namespace (T_NAMESPACE)" shift, and go to state 149 "\\ (T_NS_SEPARATOR)" shift, and go to state 150 '$' shift, and go to state 81 - $default reduce using rule 548 (assignment_list_element) + $default reduce using rule 550 (assignment_list_element) namespace_name go to state 151 function_call go to state 101 class_name go to state 152 - variable go to state 546 + variable go to state 550 variable_without_objects go to state 110 static_member go to state 111 variable_class_name go to state 155 @@ -25448,291 +25919,291 @@ state 913 reference_variable go to state 116 compound_variable go to state 117 simple_indirect_reference go to state 118 - assignment_list go to state 955 - assignment_list_element go to state 548 + assignment_list go to state 959 + assignment_list_element go to state 552 -state 914 +state 918 141 foreach_optional_arg: "=> (T_DOUBLE_ARROW)" foreach_variable . $default reduce using rule 141 (foreach_optional_arg) -state 915 +state 919 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 foreach_variable foreach_optional_arg ')' . $@20 foreach_statement $default reduce using rule 86 ($@20) - $@20 go to state 956 + $@20 go to state 960 -state 916 +state 920 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 foreach_variable foreach_optional_arg ')' . $@18 foreach_statement $default reduce using rule 83 ($@18) - $@18 go to state 957 + $@18 go to state 961 -state 917 +state 921 153 declare_list: declare_list ',' "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 153 (declare_list) -state 918 +state 922 151 declare_statement: ':' inner_statement_list "enddeclare (T_ENDDECLARE)" . ';' - ';' shift, and go to state 958 + ';' shift, and go to state 962 -state 919 +state 923 157 switch_case_list: ':' ';' case_list "endswitch (T_ENDSWITCH)" ';' . $default reduce using rule 157 (switch_case_list) -state 920 +state 924 160 case_list: case_list "case (T_CASE)" expr case_separator . $@35 inner_statement_list $default reduce using rule 159 ($@35) - $@35 go to state 959 + $@35 go to state 963 -state 921 +state 925 162 case_list: case_list "default (T_DEFAULT)" case_separator $@36 . inner_statement_list $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 960 + inner_statement_list go to state 964 -state 922 +state 926 - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" . static_scalar + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 961 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 965 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 923 +state 927 - 441 static_operation: static_scalar_value . '+' static_scalar_value - 442 | static_scalar_value . '-' static_scalar_value - 443 | static_scalar_value . '*' static_scalar_value - 444 | static_scalar_value . '/' static_scalar_value - 445 | static_scalar_value . '%' static_scalar_value - 448 | static_scalar_value . '|' static_scalar_value - 449 | static_scalar_value . '&' static_scalar_value - 450 | static_scalar_value . '^' static_scalar_value - 451 | static_scalar_value . "<< (T_SL)" static_scalar_value - 452 | static_scalar_value . ">> (T_SR)" static_scalar_value - 453 | static_scalar_value . '.' static_scalar_value - 454 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value - 455 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value - 456 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value - 457 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value - 458 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value - 459 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value - 460 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value - 461 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value - 462 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value - 463 | static_scalar_value . '<' static_scalar_value - 464 | static_scalar_value . '>' static_scalar_value - 465 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value - 466 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value - 467 | static_scalar_value . '?' ':' static_scalar_value - 468 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value - 468 | static_scalar_value '?' static_scalar_value ':' static_scalar_value . - - "|| (T_BOOLEAN_OR)" shift, and go to state 645 - "&& (T_BOOLEAN_AND)" shift, and go to state 646 - '|' shift, and go to state 647 - '^' shift, and go to state 648 - '&' shift, and go to state 649 - "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 650 - "=== (T_IS_IDENTICAL)" shift, and go to state 651 - "!= (T_IS_NOT_EQUAL)" shift, and go to state 652 - "== (T_IS_EQUAL)" shift, and go to state 653 - '<' shift, and go to state 654 - '>' shift, and go to state 655 - ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 656 - "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 657 - ">> (T_SR)" shift, and go to state 658 - "<< (T_SL)" shift, and go to state 659 - '+' shift, and go to state 660 - '-' shift, and go to state 661 - '.' shift, and go to state 662 - '*' shift, and go to state 663 - '/' shift, and go to state 664 - '%' shift, and go to state 665 + 443 static_operation: static_scalar_value . '+' static_scalar_value + 444 | static_scalar_value . '-' static_scalar_value + 445 | static_scalar_value . '*' static_scalar_value + 446 | static_scalar_value . '/' static_scalar_value + 447 | static_scalar_value . '%' static_scalar_value + 450 | static_scalar_value . '|' static_scalar_value + 451 | static_scalar_value . '&' static_scalar_value + 452 | static_scalar_value . '^' static_scalar_value + 453 | static_scalar_value . "<< (T_SL)" static_scalar_value + 454 | static_scalar_value . ">> (T_SR)" static_scalar_value + 455 | static_scalar_value . '.' static_scalar_value + 456 | static_scalar_value . "xor (T_LOGICAL_XOR)" static_scalar_value + 457 | static_scalar_value . "and (T_LOGICAL_AND)" static_scalar_value + 458 | static_scalar_value . "or (T_LOGICAL_OR)" static_scalar_value + 459 | static_scalar_value . "&& (T_BOOLEAN_AND)" static_scalar_value + 460 | static_scalar_value . "|| (T_BOOLEAN_OR)" static_scalar_value + 461 | static_scalar_value . "=== (T_IS_IDENTICAL)" static_scalar_value + 462 | static_scalar_value . "!== (T_IS_NOT_IDENTICAL)" static_scalar_value + 463 | static_scalar_value . "== (T_IS_EQUAL)" static_scalar_value + 464 | static_scalar_value . "!= (T_IS_NOT_EQUAL)" static_scalar_value + 465 | static_scalar_value . '<' static_scalar_value + 466 | static_scalar_value . '>' static_scalar_value + 467 | static_scalar_value . "<= (T_IS_SMALLER_OR_EQUAL)" static_scalar_value + 468 | static_scalar_value . ">= (T_IS_GREATER_OR_EQUAL)" static_scalar_value + 469 | static_scalar_value . '?' ':' static_scalar_value + 470 | static_scalar_value . '?' static_scalar_value ':' static_scalar_value + 470 | static_scalar_value '?' static_scalar_value ':' static_scalar_value . + + "|| (T_BOOLEAN_OR)" shift, and go to state 649 + "&& (T_BOOLEAN_AND)" shift, and go to state 650 + '|' shift, and go to state 651 + '^' shift, and go to state 652 + '&' shift, and go to state 653 + "!== (T_IS_NOT_IDENTICAL)" shift, and go to state 654 + "=== (T_IS_IDENTICAL)" shift, and go to state 655 + "!= (T_IS_NOT_EQUAL)" shift, and go to state 656 + "== (T_IS_EQUAL)" shift, and go to state 657 + '<' shift, and go to state 658 + '>' shift, and go to state 659 + ">= (T_IS_GREATER_OR_EQUAL)" shift, and go to state 660 + "<= (T_IS_SMALLER_OR_EQUAL)" shift, and go to state 661 + ">> (T_SR)" shift, and go to state 662 + "<< (T_SL)" shift, and go to state 663 + '+' shift, and go to state 664 + '-' shift, and go to state 665 + '.' shift, and go to state 666 + '*' shift, and go to state 667 + '/' shift, and go to state 668 + '%' shift, and go to state 669 - $default reduce using rule 468 (static_operation) + $default reduce using rule 470 (static_operation) -state 924 +state 928 101 catch_statement: "catch (T_CATCH)" '(' $@24 . fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 962 + namespace_name go to state 580 + fully_qualified_class_name go to state 966 -state 925 +state 929 104 finally_statement: "finally (T_FINALLY)" . $@28 '{' inner_statement_list '}' $default reduce using rule 103 ($@28) - $@28 go to state 963 + $@28 go to state 967 -state 926 +state 930 93 unticked_statement: "try (T_TRY)" $@22 '{' inner_statement_list '}' catch_statement $@23 finally_statement . $default reduce using rule 93 (unticked_statement) -state 927 +state 931 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars . '{' inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars . '{' inner_statement_list '}' - '{' shift, and go to state 964 + '{' shift, and go to state 968 -state 928 +state 932 - 547 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list ')' . + 549 assignment_list_element: "list (T_LIST)" '(' $@74 assignment_list ')' . - $default reduce using rule 547 (assignment_list_element) + $default reduce using rule 549 (assignment_list_element) -state 929 +state 933 266 chaining_dereference: '[' dim_offset ']' . $default reduce using rule 266 (chaining_dereference) -state 930 +state 934 - 504 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 . method_or_not + 506 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 . method_or_not - '(' reduce using rule 507 (@71) - $default reduce using rule 511 (method_or_not) + '(' reduce using rule 509 (@71) + $default reduce using rule 513 (method_or_not) - array_method_dereference go to state 823 - method go to state 824 - @71 go to state 825 - method_or_not go to state 965 + array_method_dereference go to state 827 + method go to state 828 + @71 go to state 829 + method_or_not go to state 969 -state 931 +state 935 265 chaining_dereference: chaining_dereference '[' dim_offset . ']' - ']' shift, and go to state 966 + ']' shift, and go to state 970 -state 932 +state 936 263 chaining_method_or_property: chaining_method_or_property . variable_property 268 chaining_instance_call: chaining_dereference $@42 chaining_method_or_property . - "-> (T_OBJECT_OPERATOR)" shift, and go to state 802 + "-> (T_OBJECT_OPERATOR)" shift, and go to state 806 $default reduce using rule 268 (chaining_instance_call) - variable_property go to state 865 + variable_property go to state 869 -state 933 +state 937 124 unticked_class_declaration_statement: class_entry_type "identifier (T_STRING)" extends_from $@32 implements_list '{' class_statement_list '}' . $default reduce using rule 124 (unticked_class_declaration_statement) -state 934 +state 938 255 class_constant_declaration: "const (T_CONST)" "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 967 + '=' shift, and go to state 971 -state 935 +state 939 215 trait_use_statement: "use (T_USE)" trait_list . trait_adaptations 217 trait_list: trait_list . ',' fully_qualified_class_name - ',' shift, and go to state 968 - ';' shift, and go to state 969 - '{' shift, and go to state 970 + ',' shift, and go to state 972 + ';' shift, and go to state 973 + '{' shift, and go to state 974 - trait_adaptations go to state 971 + trait_adaptations go to state 975 -state 936 +state 940 216 trait_list: fully_qualified_class_name . $default reduce using rule 216 (trait_list) -state 937 +state 941 210 class_statement: variable_modifiers $@39 . class_variable_declaration ';' - "variable (T_VARIABLE)" shift, and go to state 972 + "variable (T_VARIABLE)" shift, and go to state 976 - class_variable_declaration go to state 973 + class_variable_declaration go to state 977 -state 938 +state 942 214 class_statement: method_modifiers function . is_reference "identifier (T_STRING)" $@40 '(' parameter_list ')' method_body @@ -25740,120 +26211,120 @@ state 938 $default reduce using rule 117 (is_reference) - is_reference go to state 974 + is_reference go to state 978 -state 939 +state 943 243 non_empty_member_modifiers: non_empty_member_modifiers member_modifier . $default reduce using rule 243 (non_empty_member_modifiers) -state 940 +state 944 254 class_constant_declaration: class_constant_declaration ',' . "identifier (T_STRING)" '=' static_scalar - "identifier (T_STRING)" shift, and go to state 975 + "identifier (T_STRING)" shift, and go to state 979 -state 941 +state 945 211 class_statement: class_constant_declaration ';' . $default reduce using rule 211 (class_statement) -state 942 +state 946 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' parameter_list ')' '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 976 + inner_statement_list go to state 980 -state 943 +state 947 - 372 lexical_vars: "use (T_USE)" '(' . lexical_var_list ')' + 374 lexical_vars: "use (T_USE)" '(' . lexical_var_list ')' - '&' shift, and go to state 977 - "variable (T_VARIABLE)" shift, and go to state 978 + '&' shift, and go to state 981 + "variable (T_VARIABLE)" shift, and go to state 982 - lexical_var_list go to state 979 + lexical_var_list go to state 983 -state 944 +state 948 - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' . inner_statement_list '}' + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 980 + inner_statement_list go to state 984 -state 945 +state 949 181 parameter: optional_class_type is_reference is_variadic "variable (T_VARIABLE)" . 182 | optional_class_type is_reference is_variadic "variable (T_VARIABLE)" . '=' static_scalar - '=' shift, and go to state 981 + '=' shift, and go to state 985 $default reduce using rule 181 (parameter) -state 946 +state 950 - 505 array_method_dereference: array_method_dereference '[' dim_offset . ']' + 507 array_method_dereference: array_method_dereference '[' dim_offset . ']' - ']' shift, and go to state 982 + ']' shift, and go to state 986 -state 947 +state 951 - 506 array_method_dereference: method '[' dim_offset . ']' + 508 array_method_dereference: method '[' dim_offset . ']' - ']' shift, and go to state 983 + ']' shift, and go to state 987 -state 948 +state 952 - 501 variable_properties: variable_properties variable_property . + 503 variable_properties: variable_properties variable_property . - $default reduce using rule 501 (variable_properties) + $default reduce using rule 503 (variable_properties) -state 949 +state 953 - 408 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" object_property . + 410 dynamic_class_name_variable_property: "-> (T_OBJECT_OPERATOR)" object_property . - $default reduce using rule 408 (dynamic_class_name_variable_property) + $default reduce using rule 410 (dynamic_class_name_variable_property) -state 950 +state 954 172 new_elseif_list: new_elseif_list "elseif (T_ELSEIF)" parenthesis_expr . ':' $@38 inner_statement_list - ':' shift, and go to state 984 + ':' shift, and go to state 988 -state 951 +state 955 176 new_else_single: "else (T_ELSE)" ':' . inner_statement_list $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 985 + inner_statement_list go to state 989 -state 952 +state 956 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list $@8 new_elseif_list new_else_single "endif (T_ENDIF)" . ';' - ';' shift, and go to state 986 + ';' shift, and go to state 990 -state 953 +state 957 169 elseif_list: elseif_list "elseif (T_ELSEIF)" parenthesis_expr $@37 . statement @@ -25930,7 +26401,7 @@ state 953 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 987 + statement go to state 991 unticked_statement go to state 88 new_expr go to state 95 expr_without_variable go to state 96 @@ -25961,23 +26432,23 @@ state 953 class_name_scalar go to state 121 -state 954 +state 958 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' $@14 for_expr . ')' $@15 for_statement - ')' shift, and go to state 988 + ')' shift, and go to state 992 -state 955 +state 959 145 foreach_variable: "list (T_LIST)" '(' $@34 assignment_list . ')' - 543 assignment_list: assignment_list . ',' assignment_list_element + 545 assignment_list: assignment_list . ',' assignment_list_element - ',' shift, and go to state 681 - ')' shift, and go to state 989 + ',' shift, and go to state 685 + ')' shift, and go to state 993 -state 956 +state 960 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 foreach_variable foreach_optional_arg ')' $@20 . foreach_statement @@ -25988,7 +26459,7 @@ state 956 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - ':' shift, and go to state 990 + ':' shift, and go to state 994 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -26055,9 +26526,9 @@ state 956 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 991 + statement go to state 995 unticked_statement go to state 88 - foreach_statement go to state 992 + foreach_statement go to state 996 new_expr go to state 95 expr_without_variable go to state 96 yield_expr go to state 97 @@ -26087,7 +26558,7 @@ state 956 class_name_scalar go to state 121 -state 957 +state 961 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 foreach_variable foreach_optional_arg ')' $@18 . foreach_statement @@ -26098,7 +26569,7 @@ state 957 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - ':' shift, and go to state 990 + ':' shift, and go to state 994 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -26165,9 +26636,9 @@ state 957 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 991 + statement go to state 995 unticked_statement go to state 88 - foreach_statement go to state 993 + foreach_statement go to state 997 new_expr go to state 95 expr_without_variable go to state 96 yield_expr go to state 97 @@ -26197,23 +26668,23 @@ state 957 class_name_scalar go to state 121 -state 958 +state 962 151 declare_statement: ':' inner_statement_list "enddeclare (T_ENDDECLARE)" ';' . $default reduce using rule 151 (declare_statement) -state 959 +state 963 160 case_list: case_list "case (T_CASE)" expr case_separator $@35 . inner_statement_list $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 994 + inner_statement_list go to state 998 -state 960 +state 964 41 inner_statement_list: inner_statement_list . $@4 inner_statement 162 case_list: case_list "default (T_DEFAULT)" case_separator $@36 inner_statement_list . @@ -26224,284 +26695,284 @@ state 960 '}' reduce using rule 162 (case_list) $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 961 +state 965 - 486 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar . + 488 non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_scalar "=> (T_DOUBLE_ARROW)" static_scalar . - $default reduce using rule 486 (non_empty_static_array_pair_list) + $default reduce using rule 488 (non_empty_static_array_pair_list) -state 962 +state 966 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name . $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches $default reduce using rule 98 ($@25) - $@25 go to state 995 + $@25 go to state 999 -state 963 +state 967 104 finally_statement: "finally (T_FINALLY)" $@28 . '{' inner_statement_list '}' - '{' shift, and go to state 996 + '{' shift, and go to state 1000 -state 964 +state 968 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' . inner_statement_list '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 997 + inner_statement_list go to state 1001 -state 965 +state 969 - 504 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 method_or_not . + 506 variable_property: "-> (T_OBJECT_OPERATOR)" object_property $@70 method_or_not . - $default reduce using rule 504 (variable_property) + $default reduce using rule 506 (variable_property) -state 966 +state 970 265 chaining_dereference: chaining_dereference '[' dim_offset ']' . $default reduce using rule 265 (chaining_dereference) -state 967 +state 971 255 class_constant_declaration: "const (T_CONST)" "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 998 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 1002 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 968 +state 972 217 trait_list: trait_list ',' . fully_qualified_class_name "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 999 + namespace_name go to state 580 + fully_qualified_class_name go to state 1003 -state 969 +state 973 218 trait_adaptations: ';' . $default reduce using rule 218 (trait_adaptations) -state 970 +state 974 219 trait_adaptations: '{' . trait_adaptation_list '}' - "identifier (T_STRING)" shift, and go to state 1000 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "identifier (T_STRING)" shift, and go to state 1004 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 $default reduce using rule 220 (trait_adaptation_list) - namespace_name go to state 576 - trait_adaptation_list go to state 1001 - non_empty_trait_adaptation_list go to state 1002 - trait_adaptation_statement go to state 1003 - trait_precedence go to state 1004 - trait_method_reference go to state 1005 - trait_method_reference_fully_qualified go to state 1006 - trait_alias go to state 1007 - fully_qualified_class_name go to state 1008 + namespace_name go to state 580 + trait_adaptation_list go to state 1005 + non_empty_trait_adaptation_list go to state 1006 + trait_adaptation_statement go to state 1007 + trait_precedence go to state 1008 + trait_method_reference go to state 1009 + trait_method_reference_fully_qualified go to state 1010 + trait_alias go to state 1011 + fully_qualified_class_name go to state 1012 -state 971 +state 975 215 trait_use_statement: "use (T_USE)" trait_list trait_adaptations . $default reduce using rule 215 (trait_use_statement) -state 972 +state 976 252 class_variable_declaration: "variable (T_VARIABLE)" . 253 | "variable (T_VARIABLE)" . '=' static_scalar - '=' shift, and go to state 1009 + '=' shift, and go to state 1013 $default reduce using rule 252 (class_variable_declaration) -state 973 +state 977 210 class_statement: variable_modifiers $@39 class_variable_declaration . ';' 250 class_variable_declaration: class_variable_declaration . ',' "variable (T_VARIABLE)" 251 | class_variable_declaration . ',' "variable (T_VARIABLE)" '=' static_scalar - ',' shift, and go to state 1010 - ';' shift, and go to state 1011 + ',' shift, and go to state 1014 + ';' shift, and go to state 1015 -state 974 +state 978 214 class_statement: method_modifiers function is_reference . "identifier (T_STRING)" $@40 '(' parameter_list ')' method_body - "identifier (T_STRING)" shift, and go to state 1012 + "identifier (T_STRING)" shift, and go to state 1016 -state 975 +state 979 254 class_constant_declaration: class_constant_declaration ',' "identifier (T_STRING)" . '=' static_scalar - '=' shift, and go to state 1013 + '=' shift, and go to state 1017 -state 976 +state 980 41 inner_statement_list: inner_statement_list . $@4 inner_statement 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' parameter_list ')' '{' inner_statement_list . '}' - '}' shift, and go to state 1014 + '}' shift, and go to state 1018 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 977 +state 981 - 376 lexical_var_list: '&' . "variable (T_VARIABLE)" + 378 lexical_var_list: '&' . "variable (T_VARIABLE)" - "variable (T_VARIABLE)" shift, and go to state 1015 + "variable (T_VARIABLE)" shift, and go to state 1019 -state 978 +state 982 - 375 lexical_var_list: "variable (T_VARIABLE)" . + 377 lexical_var_list: "variable (T_VARIABLE)" . - $default reduce using rule 375 (lexical_var_list) + $default reduce using rule 377 (lexical_var_list) -state 979 +state 983 - 372 lexical_vars: "use (T_USE)" '(' lexical_var_list . ')' - 373 lexical_var_list: lexical_var_list . ',' "variable (T_VARIABLE)" - 374 | lexical_var_list . ',' '&' "variable (T_VARIABLE)" + 374 lexical_vars: "use (T_USE)" '(' lexical_var_list . ')' + 375 lexical_var_list: lexical_var_list . ',' "variable (T_VARIABLE)" + 376 | lexical_var_list . ',' '&' "variable (T_VARIABLE)" - ',' shift, and go to state 1016 - ')' shift, and go to state 1017 + ',' shift, and go to state 1020 + ')' shift, and go to state 1021 -state 980 +state 984 41 inner_statement_list: inner_statement_list . $@4 inner_statement - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list . '}' + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list . '}' - '}' shift, and go to state 1018 + '}' shift, and go to state 1022 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 981 +state 985 182 parameter: optional_class_type is_reference is_variadic "variable (T_VARIABLE)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 1019 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 1023 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 982 +state 986 - 505 array_method_dereference: array_method_dereference '[' dim_offset ']' . + 507 array_method_dereference: array_method_dereference '[' dim_offset ']' . - $default reduce using rule 505 (array_method_dereference) + $default reduce using rule 507 (array_method_dereference) -state 983 +state 987 - 506 array_method_dereference: method '[' dim_offset ']' . + 508 array_method_dereference: method '[' dim_offset ']' . - $default reduce using rule 506 (array_method_dereference) + $default reduce using rule 508 (array_method_dereference) -state 984 +state 988 172 new_elseif_list: new_elseif_list "elseif (T_ELSEIF)" parenthesis_expr ':' . $@38 inner_statement_list $default reduce using rule 171 ($@38) - $@38 go to state 1020 + $@38 go to state 1024 -state 985 +state 989 41 inner_statement_list: inner_statement_list . $@4 inner_statement 176 new_else_single: "else (T_ELSE)" ':' inner_statement_list . @@ -26509,70 +26980,70 @@ state 985 "endif (T_ENDIF)" reduce using rule 176 (new_else_single) $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 986 +state 990 55 unticked_statement: "if (T_IF)" parenthesis_expr ':' $@7 inner_statement_list $@8 new_elseif_list new_else_single "endif (T_ENDIF)" ';' . $default reduce using rule 55 (unticked_statement) -state 987 +state 991 169 elseif_list: elseif_list "elseif (T_ELSEIF)" parenthesis_expr $@37 statement . $default reduce using rule 169 (elseif_list) -state 988 +state 992 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' $@14 for_expr ')' . $@15 for_statement $default reduce using rule 64 ($@15) - $@15 go to state 1021 + $@15 go to state 1025 -state 989 +state 993 145 foreach_variable: "list (T_LIST)" '(' $@34 assignment_list ')' . $default reduce using rule 145 (foreach_variable) -state 990 +state 994 149 foreach_statement: ':' . inner_statement_list "endforeach (T_ENDFOREACH)" ';' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1022 + inner_statement_list go to state 1026 -state 991 +state 995 148 foreach_statement: statement . $default reduce using rule 148 (foreach_statement) -state 992 +state 996 87 unticked_statement: "foreach (T_FOREACH)" '(' expr_without_variable "as (T_AS)" $@19 foreach_variable foreach_optional_arg ')' $@20 foreach_statement . $default reduce using rule 87 (unticked_statement) -state 993 +state 997 84 unticked_statement: "foreach (T_FOREACH)" '(' variable "as (T_AS)" $@17 foreach_variable foreach_optional_arg ')' $@18 foreach_statement . $default reduce using rule 84 (unticked_statement) -state 994 +state 998 41 inner_statement_list: inner_statement_list . $@4 inner_statement 160 case_list: case_list "case (T_CASE)" expr case_separator $@35 inner_statement_list . @@ -26583,52 +27054,52 @@ state 994 '}' reduce using rule 160 (case_list) $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 995 +state 999 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 . "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches - "variable (T_VARIABLE)" shift, and go to state 1023 + "variable (T_VARIABLE)" shift, and go to state 1027 -state 996 +state 1000 104 finally_statement: "finally (T_FINALLY)" $@28 '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1024 + inner_statement_list go to state 1028 -state 997 +state 1001 41 inner_statement_list: inner_statement_list . $@4 inner_statement - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list . '}' + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list . '}' - '}' shift, and go to state 1025 + '}' shift, and go to state 1029 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 998 +state 1002 255 class_constant_declaration: "const (T_CONST)" "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 255 (class_constant_declaration) -state 999 +state 1003 217 trait_list: trait_list ',' fully_qualified_class_name . $default reduce using rule 217 (trait_list) -state 1000 +state 1004 5 namespace_name: "identifier (T_STRING)" . 229 trait_method_reference: "identifier (T_STRING)" . @@ -26637,233 +27108,233 @@ state 1000 $default reduce using rule 5 (namespace_name) -state 1001 +state 1005 219 trait_adaptations: '{' trait_adaptation_list . '}' - '}' shift, and go to state 1026 + '}' shift, and go to state 1030 -state 1002 +state 1006 221 trait_adaptation_list: non_empty_trait_adaptation_list . 223 non_empty_trait_adaptation_list: non_empty_trait_adaptation_list . trait_adaptation_statement - "identifier (T_STRING)" shift, and go to state 1000 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "identifier (T_STRING)" shift, and go to state 1004 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 $default reduce using rule 221 (trait_adaptation_list) - namespace_name go to state 576 - trait_adaptation_statement go to state 1027 - trait_precedence go to state 1004 - trait_method_reference go to state 1005 - trait_method_reference_fully_qualified go to state 1006 - trait_alias go to state 1007 - fully_qualified_class_name go to state 1008 + namespace_name go to state 580 + trait_adaptation_statement go to state 1031 + trait_precedence go to state 1008 + trait_method_reference go to state 1009 + trait_method_reference_fully_qualified go to state 1010 + trait_alias go to state 1011 + fully_qualified_class_name go to state 1012 -state 1003 +state 1007 222 non_empty_trait_adaptation_list: trait_adaptation_statement . $default reduce using rule 222 (non_empty_trait_adaptation_list) -state 1004 +state 1008 224 trait_adaptation_statement: trait_precedence . ';' - ';' shift, and go to state 1028 + ';' shift, and go to state 1032 -state 1005 +state 1009 232 trait_alias: trait_method_reference . "as (T_AS)" trait_modifiers "identifier (T_STRING)" 233 | trait_method_reference . "as (T_AS)" member_modifier - "as (T_AS)" shift, and go to state 1029 + "as (T_AS)" shift, and go to state 1033 -state 1006 +state 1010 226 trait_precedence: trait_method_reference_fully_qualified . "insteadof (T_INSTEADOF)" trait_reference_list 230 trait_method_reference: trait_method_reference_fully_qualified . - "insteadof (T_INSTEADOF)" shift, and go to state 1030 + "insteadof (T_INSTEADOF)" shift, and go to state 1034 $default reduce using rule 230 (trait_method_reference) -state 1007 +state 1011 225 trait_adaptation_statement: trait_alias . ';' - ';' shift, and go to state 1031 + ';' shift, and go to state 1035 -state 1008 +state 1012 231 trait_method_reference_fully_qualified: fully_qualified_class_name . ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" - ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 1032 + ":: (T_PAAMAYIM_NEKUDOTAYIM)" shift, and go to state 1036 -state 1009 +state 1013 253 class_variable_declaration: "variable (T_VARIABLE)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 1033 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 1037 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 1010 +state 1014 250 class_variable_declaration: class_variable_declaration ',' . "variable (T_VARIABLE)" 251 | class_variable_declaration ',' . "variable (T_VARIABLE)" '=' static_scalar - "variable (T_VARIABLE)" shift, and go to state 1034 + "variable (T_VARIABLE)" shift, and go to state 1038 -state 1011 +state 1015 210 class_statement: variable_modifiers $@39 class_variable_declaration ';' . $default reduce using rule 210 (class_statement) -state 1012 +state 1016 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" . $@40 '(' parameter_list ')' method_body $default reduce using rule 213 ($@40) - $@40 go to state 1035 + $@40 go to state 1039 -state 1013 +state 1017 254 class_constant_declaration: class_constant_declaration ',' "identifier (T_STRING)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 1036 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 1040 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 1014 +state 1018 122 unticked_function_declaration_statement: function is_reference "identifier (T_STRING)" $@31 '(' parameter_list ')' '{' inner_statement_list '}' . $default reduce using rule 122 (unticked_function_declaration_statement) -state 1015 +state 1019 - 376 lexical_var_list: '&' "variable (T_VARIABLE)" . + 378 lexical_var_list: '&' "variable (T_VARIABLE)" . - $default reduce using rule 376 (lexical_var_list) + $default reduce using rule 378 (lexical_var_list) -state 1016 +state 1020 - 373 lexical_var_list: lexical_var_list ',' . "variable (T_VARIABLE)" - 374 | lexical_var_list ',' . '&' "variable (T_VARIABLE)" + 375 lexical_var_list: lexical_var_list ',' . "variable (T_VARIABLE)" + 376 | lexical_var_list ',' . '&' "variable (T_VARIABLE)" - '&' shift, and go to state 1037 - "variable (T_VARIABLE)" shift, and go to state 1038 + '&' shift, and go to state 1041 + "variable (T_VARIABLE)" shift, and go to state 1042 -state 1017 +state 1021 - 372 lexical_vars: "use (T_USE)" '(' lexical_var_list ')' . + 374 lexical_vars: "use (T_USE)" '(' lexical_var_list ')' . - $default reduce using rule 372 (lexical_vars) + $default reduce using rule 374 (lexical_vars) -state 1018 +state 1022 - 358 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' . + 360 expr_without_variable: function is_reference @56 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' . - $default reduce using rule 358 (expr_without_variable) + $default reduce using rule 360 (expr_without_variable) -state 1019 +state 1023 182 parameter: optional_class_type is_reference is_variadic "variable (T_VARIABLE)" '=' static_scalar . $default reduce using rule 182 (parameter) -state 1020 +state 1024 172 new_elseif_list: new_elseif_list "elseif (T_ELSEIF)" parenthesis_expr ':' $@38 . inner_statement_list $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1039 + inner_statement_list go to state 1043 -state 1021 +state 1025 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' $@14 for_expr ')' $@15 . for_statement @@ -26874,7 +27345,7 @@ state 1021 "include (T_INCLUDE)" shift, and go to state 9 "print (T_PRINT)" shift, and go to state 10 "yield (T_YIELD)" shift, and go to state 11 - ':' shift, and go to state 1040 + ':' shift, and go to state 1044 '+' shift, and go to state 12 '-' shift, and go to state 13 '!' shift, and go to state 14 @@ -26941,9 +27412,9 @@ state 1021 '"' shift, and go to state 83 namespace_name go to state 84 - statement go to state 1041 + statement go to state 1045 unticked_statement go to state 88 - for_statement go to state 1042 + for_statement go to state 1046 new_expr go to state 95 expr_without_variable go to state 96 yield_expr go to state 97 @@ -26973,156 +27444,156 @@ state 1021 class_name_scalar go to state 121 -state 1022 +state 1026 41 inner_statement_list: inner_statement_list . $@4 inner_statement 149 foreach_statement: ':' inner_statement_list . "endforeach (T_ENDFOREACH)" ';' - "endforeach (T_ENDFOREACH)" shift, and go to state 1043 + "endforeach (T_ENDFOREACH)" shift, and go to state 1047 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1023 +state 1027 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" . ')' $@26 '{' inner_statement_list '}' $@27 additional_catches - ')' shift, and go to state 1044 + ')' shift, and go to state 1048 -state 1024 +state 1028 41 inner_statement_list: inner_statement_list . $@4 inner_statement 104 finally_statement: "finally (T_FINALLY)" $@28 '{' inner_statement_list . '}' - '}' shift, and go to state 1045 + '}' shift, and go to state 1049 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1025 +state 1029 - 360 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' . + 362 expr_without_variable: "static (T_STATIC)" function is_reference @57 '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' . - $default reduce using rule 360 (expr_without_variable) + $default reduce using rule 362 (expr_without_variable) -state 1026 +state 1030 219 trait_adaptations: '{' trait_adaptation_list '}' . $default reduce using rule 219 (trait_adaptations) -state 1027 +state 1031 223 non_empty_trait_adaptation_list: non_empty_trait_adaptation_list trait_adaptation_statement . $default reduce using rule 223 (non_empty_trait_adaptation_list) -state 1028 +state 1032 224 trait_adaptation_statement: trait_precedence ';' . $default reduce using rule 224 (trait_adaptation_statement) -state 1029 +state 1033 232 trait_alias: trait_method_reference "as (T_AS)" . trait_modifiers "identifier (T_STRING)" 233 | trait_method_reference "as (T_AS)" . member_modifier - "public (T_PUBLIC)" shift, and go to state 875 - "protected (T_PROTECTED)" shift, and go to state 876 - "private (T_PRIVATE)" shift, and go to state 877 - "final (T_FINAL)" shift, and go to state 878 - "abstract (T_ABSTRACT)" shift, and go to state 879 - "static (T_STATIC)" shift, and go to state 880 + "public (T_PUBLIC)" shift, and go to state 879 + "protected (T_PROTECTED)" shift, and go to state 880 + "private (T_PRIVATE)" shift, and go to state 881 + "final (T_FINAL)" shift, and go to state 882 + "abstract (T_ABSTRACT)" shift, and go to state 883 + "static (T_STATIC)" shift, and go to state 884 $default reduce using rule 234 (trait_modifiers) - trait_modifiers go to state 1046 - member_modifier go to state 1047 + trait_modifiers go to state 1050 + member_modifier go to state 1051 -state 1030 +state 1034 226 trait_precedence: trait_method_reference_fully_qualified "insteadof (T_INSTEADOF)" . trait_reference_list "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - trait_reference_list go to state 1048 - fully_qualified_class_name go to state 1049 + namespace_name go to state 580 + trait_reference_list go to state 1052 + fully_qualified_class_name go to state 1053 -state 1031 +state 1035 225 trait_adaptation_statement: trait_alias ';' . $default reduce using rule 225 (trait_adaptation_statement) -state 1032 +state 1036 231 trait_method_reference_fully_qualified: fully_qualified_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 1050 + "identifier (T_STRING)" shift, and go to state 1054 -state 1033 +state 1037 253 class_variable_declaration: "variable (T_VARIABLE)" '=' static_scalar . $default reduce using rule 253 (class_variable_declaration) -state 1034 +state 1038 250 class_variable_declaration: class_variable_declaration ',' "variable (T_VARIABLE)" . 251 | class_variable_declaration ',' "variable (T_VARIABLE)" . '=' static_scalar - '=' shift, and go to state 1051 + '=' shift, and go to state 1055 $default reduce using rule 250 (class_variable_declaration) -state 1035 +state 1039 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" $@40 . '(' parameter_list ')' method_body - '(' shift, and go to state 1052 + '(' shift, and go to state 1056 -state 1036 +state 1040 254 class_constant_declaration: class_constant_declaration ',' "identifier (T_STRING)" '=' static_scalar . $default reduce using rule 254 (class_constant_declaration) -state 1037 +state 1041 - 374 lexical_var_list: lexical_var_list ',' '&' . "variable (T_VARIABLE)" + 376 lexical_var_list: lexical_var_list ',' '&' . "variable (T_VARIABLE)" - "variable (T_VARIABLE)" shift, and go to state 1053 + "variable (T_VARIABLE)" shift, and go to state 1057 -state 1038 +state 1042 - 373 lexical_var_list: lexical_var_list ',' "variable (T_VARIABLE)" . + 375 lexical_var_list: lexical_var_list ',' "variable (T_VARIABLE)" . - $default reduce using rule 373 (lexical_var_list) + $default reduce using rule 375 (lexical_var_list) -state 1039 +state 1043 41 inner_statement_list: inner_statement_list . $@4 inner_statement 172 new_elseif_list: new_elseif_list "elseif (T_ELSEIF)" parenthesis_expr ':' $@38 inner_statement_list . @@ -27132,63 +27603,63 @@ state 1039 "endif (T_ENDIF)" reduce using rule 172 (new_elseif_list) $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1040 +state 1044 147 for_statement: ':' . inner_statement_list "endfor (T_ENDFOR)" ';' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1054 + inner_statement_list go to state 1058 -state 1041 +state 1045 146 for_statement: statement . $default reduce using rule 146 (for_statement) -state 1042 +state 1046 65 unticked_statement: "for (T_FOR)" '(' for_expr ';' $@13 for_expr ';' $@14 for_expr ')' $@15 for_statement . $default reduce using rule 65 (unticked_statement) -state 1043 +state 1047 149 foreach_statement: ':' inner_statement_list "endforeach (T_ENDFOREACH)" . ';' - ';' shift, and go to state 1055 + ';' shift, and go to state 1059 -state 1044 +state 1048 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' . $@26 '{' inner_statement_list '}' $@27 additional_catches $default reduce using rule 99 ($@26) - $@26 go to state 1056 + $@26 go to state 1060 -state 1045 +state 1049 104 finally_statement: "finally (T_FINALLY)" $@28 '{' inner_statement_list '}' . $default reduce using rule 104 (finally_statement) -state 1046 +state 1050 232 trait_alias: trait_method_reference "as (T_AS)" trait_modifiers . "identifier (T_STRING)" - "identifier (T_STRING)" shift, and go to state 1057 + "identifier (T_STRING)" shift, and go to state 1061 -state 1047 +state 1051 233 trait_alias: trait_method_reference "as (T_AS)" member_modifier . 235 trait_modifiers: member_modifier . @@ -27197,384 +27668,384 @@ state 1047 $default reduce using rule 233 (trait_alias) -state 1048 +state 1052 226 trait_precedence: trait_method_reference_fully_qualified "insteadof (T_INSTEADOF)" trait_reference_list . 228 trait_reference_list: trait_reference_list . ',' fully_qualified_class_name - ',' shift, and go to state 1058 + ',' shift, and go to state 1062 $default reduce using rule 226 (trait_precedence) -state 1049 +state 1053 227 trait_reference_list: fully_qualified_class_name . $default reduce using rule 227 (trait_reference_list) -state 1050 +state 1054 231 trait_method_reference_fully_qualified: fully_qualified_class_name ":: (T_PAAMAYIM_NEKUDOTAYIM)" "identifier (T_STRING)" . $default reduce using rule 231 (trait_method_reference_fully_qualified) -state 1051 +state 1055 251 class_variable_declaration: class_variable_declaration ',' "variable (T_VARIABLE)" '=' . static_scalar - '+' shift, and go to state 501 - '-' shift, and go to state 502 - '!' shift, and go to state 503 - '~' shift, and go to state 504 - '[' shift, and go to state 505 + '+' shift, and go to state 505 + '-' shift, and go to state 506 + '!' shift, and go to state 507 + '~' shift, and go to state 508 + '[' shift, and go to state 509 "integer number (T_LNUMBER)" shift, and go to state 31 "floating-point number (T_DNUMBER)" shift, and go to state 32 "identifier (T_STRING)" shift, and go to state 123 - "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 506 + "quoted-string (T_CONSTANT_ENCAPSED_STRING)" shift, and go to state 510 "static (T_STATIC)" shift, and go to state 148 - "array (T_ARRAY)" shift, and go to state 507 - "__CLASS__ (T_CLASS_C)" shift, and go to state 508 + "array (T_ARRAY)" shift, and go to state 511 + "__CLASS__ (T_CLASS_C)" shift, and go to state 512 "__TRAIT__ (T_TRAIT_C)" shift, and go to state 68 "__METHOD__ (T_METHOD_C)" shift, and go to state 69 "__FUNCTION__ (T_FUNC_C)" shift, and go to state 70 "__LINE__ (T_LINE)" shift, and go to state 71 "__FILE__ (T_FILE)" shift, and go to state 72 - "heredoc start (T_START_HEREDOC)" shift, and go to state 509 - "namespace (T_NAMESPACE)" shift, and go to state 510 + "heredoc start (T_START_HEREDOC)" shift, and go to state 513 + "namespace (T_NAMESPACE)" shift, and go to state 514 "__NAMESPACE__ (T_NS_C)" shift, and go to state 75 "__DIR__ (T_DIR)" shift, and go to state 76 - "\\ (T_NS_SEPARATOR)" shift, and go to state 511 - '(' shift, and go to state 512 + "\\ (T_NS_SEPARATOR)" shift, and go to state 515 + '(' shift, and go to state 516 - namespace_name go to state 513 - class_name go to state 514 - common_scalar go to state 515 - static_class_constant go to state 516 - static_scalar go to state 1059 - static_scalar_value go to state 518 - static_operation go to state 519 - static_class_name_scalar go to state 520 + namespace_name go to state 517 + class_name go to state 518 + common_scalar go to state 519 + static_class_constant go to state 520 + static_scalar go to state 1063 + static_scalar_value go to state 522 + static_operation go to state 523 + static_class_name_scalar go to state 524 -state 1052 +state 1056 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" $@40 '(' . parameter_list ')' method_body "identifier (T_STRING)" shift, and go to state 123 - "array (T_ARRAY)" shift, and go to state 708 - "callable (T_CALLABLE)" shift, and go to state 709 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "array (T_ARRAY)" shift, and go to state 712 + "callable (T_CALLABLE)" shift, and go to state 713 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 ')' reduce using rule 178 (parameter_list) $default reduce using rule 183 (optional_class_type) - namespace_name go to state 576 - parameter_list go to state 1060 - non_empty_parameter_list go to state 711 - parameter go to state 712 - optional_class_type go to state 713 - fully_qualified_class_name go to state 714 + namespace_name go to state 580 + parameter_list go to state 1064 + non_empty_parameter_list go to state 715 + parameter go to state 716 + optional_class_type go to state 717 + fully_qualified_class_name go to state 718 -state 1053 +state 1057 - 374 lexical_var_list: lexical_var_list ',' '&' "variable (T_VARIABLE)" . + 376 lexical_var_list: lexical_var_list ',' '&' "variable (T_VARIABLE)" . - $default reduce using rule 374 (lexical_var_list) + $default reduce using rule 376 (lexical_var_list) -state 1054 +state 1058 41 inner_statement_list: inner_statement_list . $@4 inner_statement 147 for_statement: ':' inner_statement_list . "endfor (T_ENDFOR)" ';' - "endfor (T_ENDFOR)" shift, and go to state 1061 + "endfor (T_ENDFOR)" shift, and go to state 1065 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1055 +state 1059 149 foreach_statement: ':' inner_statement_list "endforeach (T_ENDFOREACH)" ';' . $default reduce using rule 149 (foreach_statement) -state 1056 +state 1060 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 . '{' inner_statement_list '}' $@27 additional_catches - '{' shift, and go to state 1062 + '{' shift, and go to state 1066 -state 1057 +state 1061 232 trait_alias: trait_method_reference "as (T_AS)" trait_modifiers "identifier (T_STRING)" . $default reduce using rule 232 (trait_alias) -state 1058 +state 1062 228 trait_reference_list: trait_reference_list ',' . fully_qualified_class_name "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 1063 + namespace_name go to state 580 + fully_qualified_class_name go to state 1067 -state 1059 +state 1063 251 class_variable_declaration: class_variable_declaration ',' "variable (T_VARIABLE)" '=' static_scalar . $default reduce using rule 251 (class_variable_declaration) -state 1060 +state 1064 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" $@40 '(' parameter_list . ')' method_body - ')' shift, and go to state 1064 + ')' shift, and go to state 1068 -state 1061 +state 1065 147 for_statement: ':' inner_statement_list "endfor (T_ENDFOR)" . ';' - ';' shift, and go to state 1065 + ';' shift, and go to state 1069 -state 1062 +state 1066 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' . inner_statement_list '}' $@27 additional_catches $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1066 + inner_statement_list go to state 1070 -state 1063 +state 1067 228 trait_reference_list: trait_reference_list ',' fully_qualified_class_name . $default reduce using rule 228 (trait_reference_list) -state 1064 +state 1068 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" $@40 '(' parameter_list ')' . method_body - ';' shift, and go to state 1067 - '{' shift, and go to state 1068 + ';' shift, and go to state 1071 + '{' shift, and go to state 1072 - method_body go to state 1069 + method_body go to state 1073 -state 1065 +state 1069 147 for_statement: ':' inner_statement_list "endfor (T_ENDFOR)" ';' . $default reduce using rule 147 (for_statement) -state 1066 +state 1070 41 inner_statement_list: inner_statement_list . $@4 inner_statement 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list . '}' $@27 additional_catches - '}' shift, and go to state 1070 + '}' shift, and go to state 1074 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1067 +state 1071 236 method_body: ';' . $default reduce using rule 236 (method_body) -state 1068 +state 1072 237 method_body: '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1071 + inner_statement_list go to state 1075 -state 1069 +state 1073 214 class_statement: method_modifiers function is_reference "identifier (T_STRING)" $@40 '(' parameter_list ')' method_body . $default reduce using rule 214 (class_statement) -state 1070 +state 1074 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' . $@27 additional_catches $default reduce using rule 100 ($@27) - $@27 go to state 1072 + $@27 go to state 1076 -state 1071 +state 1075 41 inner_statement_list: inner_statement_list . $@4 inner_statement 237 method_body: '{' inner_statement_list . '}' - '}' shift, and go to state 1073 + '}' shift, and go to state 1077 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1072 +state 1076 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 . additional_catches - "catch (T_CATCH)" shift, and go to state 1074 + "catch (T_CATCH)" shift, and go to state 1078 $default reduce using rule 106 (additional_catches) - additional_catches go to state 1075 - non_empty_additional_catches go to state 1076 - additional_catch go to state 1077 + additional_catches go to state 1079 + non_empty_additional_catches go to state 1080 + additional_catch go to state 1081 -state 1073 +state 1077 237 method_body: '{' inner_statement_list '}' . $default reduce using rule 237 (method_body) -state 1074 +state 1078 111 additional_catch: "catch (T_CATCH)" . '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list '}' - '(' shift, and go to state 1078 + '(' shift, and go to state 1082 -state 1075 +state 1079 101 catch_statement: "catch (T_CATCH)" '(' $@24 fully_qualified_class_name $@25 "variable (T_VARIABLE)" ')' $@26 '{' inner_statement_list '}' $@27 additional_catches . $default reduce using rule 101 (catch_statement) -state 1076 +state 1080 105 additional_catches: non_empty_additional_catches . 108 non_empty_additional_catches: non_empty_additional_catches . additional_catch - "catch (T_CATCH)" shift, and go to state 1074 + "catch (T_CATCH)" shift, and go to state 1078 $default reduce using rule 105 (additional_catches) - additional_catch go to state 1079 + additional_catch go to state 1083 -state 1077 +state 1081 107 non_empty_additional_catches: additional_catch . $default reduce using rule 107 (non_empty_additional_catches) -state 1078 +state 1082 111 additional_catch: "catch (T_CATCH)" '(' . fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list '}' "identifier (T_STRING)" shift, and go to state 123 - "namespace (T_NAMESPACE)" shift, and go to state 574 - "\\ (T_NS_SEPARATOR)" shift, and go to state 575 + "namespace (T_NAMESPACE)" shift, and go to state 578 + "\\ (T_NS_SEPARATOR)" shift, and go to state 579 - namespace_name go to state 576 - fully_qualified_class_name go to state 1080 + namespace_name go to state 580 + fully_qualified_class_name go to state 1084 -state 1079 +state 1083 108 non_empty_additional_catches: non_empty_additional_catches additional_catch . $default reduce using rule 108 (non_empty_additional_catches) -state 1080 +state 1084 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name . @29 "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list '}' $default reduce using rule 109 (@29) - @29 go to state 1081 + @29 go to state 1085 -state 1081 +state 1085 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 . "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list '}' - "variable (T_VARIABLE)" shift, and go to state 1082 + "variable (T_VARIABLE)" shift, and go to state 1086 -state 1082 +state 1086 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" . ')' $@30 '{' inner_statement_list '}' - ')' shift, and go to state 1083 + ')' shift, and go to state 1087 -state 1083 +state 1087 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' . $@30 '{' inner_statement_list '}' $default reduce using rule 110 ($@30) - $@30 go to state 1084 + $@30 go to state 1088 -state 1084 +state 1088 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 . '{' inner_statement_list '}' - '{' shift, and go to state 1085 + '{' shift, and go to state 1089 -state 1085 +state 1089 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 '{' . inner_statement_list '}' $default reduce using rule 42 (inner_statement_list) - inner_statement_list go to state 1086 + inner_statement_list go to state 1090 -state 1086 +state 1090 41 inner_statement_list: inner_statement_list . $@4 inner_statement 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list . '}' - '}' shift, and go to state 1087 + '}' shift, and go to state 1091 $default reduce using rule 40 ($@4) - $@4 go to state 400 + $@4 go to state 402 -state 1087 +state 1091 111 additional_catch: "catch (T_CATCH)" '(' fully_qualified_class_name @29 "variable (T_VARIABLE)" ')' $@30 '{' inner_statement_list '}' . diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index a4bc612bc..5d3f73bea 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -72,7 +72,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_PRINT "print (T_PRINT)" %right T_YIELD %token T_YIELD "yield (T_YIELD)" -%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 +%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 %token T_PLUS_EQUAL "+= (T_PLUS_EQUAL)" %token T_MINUS_EQUAL "-= (T_MINUS_EQUAL)" %token T_MUL_EQUAL "*= (T_MUL_EQUAL)" @@ -109,6 +109,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %nonassoc T_INSTANCEOF %token T_INSTANCEOF "instanceof (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 '@' +%right T_POW %token T_INC "++ (T_INC)" %token T_DEC "-- (T_DEC)" %token T_INT_CAST "(int) (T_INT_CAST)" @@ -213,6 +214,8 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_DIR "__DIR__ (T_DIR)" %token T_NS_SEPARATOR "\\ (T_NS_SEPARATOR)" %token T_ELLIPSIS "... (T_ELLIPSIS)" +%token T_POW "** (T_POW)" +%token T_POW_EQUAL "**= (T_POW_EQUAL)" %% /* Rules */ @@ -778,6 +781,7 @@ expr_without_variable: | variable T_PLUS_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 TSRMLS_CC); } | variable T_MINUS_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 TSRMLS_CC); } | variable T_MUL_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 TSRMLS_CC); } + | variable T_POW_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_POW, &$$, &$1, &$3 TSRMLS_CC); } | variable T_DIV_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_DIV, &$$, &$1, &$3 TSRMLS_CC); } | variable T_CONCAT_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_CONCAT, &$$, &$1, &$3 TSRMLS_CC); } | variable T_MOD_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MOD, &$$, &$1, &$3 TSRMLS_CC); } @@ -802,6 +806,7 @@ expr_without_variable: | expr '+' expr { zend_do_binary_op(ZEND_ADD, &$$, &$1, &$3 TSRMLS_CC); } | expr '-' expr { zend_do_binary_op(ZEND_SUB, &$$, &$1, &$3 TSRMLS_CC); } | expr '*' expr { zend_do_binary_op(ZEND_MUL, &$$, &$1, &$3 TSRMLS_CC); } + | expr T_POW expr { zend_do_binary_op(ZEND_POW, &$$, &$1, &$3 TSRMLS_CC); } | expr '/' expr { zend_do_binary_op(ZEND_DIV, &$$, &$1, &$3 TSRMLS_CC); } | expr '%' expr { zend_do_binary_op(ZEND_MOD, &$$, &$1, &$3 TSRMLS_CC); } | expr T_SL expr { zend_do_binary_op(ZEND_SL, &$$, &$1, &$3 TSRMLS_CC); } diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 8e958d73d..05f9e4ed7 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Dec 22 13:03:33 2013 */ +/* Generated by re2c 0.13.5 */ #line 1 "Zend/zend_language_scanner.l" /* +----------------------------------------------------------------------+ @@ -1096,7 +1096,7 @@ yyc_INITIAL: yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1741 "Zend/zend_language_scanner.l" +#line 1749 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1174,7 +1174,7 @@ yy5: yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1731 "Zend/zend_language_scanner.l" +#line 1739 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1191,7 +1191,7 @@ yy7: if ((yych = *YYCURSOR) == '=') goto yy43; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1712 "Zend/zend_language_scanner.l" +#line 1720 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1387,7 +1387,7 @@ yy35: ++YYCURSOR; YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1678 "Zend/zend_language_scanner.l" +#line 1686 "Zend/zend_language_scanner.l" { YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1)); @@ -1429,7 +1429,7 @@ yy43: ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1694 "Zend/zend_language_scanner.l" +#line 1702 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1445,7 +1445,7 @@ yy45: ++YYCURSOR; YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1705 "Zend/zend_language_scanner.l" +#line 1713 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); @@ -1478,7 +1478,7 @@ yy50: yy51: YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1723 "Zend/zend_language_scanner.l" +#line 1731 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); @@ -1556,7 +1556,7 @@ yyc_ST_BACKQUOTE: yy56: YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2186 "Zend/zend_language_scanner.l" +#line 2194 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1608,7 +1608,7 @@ yy58: ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2130 "Zend/zend_language_scanner.l" +#line 2138 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '`'; @@ -1623,7 +1623,7 @@ yy61: ++YYCURSOR; YYDEBUG(62, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2117 "Zend/zend_language_scanner.l" +#line 2125 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1646,7 +1646,7 @@ yy63: yy65: YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1823 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1658,7 +1658,7 @@ yy66: ++YYCURSOR; YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1457 "Zend/zend_language_scanner.l" +#line 1465 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1677,7 +1677,7 @@ yy70: ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1815 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1703,7 +1703,7 @@ yy73: ++YYCURSOR; YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1805 "Zend/zend_language_scanner.l" +#line 1813 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1779,7 +1779,7 @@ yy77: yy78: YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2136 "Zend/zend_language_scanner.l" +#line 2144 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1839,7 +1839,7 @@ yy80: ++YYCURSOR; YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2125 "Zend/zend_language_scanner.l" +#line 2133 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '"'; @@ -1854,7 +1854,7 @@ yy83: ++YYCURSOR; YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2117 "Zend/zend_language_scanner.l" +#line 2125 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1877,7 +1877,7 @@ yy85: yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1823 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1889,7 +1889,7 @@ yy88: ++YYCURSOR; YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1457 "Zend/zend_language_scanner.l" +#line 1465 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1908,7 +1908,7 @@ yy92: ++YYCURSOR; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1815 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1934,7 +1934,7 @@ yy95: ++YYCURSOR; YYDEBUG(96, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1805 "Zend/zend_language_scanner.l" +#line 1813 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1953,7 +1953,7 @@ yyc_ST_END_HEREDOC: ++YYCURSOR; YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2103 "Zend/zend_language_scanner.l" +#line 2111 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -2028,7 +2028,7 @@ yy103: yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2228 "Zend/zend_language_scanner.l" +#line 2236 "Zend/zend_language_scanner.l" { int newline = 0; @@ -2116,7 +2116,7 @@ yy107: ++YYCURSOR; YYDEBUG(108, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2117 "Zend/zend_language_scanner.l" +#line 2125 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -2139,7 +2139,7 @@ yy109: yy111: YYDEBUG(111, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1823 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -2151,7 +2151,7 @@ yy112: ++YYCURSOR; YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1457 "Zend/zend_language_scanner.l" +#line 1465 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -2170,7 +2170,7 @@ yy116: ++YYCURSOR; YYDEBUG(117, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1815 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -2196,7 +2196,7 @@ yy119: ++YYCURSOR; YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1805 "Zend/zend_language_scanner.l" +#line 1813 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -2371,23 +2371,23 @@ yy123: YYDEBUG(-1, yych); switch ((yych = *YYCURSOR)) { case 'C': - case 'c': goto yy738; + case 'c': goto yy742; case 'L': - case 'l': goto yy739; + case 'l': goto yy743; case 'M': - case 'm': goto yy740; + case 'm': goto yy744; case 'N': - case 'n': goto yy741; + case 'n': goto yy745; case 'V': - case 'v': goto yy742; + case 'v': goto yy746; case 'X': - case 'x': goto yy743; + case 'x': goto yy747; default: goto yy187; } yy124: YYDEBUG(124, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1846 "Zend/zend_language_scanner.l" +#line 1854 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; @@ -2399,20 +2399,20 @@ yy125: yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'H') { - if (yych == 'E') goto yy720; + if (yych == 'E') goto yy724; goto yy187; } else { - if (yych <= 'I') goto yy721; + if (yych <= 'I') goto yy725; if (yych <= 'N') goto yy187; - goto yy722; + goto yy726; } } else { if (yych <= 'h') { - if (yych == 'e') goto yy720; + if (yych == 'e') goto yy724; goto yy187; } else { - if (yych <= 'i') goto yy721; - if (yych == 'o') goto yy722; + if (yych <= 'i') goto yy725; + if (yych == 'o') goto yy726; goto yy187; } } @@ -2421,20 +2421,20 @@ yy126: yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= 'N') { - if (yych == 'I') goto yy696; + if (yych == 'I') goto yy700; goto yy187; } else { - if (yych <= 'O') goto yy697; + if (yych <= 'O') goto yy701; if (yych <= 'T') goto yy187; - goto yy698; + goto yy702; } } else { if (yych <= 'n') { - if (yych == 'i') goto yy696; + if (yych == 'i') goto yy700; goto yy187; } else { - if (yych <= 'o') goto yy697; - if (yych == 'u') goto yy698; + if (yych <= 'o') goto yy701; + if (yych == 'u') goto yy702; goto yy187; } } @@ -2443,48 +2443,48 @@ yy127: yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'K') { - if (yych == 'A') goto yy661; + if (yych == 'A') goto yy665; goto yy187; } else { - if (yych <= 'L') goto yy662; + if (yych <= 'L') goto yy666; if (yych <= 'N') goto yy187; - goto yy663; + goto yy667; } } else { if (yych <= 'k') { - if (yych == 'a') goto yy661; + if (yych == 'a') goto yy665; goto yy187; } else { - if (yych <= 'l') goto yy662; - if (yych == 'o') goto yy663; + if (yych <= 'l') goto yy666; + if (yych == 'o') goto yy667; goto yy187; } } yy128: YYDEBUG(128, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy643; - if (yych == 'e') goto yy643; + if (yych == 'E') goto yy647; + if (yych == 'e') goto yy647; goto yy187; yy129: YYDEBUG(129, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy638; - if (yych == 'i') goto yy638; + if (yych == 'I') goto yy642; + if (yych == 'i') goto yy642; goto yy187; yy130: YYDEBUG(130, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { - if (yych == 'H') goto yy626; + if (yych == 'H') goto yy630; if (yych <= 'Q') goto yy187; - goto yy627; + goto yy631; } else { if (yych <= 'h') { if (yych <= 'g') goto yy187; - goto yy626; + goto yy630; } else { - if (yych == 'r') goto yy627; + if (yych == 'r') goto yy631; goto yy187; } } @@ -2493,53 +2493,53 @@ yy131: yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'L') { - if (yych == 'F') goto yy573; + if (yych == 'F') goto yy577; goto yy187; } else { - if (yych <= 'M') goto yy575; - if (yych <= 'N') goto yy576; + if (yych <= 'M') goto yy579; + if (yych <= 'N') goto yy580; if (yych <= 'R') goto yy187; - goto yy577; + goto yy581; } } else { if (yych <= 'm') { - if (yych == 'f') goto yy573; + if (yych == 'f') goto yy577; if (yych <= 'l') goto yy187; - goto yy575; + goto yy579; } else { - if (yych <= 'n') goto yy576; - if (yych == 's') goto yy577; + if (yych <= 'n') goto yy580; + if (yych == 's') goto yy581; goto yy187; } } yy132: YYDEBUG(132, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy568; - if (yych == 'h') goto yy568; + if (yych == 'H') goto yy572; + if (yych == 'h') goto yy572; goto yy187; yy133: YYDEBUG(133, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'M') { - if (yych == 'B') goto yy550; + if (yych == 'B') goto yy554; goto yy187; } else { - if (yych <= 'N') goto yy551; + if (yych <= 'N') goto yy555; if (yych <= 'Q') goto yy187; - if (yych <= 'R') goto yy552; - goto yy553; + if (yych <= 'R') goto yy556; + goto yy557; } } else { if (yych <= 'n') { - if (yych == 'b') goto yy550; + if (yych == 'b') goto yy554; if (yych <= 'm') goto yy187; - goto yy551; + goto yy555; } else { if (yych <= 'q') goto yy187; - if (yych <= 'r') goto yy552; - if (yych <= 's') goto yy553; + if (yych <= 'r') goto yy556; + if (yych <= 's') goto yy557; goto yy187; } } @@ -2547,15 +2547,15 @@ yy134: YYDEBUG(134, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'W') { - if (yych == 'T') goto yy538; + if (yych == 'T') goto yy542; if (yych <= 'V') goto yy187; - goto yy539; + goto yy543; } else { if (yych <= 't') { if (yych <= 's') goto yy187; - goto yy538; + goto yy542; } else { - if (yych == 'w') goto yy539; + if (yych == 'w') goto yy543; goto yy187; } } @@ -2566,18 +2566,18 @@ yy135: if (yych <= ';') { if (yych <= '"') { if (yych <= '!') goto yy187; - goto yy530; + goto yy534; } else { - if (yych == '\'') goto yy531; + if (yych == '\'') goto yy535; goto yy187; } } else { if (yych <= 'R') { - if (yych <= '<') goto yy529; + if (yych <= '<') goto yy533; if (yych <= 'Q') goto yy187; - goto yy532; + goto yy536; } else { - if (yych == 'r') goto yy532; + if (yych == 'r') goto yy536; goto yy187; } } @@ -2585,15 +2585,15 @@ yy136: YYDEBUG(136, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'L') goto yy519; + if (yych == 'L') goto yy523; if (yych <= 'N') goto yy187; - goto yy520; + goto yy524; } else { if (yych <= 'l') { if (yych <= 'k') goto yy187; - goto yy519; + goto yy523; } else { - if (yych == 'o') goto yy520; + if (yych == 'o') goto yy524; goto yy187; } } @@ -2601,15 +2601,15 @@ yy137: YYDEBUG(137, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'R') goto yy495; + if (yych == 'R') goto yy499; if (yych <= 'T') goto yy187; - goto yy496; + goto yy500; } else { if (yych <= 'r') { if (yych <= 'q') goto yy187; - goto yy495; + goto yy499; } else { - if (yych == 'u') goto yy496; + if (yych == 'u') goto yy500; goto yy187; } } @@ -2617,15 +2617,15 @@ yy138: YYDEBUG(138, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '<') { - if (yych == '-') goto yy491; + if (yych == '-') goto yy495; } else { - if (yych <= '=') goto yy489; - if (yych <= '>') goto yy493; + if (yych <= '=') goto yy493; + if (yych <= '>') goto yy497; } yy139: YYDEBUG(139, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1446 "Zend/zend_language_scanner.l" +#line 1454 "Zend/zend_language_scanner.l" { return yytext[0]; } @@ -2634,7 +2634,7 @@ yy140: YYDEBUG(140, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy488; + goto yy492; yy141: YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); @@ -2648,7 +2648,7 @@ yy141: yy142: YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; - if (yych == ':') goto yy485; + if (yych == ':') goto yy489; goto yy139; yy143: YYDEBUG(143, *YYCURSOR); @@ -2665,34 +2665,34 @@ yy145: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { - if (yych == '.') goto yy482; + if (yych == '.') goto yy486; goto yy139; } else { - if (yych <= '9') goto yy478; - if (yych == '=') goto yy480; + if (yych <= '9') goto yy482; + if (yych == '=') goto yy484; goto yy139; } yy146: YYDEBUG(146, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy466; + if (yych == 'A') goto yy470; if (yych <= 'D') goto yy187; - goto yy467; + goto yy471; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy466; + goto yy470; } else { - if (yych == 'e') goto yy467; + if (yych == 'e') goto yy471; goto yy187; } } yy147: YYDEBUG(147, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy463; - if (yych == 'a') goto yy463; + if (yych == 'A') goto yy467; + if (yych == 'a') goto yy467; goto yy187; yy148: YYDEBUG(148, *YYCURSOR); @@ -2701,47 +2701,47 @@ yy148: if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy388; + if (yych == '\t') goto yy392; if (yych <= 0x1F) goto yy139; - goto yy388; + goto yy392; } else { if (yych <= '@') goto yy139; if (yych == 'C') goto yy139; - goto yy388; + goto yy392; } } else { if (yych <= 'I') { - if (yych == 'F') goto yy388; + if (yych == 'F') goto yy392; if (yych <= 'H') goto yy139; - goto yy388; + goto yy392; } else { - if (yych == 'O') goto yy388; + if (yych == 'O') goto yy392; if (yych <= 'Q') goto yy139; - goto yy388; + goto yy392; } } } else { if (yych <= 'f') { if (yych <= 'b') { - if (yych == 'U') goto yy388; + if (yych == 'U') goto yy392; if (yych <= '`') goto yy139; - goto yy388; + goto yy392; } else { - if (yych == 'd') goto yy388; + if (yych == 'd') goto yy392; if (yych <= 'e') goto yy139; - goto yy388; + goto yy392; } } else { if (yych <= 'o') { - if (yych == 'i') goto yy388; + if (yych == 'i') goto yy392; if (yych <= 'n') goto yy139; - goto yy388; + goto yy392; } else { if (yych <= 's') { if (yych <= 'q') goto yy139; - goto yy388; + goto yy392; } else { - if (yych == 'u') goto yy388; + if (yych == 'u') goto yy392; goto yy139; } } @@ -2751,71 +2751,72 @@ yy149: YYDEBUG(149, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { - if (yych == 'N') goto yy379; + if (yych == 'N') goto yy383; if (yych <= 'R') goto yy187; - goto yy380; + goto yy384; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy379; + goto yy383; } else { - if (yych == 's') goto yy380; + if (yych == 's') goto yy384; goto yy187; } } yy150: YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy297; + if (yych == '_') goto yy301; goto yy187; yy151: YYDEBUG(151, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '<') goto yy139; - if (yych <= '=') goto yy291; - if (yych <= '>') goto yy293; + if (yych <= '=') goto yy295; + if (yych <= '>') goto yy297; goto yy139; yy152: YYDEBUG(152, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy287; - if (yych == 'i') goto yy287; + if (yych == 'I') goto yy291; + if (yych == 'i') goto yy291; goto yy187; yy153: YYDEBUG(153, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '+') goto yy285; - if (yych == '=') goto yy283; + if (yych == '+') goto yy289; + if (yych == '=') goto yy287; goto yy139; yy154: YYDEBUG(154, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy280; + if (yych == '=') goto yy284; goto yy139; yy155: YYDEBUG(155, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ';') { - if (yych == '/') goto yy252; + if (yych == '/') goto yy256; goto yy139; } else { - if (yych <= '<') goto yy250; - if (yych <= '=') goto yy253; - if (yych <= '>') goto yy255; + if (yych <= '<') goto yy254; + if (yych <= '=') goto yy257; + if (yych <= '>') goto yy259; goto yy139; } yy156: YYDEBUG(156, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '<') goto yy139; - if (yych <= '=') goto yy246; - if (yych <= '>') goto yy244; + if (yych <= '=') goto yy250; + if (yych <= '>') goto yy248; goto yy139; yy157: YYDEBUG(157, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy242; + if (yych == '*') goto yy242; + if (yych == '=') goto yy244; goto yy139; yy158: YYDEBUG(158, *YYCURSOR); @@ -2892,18 +2893,18 @@ yy168: ++YYCURSOR; YYDEBUG(169, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1451 "Zend/zend_language_scanner.l" +#line 1459 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; } -#line 2901 "Zend/zend_language_scanner.c" +#line 2902 "Zend/zend_language_scanner.c" yy170: YYDEBUG(170, *YYCURSOR); ++YYCURSOR; YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1463 "Zend/zend_language_scanner.l" +#line 1471 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2911,7 +2912,7 @@ yy170: } return '}'; } -#line 2915 "Zend/zend_language_scanner.c" +#line 2916 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yyaccept = 2; @@ -2939,7 +2940,7 @@ yy172: yy173: YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1513 "Zend/zend_language_scanner.l" +#line 1521 "Zend/zend_language_scanner.l" { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); @@ -2960,7 +2961,7 @@ yy173: zendlval->type = IS_LONG; return T_LNUMBER; } -#line 2964 "Zend/zend_language_scanner.c" +#line 2965 "Zend/zend_language_scanner.c" yy174: YYDEBUG(174, *YYCURSOR); yyaccept = 2; @@ -2988,7 +2989,7 @@ yy176: yy177: YYDEBUG(177, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1853 "Zend/zend_language_scanner.l" +#line 1861 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -3022,14 +3023,14 @@ yy177: return T_COMMENT; } -#line 3026 "Zend/zend_language_scanner.c" +#line 3027 "Zend/zend_language_scanner.c" yy178: YYDEBUG(178, *YYCURSOR); ++YYCURSOR; yy179: YYDEBUG(179, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1940 "Zend/zend_language_scanner.l" +#line 1948 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -3095,14 +3096,14 @@ yy179: } return T_CONSTANT_ENCAPSED_STRING; } -#line 3099 "Zend/zend_language_scanner.c" +#line 3100 "Zend/zend_language_scanner.c" yy180: YYDEBUG(180, *YYCURSOR); ++YYCURSOR; yy181: YYDEBUG(181, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2007 "Zend/zend_language_scanner.l" +#line 2015 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -3143,24 +3144,24 @@ yy181: BEGIN(ST_DOUBLE_QUOTES); return '"'; } -#line 3147 "Zend/zend_language_scanner.c" +#line 3148 "Zend/zend_language_scanner.c" yy182: YYDEBUG(182, *YYCURSOR); ++YYCURSOR; YYDEBUG(183, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2097 "Zend/zend_language_scanner.l" +#line 2105 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); return '`'; } -#line 3158 "Zend/zend_language_scanner.c" +#line 3159 "Zend/zend_language_scanner.c" yy184: YYDEBUG(184, *YYCURSOR); ++YYCURSOR; YYDEBUG(185, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2360 "Zend/zend_language_scanner.l" +#line 2368 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -3169,7 +3170,7 @@ yy184: zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 3173 "Zend/zend_language_scanner.c" +#line 3174 "Zend/zend_language_scanner.c" yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; @@ -3196,12 +3197,12 @@ yy188: yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1572 "Zend/zend_language_scanner.l" +#line 1580 "Zend/zend_language_scanner.l" { ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } -#line 3205 "Zend/zend_language_scanner.c" +#line 3206 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yyaccept = 2; @@ -3251,7 +3252,7 @@ yy194: goto yy235; } } else { - goto yy251; + goto yy255; } } yy195: @@ -3293,7 +3294,7 @@ yy200: } YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1489 "Zend/zend_language_scanner.l" +#line 1497 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3317,7 +3318,7 @@ yy200: return T_DNUMBER; } } -#line 3321 "Zend/zend_language_scanner.c" +#line 3322 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; @@ -3329,7 +3330,7 @@ yy203: } YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1534 "Zend/zend_language_scanner.l" +#line 1542 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3353,7 +3354,7 @@ yy203: return T_DNUMBER; } } -#line 3357 "Zend/zend_language_scanner.c" +#line 3358 "Zend/zend_language_scanner.c" yy206: YYDEBUG(206, *YYCURSOR); ++YYCURSOR; @@ -3362,13 +3363,13 @@ yy206: yy207: YYDEBUG(207, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1921 "Zend/zend_language_scanner.l" +#line 1929 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } -#line 3372 "Zend/zend_language_scanner.c" +#line 3373 "Zend/zend_language_scanner.c" yy208: YYDEBUG(208, *YYCURSOR); yych = *++YYCURSOR; @@ -3402,13 +3403,13 @@ yy210: yy212: YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1823 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 3412 "Zend/zend_language_scanner.c" +#line 3413 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); yych = *++YYCURSOR; @@ -3422,11 +3423,11 @@ yy214: } YYDEBUG(215, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1434 "Zend/zend_language_scanner.l" +#line 1442 "Zend/zend_language_scanner.l" { return T_LOGICAL_XOR; } -#line 3430 "Zend/zend_language_scanner.c" +#line 3431 "Zend/zend_language_scanner.c" yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; @@ -3435,61 +3436,61 @@ yy216: } YYDEBUG(217, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1426 "Zend/zend_language_scanner.l" +#line 1434 "Zend/zend_language_scanner.l" { return T_LOGICAL_OR; } -#line 3443 "Zend/zend_language_scanner.c" +#line 3444 "Zend/zend_language_scanner.c" yy218: YYDEBUG(218, *YYCURSOR); ++YYCURSOR; YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1414 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { return T_XOR_EQUAL; } -#line 3453 "Zend/zend_language_scanner.c" +#line 3454 "Zend/zend_language_scanner.c" yy220: YYDEBUG(220, *YYCURSOR); ++YYCURSOR; YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1418 "Zend/zend_language_scanner.l" +#line 1426 "Zend/zend_language_scanner.l" { return T_BOOLEAN_OR; } -#line 3463 "Zend/zend_language_scanner.c" +#line 3464 "Zend/zend_language_scanner.c" yy222: YYDEBUG(222, *YYCURSOR); ++YYCURSOR; YYDEBUG(223, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1410 "Zend/zend_language_scanner.l" +#line 1418 "Zend/zend_language_scanner.l" { return T_OR_EQUAL; } -#line 3473 "Zend/zend_language_scanner.c" +#line 3474 "Zend/zend_language_scanner.c" yy224: YYDEBUG(224, *YYCURSOR); ++YYCURSOR; YYDEBUG(225, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1430 "Zend/zend_language_scanner.l" { return T_BOOLEAN_AND; } -#line 3483 "Zend/zend_language_scanner.c" +#line 3484 "Zend/zend_language_scanner.c" yy226: YYDEBUG(226, *YYCURSOR); ++YYCURSOR; YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1406 "Zend/zend_language_scanner.l" +#line 1414 "Zend/zend_language_scanner.l" { return T_AND_EQUAL; } -#line 3493 "Zend/zend_language_scanner.c" +#line 3494 "Zend/zend_language_scanner.c" yy228: YYDEBUG(228, *YYCURSOR); ++YYCURSOR; @@ -3498,7 +3499,7 @@ yy228: yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1928 "Zend/zend_language_scanner.l" +#line 1936 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { BEGIN(INITIAL); @@ -3509,17 +3510,17 @@ yy229: return yytext[0]; } } -#line 3513 "Zend/zend_language_scanner.c" +#line 3514 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); ++YYCURSOR; YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1394 "Zend/zend_language_scanner.l" +#line 1402 "Zend/zend_language_scanner.l" { return T_MOD_EQUAL; } -#line 3523 "Zend/zend_language_scanner.c" +#line 3524 "Zend/zend_language_scanner.c" yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; @@ -3537,7 +3538,7 @@ yy234: yy235: YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1887 "Zend/zend_language_scanner.l" +#line 1895 "Zend/zend_language_scanner.l" { int doc_com; @@ -3571,7 +3572,7 @@ yy235: return T_COMMENT; } -#line 3575 "Zend/zend_language_scanner.c" +#line 3576 "Zend/zend_language_scanner.c" yy236: YYDEBUG(236, *YYCURSOR); yych = *++YYCURSOR; @@ -3581,11 +3582,11 @@ yy237: ++YYCURSOR; YYDEBUG(238, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1386 "Zend/zend_language_scanner.l" +#line 1394 "Zend/zend_language_scanner.l" { return T_DIV_EQUAL; } -#line 3589 "Zend/zend_language_scanner.c" +#line 3590 "Zend/zend_language_scanner.c" yy239: YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; @@ -3606,246 +3607,267 @@ yy240: yy242: YYDEBUG(242, *YYCURSOR); ++YYCURSOR; + if ((yych = *YYCURSOR) == '=') goto yy246; YYDEBUG(243, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1382 "Zend/zend_language_scanner.l" +#line 1386 "Zend/zend_language_scanner.l" { - return T_MUL_EQUAL; + return T_POW; } -#line 3616 "Zend/zend_language_scanner.c" +#line 3618 "Zend/zend_language_scanner.c" yy244: YYDEBUG(244, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy248; YYDEBUG(245, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1442 "Zend/zend_language_scanner.l" +#line 1382 "Zend/zend_language_scanner.l" { - return T_SR; + return T_MUL_EQUAL; } -#line 3627 "Zend/zend_language_scanner.c" +#line 3628 "Zend/zend_language_scanner.c" yy246: YYDEBUG(246, *YYCURSOR); ++YYCURSOR; YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1370 "Zend/zend_language_scanner.l" +#line 1390 "Zend/zend_language_scanner.l" { - return T_IS_GREATER_OR_EQUAL; + return T_POW_EQUAL; } -#line 3637 "Zend/zend_language_scanner.c" +#line 3638 "Zend/zend_language_scanner.c" yy248: YYDEBUG(248, *YYCURSOR); ++YYCURSOR; + if ((yych = *YYCURSOR) == '=') goto yy252; YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1402 "Zend/zend_language_scanner.l" +#line 1450 "Zend/zend_language_scanner.l" { - return T_SR_EQUAL; + return T_SR; } -#line 3647 "Zend/zend_language_scanner.c" +#line 3649 "Zend/zend_language_scanner.c" yy250: YYDEBUG(250, *YYCURSOR); - yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') goto yy251; - if (yych <= '<') goto yy266; - if (yych <= '=') goto yy264; -yy251: + ++YYCURSOR; YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1438 "Zend/zend_language_scanner.l" +#line 1370 "Zend/zend_language_scanner.l" { - return T_SL; + return T_IS_GREATER_OR_EQUAL; } -#line 3662 "Zend/zend_language_scanner.c" +#line 3659 "Zend/zend_language_scanner.c" yy252: YYDEBUG(252, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(253, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1410 "Zend/zend_language_scanner.l" + { + return T_SR_EQUAL; +} +#line 3669 "Zend/zend_language_scanner.c" +yy254: + YYDEBUG(254, *YYCURSOR); + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ';') goto yy255; + if (yych <= '<') goto yy270; + if (yych <= '=') goto yy268; +yy255: + YYDEBUG(255, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1446 "Zend/zend_language_scanner.l" + { + return T_SL; +} +#line 3684 "Zend/zend_language_scanner.c" +yy256: + YYDEBUG(256, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy257; - if (yych == 's') goto yy257; + if (yych == 'S') goto yy261; + if (yych == 's') goto yy261; goto yy194; -yy253: - YYDEBUG(253, *YYCURSOR); +yy257: + YYDEBUG(257, *YYCURSOR); ++YYCURSOR; - YYDEBUG(254, *YYCURSOR); + YYDEBUG(258, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1366 "Zend/zend_language_scanner.l" { return T_IS_SMALLER_OR_EQUAL; } -#line 3678 "Zend/zend_language_scanner.c" -yy255: - YYDEBUG(255, *YYCURSOR); +#line 3700 "Zend/zend_language_scanner.c" +yy259: + YYDEBUG(259, *YYCURSOR); ++YYCURSOR; -yy256: - YYDEBUG(256, *YYCURSOR); +yy260: + YYDEBUG(260, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1362 "Zend/zend_language_scanner.l" { return T_IS_NOT_EQUAL; } -#line 3689 "Zend/zend_language_scanner.c" -yy257: - YYDEBUG(257, *YYCURSOR); +#line 3711 "Zend/zend_language_scanner.c" +yy261: + YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy258; + if (yych == 'C') goto yy262; if (yych != 'c') goto yy194; -yy258: - YYDEBUG(258, *YYCURSOR); +yy262: + YYDEBUG(262, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy259; + if (yych == 'R') goto yy263; if (yych != 'r') goto yy194; -yy259: - YYDEBUG(259, *YYCURSOR); +yy263: + YYDEBUG(263, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy260; + if (yych == 'I') goto yy264; if (yych != 'i') goto yy194; -yy260: - YYDEBUG(260, *YYCURSOR); +yy264: + YYDEBUG(264, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy261; + if (yych == 'P') goto yy265; if (yych != 'p') goto yy194; -yy261: - YYDEBUG(261, *YYCURSOR); +yy265: + YYDEBUG(265, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy262; + if (yych == 'T') goto yy266; if (yych != 't') goto yy194; -yy262: - YYDEBUG(262, *YYCURSOR); +yy266: + YYDEBUG(266, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(263, *YYCURSOR); + YYDEBUG(267, *YYCURSOR); if (yych <= '\r') { if (yych <= 0x08) goto yy194; - if (yych <= '\n') goto yy262; + if (yych <= '\n') goto yy266; if (yych <= '\f') goto yy194; - goto yy262; + goto yy266; } else { if (yych <= ' ') { if (yych <= 0x1F) goto yy194; - goto yy262; + goto yy266; } else { if (yych == '>') goto yy206; goto yy194; } } -yy264: - YYDEBUG(264, *YYCURSOR); +yy268: + YYDEBUG(268, *YYCURSOR); ++YYCURSOR; - YYDEBUG(265, *YYCURSOR); + YYDEBUG(269, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1398 "Zend/zend_language_scanner.l" +#line 1406 "Zend/zend_language_scanner.l" { return T_SL_EQUAL; } -#line 3744 "Zend/zend_language_scanner.c" -yy266: - YYDEBUG(266, *YYCURSOR); +#line 3766 "Zend/zend_language_scanner.c" +yy270: + YYDEBUG(270, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(267, *YYCURSOR); + YYDEBUG(271, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy266; + goto yy270; } if (yych <= 'Z') { if (yych <= '&') { - if (yych == '"') goto yy271; + if (yych == '"') goto yy275; goto yy194; } else { - if (yych <= '\'') goto yy270; + if (yych <= '\'') goto yy274; if (yych <= '@') goto yy194; } } else { if (yych <= '`') { if (yych != '_') goto yy194; } else { - if (yych <= 'z') goto yy268; + if (yych <= 'z') goto yy272; if (yych <= '~') goto yy194; } } -yy268: - YYDEBUG(268, *YYCURSOR); +yy272: + YYDEBUG(272, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(269, *YYCURSOR); + YYDEBUG(273, *YYCURSOR); if (yych <= '@') { if (yych <= '\f') { - if (yych == '\n') goto yy275; + if (yych == '\n') goto yy279; goto yy194; } else { - if (yych <= '\r') goto yy277; + if (yych <= '\r') goto yy281; if (yych <= '/') goto yy194; - if (yych <= '9') goto yy268; + if (yych <= '9') goto yy272; goto yy194; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy268; + if (yych <= 'Z') goto yy272; if (yych <= '^') goto yy194; - goto yy268; + goto yy272; } else { if (yych <= '`') goto yy194; - if (yych <= 'z') goto yy268; + if (yych <= 'z') goto yy272; if (yych <= '~') goto yy194; - goto yy268; + goto yy272; } } -yy270: - YYDEBUG(270, *YYCURSOR); +yy274: + YYDEBUG(274, *YYCURSOR); yych = *++YYCURSOR; if (yych == '\'') goto yy194; - if (yych <= '/') goto yy279; + if (yych <= '/') goto yy283; if (yych <= '9') goto yy194; - goto yy279; -yy271: - YYDEBUG(271, *YYCURSOR); + goto yy283; +yy275: + YYDEBUG(275, *YYCURSOR); yych = *++YYCURSOR; if (yych == '"') goto yy194; - if (yych <= '/') goto yy273; + if (yych <= '/') goto yy277; if (yych <= '9') goto yy194; - goto yy273; -yy272: - YYDEBUG(272, *YYCURSOR); + goto yy277; +yy276: + YYDEBUG(276, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy273: - YYDEBUG(273, *YYCURSOR); +yy277: + YYDEBUG(277, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { if (yych != '"') goto yy194; } else { - if (yych <= '9') goto yy272; + if (yych <= '9') goto yy276; if (yych <= '@') goto yy194; - goto yy272; + goto yy276; } } else { if (yych <= '`') { - if (yych == '_') goto yy272; + if (yych == '_') goto yy276; goto yy194; } else { - if (yych <= 'z') goto yy272; + if (yych <= 'z') goto yy276; if (yych <= '~') goto yy194; - goto yy272; + goto yy276; } } -yy274: - YYDEBUG(274, *YYCURSOR); +yy278: + YYDEBUG(278, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy275; - if (yych == '\r') goto yy277; + if (yych == '\n') goto yy279; + if (yych == '\r') goto yy281; goto yy194; -yy275: - YYDEBUG(275, *YYCURSOR); +yy279: + YYDEBUG(279, *YYCURSOR); ++YYCURSOR; -yy276: - YYDEBUG(276, *YYCURSOR); +yy280: + YYDEBUG(280, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2049 "Zend/zend_language_scanner.l" +#line 2057 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3892,255 +3914,255 @@ yy276: return T_START_HEREDOC; } -#line 3896 "Zend/zend_language_scanner.c" -yy277: - YYDEBUG(277, *YYCURSOR); +#line 3918 "Zend/zend_language_scanner.c" +yy281: + YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy275; - goto yy276; -yy278: - YYDEBUG(278, *YYCURSOR); + if (yych == '\n') goto yy279; + goto yy280; +yy282: + YYDEBUG(282, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy279: - YYDEBUG(279, *YYCURSOR); +yy283: + YYDEBUG(283, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { - if (yych == '\'') goto yy274; + if (yych == '\'') goto yy278; goto yy194; } else { - if (yych <= '9') goto yy278; + if (yych <= '9') goto yy282; if (yych <= '@') goto yy194; - goto yy278; + goto yy282; } } else { if (yych <= '`') { - if (yych == '_') goto yy278; + if (yych == '_') goto yy282; goto yy194; } else { - if (yych <= 'z') goto yy278; + if (yych <= 'z') goto yy282; if (yych <= '~') goto yy194; - goto yy278; + goto yy282; } } -yy280: - YYDEBUG(280, *YYCURSOR); +yy284: + YYDEBUG(284, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '=') goto yy256; - YYDEBUG(281, *YYCURSOR); + if (yych != '=') goto yy260; + YYDEBUG(285, *YYCURSOR); ++YYCURSOR; - YYDEBUG(282, *YYCURSOR); + YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1354 "Zend/zend_language_scanner.l" { return T_IS_NOT_IDENTICAL; } -#line 3940 "Zend/zend_language_scanner.c" -yy283: - YYDEBUG(283, *YYCURSOR); +#line 3962 "Zend/zend_language_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); ++YYCURSOR; - YYDEBUG(284, *YYCURSOR); + YYDEBUG(288, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1374 "Zend/zend_language_scanner.l" { return T_PLUS_EQUAL; } -#line 3950 "Zend/zend_language_scanner.c" -yy285: - YYDEBUG(285, *YYCURSOR); +#line 3972 "Zend/zend_language_scanner.c" +yy289: + YYDEBUG(289, *YYCURSOR); ++YYCURSOR; - YYDEBUG(286, *YYCURSOR); + YYDEBUG(290, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1342 "Zend/zend_language_scanner.l" { return T_INC; } -#line 3960 "Zend/zend_language_scanner.c" -yy287: - YYDEBUG(287, *YYCURSOR); +#line 3982 "Zend/zend_language_scanner.c" +yy291: + YYDEBUG(291, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy288; + if (yych == 'S') goto yy292; if (yych != 's') goto yy187; -yy288: - YYDEBUG(288, *YYCURSOR); +yy292: + YYDEBUG(292, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy289; + if (yych == 'T') goto yy293; if (yych != 't') goto yy187; -yy289: - YYDEBUG(289, *YYCURSOR); +yy293: + YYDEBUG(293, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(290, *YYCURSOR); + YYDEBUG(294, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1330 "Zend/zend_language_scanner.l" { return T_LIST; } -#line 3983 "Zend/zend_language_scanner.c" -yy291: - YYDEBUG(291, *YYCURSOR); +#line 4005 "Zend/zend_language_scanner.c" +yy295: + YYDEBUG(295, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy295; - YYDEBUG(292, *YYCURSOR); + if ((yych = *YYCURSOR) == '=') goto yy299; + YYDEBUG(296, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1358 "Zend/zend_language_scanner.l" { return T_IS_EQUAL; } -#line 3994 "Zend/zend_language_scanner.c" -yy293: - YYDEBUG(293, *YYCURSOR); +#line 4016 "Zend/zend_language_scanner.c" +yy297: + YYDEBUG(297, *YYCURSOR); ++YYCURSOR; - YYDEBUG(294, *YYCURSOR); + YYDEBUG(298, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1326 "Zend/zend_language_scanner.l" { return T_DOUBLE_ARROW; } -#line 4004 "Zend/zend_language_scanner.c" -yy295: - YYDEBUG(295, *YYCURSOR); +#line 4026 "Zend/zend_language_scanner.c" +yy299: + YYDEBUG(299, *YYCURSOR); ++YYCURSOR; - YYDEBUG(296, *YYCURSOR); + YYDEBUG(300, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1350 "Zend/zend_language_scanner.l" { return T_IS_IDENTICAL; } -#line 4014 "Zend/zend_language_scanner.c" -yy297: - YYDEBUG(297, *YYCURSOR); +#line 4036 "Zend/zend_language_scanner.c" +yy301: + YYDEBUG(301, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'C': - case 'c': goto yy299; + case 'c': goto yy303; case 'D': - case 'd': goto yy304; + case 'd': goto yy308; case 'F': - case 'f': goto yy301; + case 'f': goto yy305; case 'H': - case 'h': goto yy298; + case 'h': goto yy302; case 'L': - case 'l': goto yy303; + case 'l': goto yy307; case 'M': - case 'm': goto yy302; + case 'm': goto yy306; case 'N': - case 'n': goto yy305; + case 'n': goto yy309; case 'T': - case 't': goto yy300; + case 't': goto yy304; default: goto yy187; } -yy298: - YYDEBUG(298, *YYCURSOR); +yy302: + YYDEBUG(302, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy366; - if (yych == 'a') goto yy366; + if (yych == 'A') goto yy370; + if (yych == 'a') goto yy370; goto yy187; -yy299: - YYDEBUG(299, *YYCURSOR); +yy303: + YYDEBUG(303, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy359; - if (yych == 'l') goto yy359; + if (yych == 'L') goto yy363; + if (yych == 'l') goto yy363; goto yy187; -yy300: - YYDEBUG(300, *YYCURSOR); +yy304: + YYDEBUG(304, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy352; - if (yych == 'r') goto yy352; + if (yych == 'R') goto yy356; + if (yych == 'r') goto yy356; goto yy187; -yy301: - YYDEBUG(301, *YYCURSOR); +yy305: + YYDEBUG(305, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'I') goto yy336; + if (yych == 'I') goto yy340; if (yych <= 'T') goto yy187; - goto yy337; + goto yy341; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy336; + goto yy340; } else { - if (yych == 'u') goto yy337; + if (yych == 'u') goto yy341; goto yy187; } } -yy302: - YYDEBUG(302, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy328; - if (yych == 'e') goto yy328; - goto yy187; -yy303: - YYDEBUG(303, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy322; - if (yych == 'i') goto yy322; - goto yy187; -yy304: - YYDEBUG(304, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy317; - if (yych == 'i') goto yy317; - goto yy187; -yy305: - YYDEBUG(305, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy306; - if (yych != 'a') goto yy187; yy306: YYDEBUG(306, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy307; - if (yych != 'm') goto yy187; + if (yych == 'E') goto yy332; + if (yych == 'e') goto yy332; + goto yy187; yy307: YYDEBUG(307, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy308; - if (yych != 'e') goto yy187; + if (yych == 'I') goto yy326; + if (yych == 'i') goto yy326; + goto yy187; yy308: YYDEBUG(308, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy309; - if (yych != 's') goto yy187; + if (yych == 'I') goto yy321; + if (yych == 'i') goto yy321; + goto yy187; yy309: YYDEBUG(309, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy310; - if (yych != 'p') goto yy187; + if (yych == 'A') goto yy310; + if (yych != 'a') goto yy187; yy310: YYDEBUG(310, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy311; - if (yych != 'a') goto yy187; + if (yych == 'M') goto yy311; + if (yych != 'm') goto yy187; yy311: YYDEBUG(311, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy312; - if (yych != 'c') goto yy187; + if (yych == 'E') goto yy312; + if (yych != 'e') goto yy187; yy312: YYDEBUG(312, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy313; - if (yych != 'e') goto yy187; + if (yych == 'S') goto yy313; + if (yych != 's') goto yy187; yy313: YYDEBUG(313, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '_') goto yy187; + if (yych == 'P') goto yy314; + if (yych != 'p') goto yy187; +yy314: YYDEBUG(314, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '_') goto yy187; + if (yych == 'A') goto yy315; + if (yych != 'a') goto yy187; +yy315: YYDEBUG(315, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'C') goto yy316; + if (yych != 'c') goto yy187; +yy316: + YYDEBUG(316, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy317; + if (yych != 'e') goto yy187; +yy317: + YYDEBUG(317, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '_') goto yy187; + YYDEBUG(318, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '_') goto yy187; + YYDEBUG(319, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(316, *YYCURSOR); + YYDEBUG(320, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1668 "Zend/zend_language_scanner.l" +#line 1676 "Zend/zend_language_scanner.l" { if (CG(current_namespace)) { *zendlval = *CG(current_namespace); @@ -4150,27 +4172,27 @@ yy313: } return T_NS_C; } -#line 4154 "Zend/zend_language_scanner.c" -yy317: - YYDEBUG(317, *YYCURSOR); +#line 4176 "Zend/zend_language_scanner.c" +yy321: + YYDEBUG(321, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy318; + if (yych == 'R') goto yy322; if (yych != 'r') goto yy187; -yy318: - YYDEBUG(318, *YYCURSOR); +yy322: + YYDEBUG(322, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(319, *YYCURSOR); + YYDEBUG(323, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(320, *YYCURSOR); + YYDEBUG(324, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(321, *YYCURSOR); + YYDEBUG(325, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1643 "Zend/zend_language_scanner.l" +#line 1651 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); const size_t filename_len = strlen(filename); @@ -4195,72 +4217,72 @@ yy318: ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } -#line 4199 "Zend/zend_language_scanner.c" -yy322: - YYDEBUG(322, *YYCURSOR); +#line 4221 "Zend/zend_language_scanner.c" +yy326: + YYDEBUG(326, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy323; + if (yych == 'N') goto yy327; if (yych != 'n') goto yy187; -yy323: - YYDEBUG(323, *YYCURSOR); +yy327: + YYDEBUG(327, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy324; + if (yych == 'E') goto yy328; if (yych != 'e') goto yy187; -yy324: - YYDEBUG(324, *YYCURSOR); +yy328: + YYDEBUG(328, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(325, *YYCURSOR); + YYDEBUG(329, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(326, *YYCURSOR); + YYDEBUG(330, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(327, *YYCURSOR); + YYDEBUG(331, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1628 "Zend/zend_language_scanner.l" +#line 1636 "Zend/zend_language_scanner.l" { ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } -#line 4229 "Zend/zend_language_scanner.c" -yy328: - YYDEBUG(328, *YYCURSOR); +#line 4251 "Zend/zend_language_scanner.c" +yy332: + YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy329; + if (yych == 'T') goto yy333; if (yych != 't') goto yy187; -yy329: - YYDEBUG(329, *YYCURSOR); +yy333: + YYDEBUG(333, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy330; + if (yych == 'H') goto yy334; if (yych != 'h') goto yy187; -yy330: - YYDEBUG(330, *YYCURSOR); +yy334: + YYDEBUG(334, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy331; + if (yych == 'O') goto yy335; if (yych != 'o') goto yy187; -yy331: - YYDEBUG(331, *YYCURSOR); +yy335: + YYDEBUG(335, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy332; + if (yych == 'D') goto yy336; if (yych != 'd') goto yy187; -yy332: - YYDEBUG(332, *YYCURSOR); +yy336: + YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(333, *YYCURSOR); + YYDEBUG(337, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(334, *YYCURSOR); + YYDEBUG(338, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(335, *YYCURSOR); + YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1615 "Zend/zend_language_scanner.l" +#line 1623 "Zend/zend_language_scanner.l" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; @@ -4273,58 +4295,58 @@ yy332: zendlval->type = IS_STRING; return T_METHOD_C; } -#line 4277 "Zend/zend_language_scanner.c" -yy336: - YYDEBUG(336, *YYCURSOR); +#line 4299 "Zend/zend_language_scanner.c" +yy340: + YYDEBUG(340, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy347; - if (yych == 'l') goto yy347; + if (yych == 'L') goto yy351; + if (yych == 'l') goto yy351; goto yy187; -yy337: - YYDEBUG(337, *YYCURSOR); +yy341: + YYDEBUG(341, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy338; + if (yych == 'N') goto yy342; if (yych != 'n') goto yy187; -yy338: - YYDEBUG(338, *YYCURSOR); +yy342: + YYDEBUG(342, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy339; + if (yych == 'C') goto yy343; if (yych != 'c') goto yy187; -yy339: - YYDEBUG(339, *YYCURSOR); +yy343: + YYDEBUG(343, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy340; + if (yych == 'T') goto yy344; if (yych != 't') goto yy187; -yy340: - YYDEBUG(340, *YYCURSOR); +yy344: + YYDEBUG(344, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy341; + if (yych == 'I') goto yy345; if (yych != 'i') goto yy187; -yy341: - YYDEBUG(341, *YYCURSOR); +yy345: + YYDEBUG(345, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy342; + if (yych == 'O') goto yy346; if (yych != 'o') goto yy187; -yy342: - YYDEBUG(342, *YYCURSOR); +yy346: + YYDEBUG(346, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy343; + if (yych == 'N') goto yy347; if (yych != 'n') goto yy187; -yy343: - YYDEBUG(343, *YYCURSOR); +yy347: + YYDEBUG(347, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(344, *YYCURSOR); + YYDEBUG(348, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(345, *YYCURSOR); + YYDEBUG(349, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(346, *YYCURSOR); + YYDEBUG(350, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1605 "Zend/zend_language_scanner.l" +#line 1613 "Zend/zend_language_scanner.l" { zend_op_array *op_array = CG(active_op_array); if (op_array && op_array->function_name) { @@ -4334,27 +4356,27 @@ yy343: } return T_FUNC_C; } -#line 4338 "Zend/zend_language_scanner.c" -yy347: - YYDEBUG(347, *YYCURSOR); +#line 4360 "Zend/zend_language_scanner.c" +yy351: + YYDEBUG(351, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy348; + if (yych == 'E') goto yy352; if (yych != 'e') goto yy187; -yy348: - YYDEBUG(348, *YYCURSOR); +yy352: + YYDEBUG(352, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(349, *YYCURSOR); + YYDEBUG(353, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(350, *YYCURSOR); + YYDEBUG(354, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(351, *YYCURSOR); + YYDEBUG(355, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1633 "Zend/zend_language_scanner.l" +#line 1641 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); @@ -4364,37 +4386,37 @@ yy348: ZVAL_STRING(zendlval, filename, 1); return T_FILE; } -#line 4368 "Zend/zend_language_scanner.c" -yy352: - YYDEBUG(352, *YYCURSOR); +#line 4390 "Zend/zend_language_scanner.c" +yy356: + YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy353; + if (yych == 'A') goto yy357; if (yych != 'a') goto yy187; -yy353: - YYDEBUG(353, *YYCURSOR); +yy357: + YYDEBUG(357, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy354; + if (yych == 'I') goto yy358; if (yych != 'i') goto yy187; -yy354: - YYDEBUG(354, *YYCURSOR); +yy358: + YYDEBUG(358, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy355; + if (yych == 'T') goto yy359; if (yych != 't') goto yy187; -yy355: - YYDEBUG(355, *YYCURSOR); +yy359: + YYDEBUG(359, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(356, *YYCURSOR); + YYDEBUG(360, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(357, *YYCURSOR); + YYDEBUG(361, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(358, *YYCURSOR); + YYDEBUG(362, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1595 "Zend/zend_language_scanner.l" +#line 1603 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4404,37 +4426,37 @@ yy355: } return T_TRAIT_C; } -#line 4408 "Zend/zend_language_scanner.c" -yy359: - YYDEBUG(359, *YYCURSOR); +#line 4430 "Zend/zend_language_scanner.c" +yy363: + YYDEBUG(363, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy360; + if (yych == 'A') goto yy364; if (yych != 'a') goto yy187; -yy360: - YYDEBUG(360, *YYCURSOR); +yy364: + YYDEBUG(364, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy361; + if (yych == 'S') goto yy365; if (yych != 's') goto yy187; -yy361: - YYDEBUG(361, *YYCURSOR); +yy365: + YYDEBUG(365, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy362; + if (yych == 'S') goto yy366; if (yych != 's') goto yy187; -yy362: - YYDEBUG(362, *YYCURSOR); +yy366: + YYDEBUG(366, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(363, *YYCURSOR); + YYDEBUG(367, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(364, *YYCURSOR); + YYDEBUG(368, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(365, *YYCURSOR); + YYDEBUG(369, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1577 "Zend/zend_language_scanner.l" +#line 1585 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4452,84 +4474,60 @@ yy362: } return T_CLASS_C; } -#line 4456 "Zend/zend_language_scanner.c" -yy366: - YYDEBUG(366, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy367; - if (yych != 'l') goto yy187; -yy367: - YYDEBUG(367, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy368; - if (yych != 't') goto yy187; -yy368: - YYDEBUG(368, *YYCURSOR); - yych = *++YYCURSOR; - if (yych != '_') goto yy187; - YYDEBUG(369, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy370; - if (yych != 'c') goto yy187; +#line 4478 "Zend/zend_language_scanner.c" yy370: YYDEBUG(370, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy371; - if (yych != 'o') goto yy187; + if (yych == 'L') goto yy371; + if (yych != 'l') goto yy187; yy371: YYDEBUG(371, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy372; - if (yych != 'm') goto yy187; + if (yych == 'T') goto yy372; + if (yych != 't') goto yy187; yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy373; - if (yych != 'p') goto yy187; -yy373: + if (yych != '_') goto yy187; YYDEBUG(373, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy374; - if (yych != 'i') goto yy187; + if (yych == 'C') goto yy374; + if (yych != 'c') goto yy187; yy374: YYDEBUG(374, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy375; - if (yych != 'l') goto yy187; + if (yych == 'O') goto yy375; + if (yych != 'o') goto yy187; yy375: YYDEBUG(375, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy376; - if (yych != 'e') goto yy187; + if (yych == 'M') goto yy376; + if (yych != 'm') goto yy187; yy376: YYDEBUG(376, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy377; - if (yych != 'r') goto yy187; + if (yych == 'P') goto yy377; + if (yych != 'p') goto yy187; yy377: YYDEBUG(377, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy186; - } + yych = *++YYCURSOR; + if (yych == 'I') goto yy378; + if (yych != 'i') goto yy187; +yy378: YYDEBUG(378, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1294 "Zend/zend_language_scanner.l" - { - return T_HALT_COMPILER; -} -#line 4522 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy379; + if (yych != 'l') goto yy187; yy379: YYDEBUG(379, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy383; - if (yych == 's') goto yy383; - goto yy187; + if (yych == 'E') goto yy380; + if (yych != 'e') goto yy187; yy380: YYDEBUG(380, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy381; - if (yych != 'e') goto yy187; + if (yych == 'R') goto yy381; + if (yych != 'r') goto yy187; yy381: YYDEBUG(381, *YYCURSOR); ++YYCURSOR; @@ -4538,21 +4536,22 @@ yy381: } YYDEBUG(382, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1274 "Zend/zend_language_scanner.l" +#line 1294 "Zend/zend_language_scanner.l" { - return T_USE; + return T_HALT_COMPILER; } -#line 4546 "Zend/zend_language_scanner.c" +#line 4544 "Zend/zend_language_scanner.c" yy383: YYDEBUG(383, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy384; - if (yych != 'e') goto yy187; + if (yych == 'S') goto yy387; + if (yych == 's') goto yy387; + goto yy187; yy384: YYDEBUG(384, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy385; - if (yych != 't') goto yy187; + if (yych == 'E') goto yy385; + if (yych != 'e') goto yy187; yy385: YYDEBUG(385, *YYCURSOR); ++YYCURSOR; @@ -4561,2639 +4560,2662 @@ yy385: } YYDEBUG(386, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1322 "Zend/zend_language_scanner.l" +#line 1274 "Zend/zend_language_scanner.l" { - return T_UNSET; + return T_USE; } -#line 4569 "Zend/zend_language_scanner.c" +#line 4568 "Zend/zend_language_scanner.c" yy387: YYDEBUG(387, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy388; + if (yych != 'e') goto yy187; +yy388: + YYDEBUG(388, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy389; + if (yych != 't') goto yy187; +yy389: + YYDEBUG(389, *YYCURSOR); + ++YYCURSOR; + if (yybm[0+(yych = *YYCURSOR)] & 4) { + goto yy186; + } + YYDEBUG(390, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1322 "Zend/zend_language_scanner.l" + { + return T_UNSET; +} +#line 4591 "Zend/zend_language_scanner.c" +yy391: + YYDEBUG(391, *YYCURSOR); ++YYCURSOR; YYFILL(7); yych = *YYCURSOR; -yy388: - YYDEBUG(388, *YYCURSOR); +yy392: + YYDEBUG(392, *YYCURSOR); if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy387; + if (yych == '\t') goto yy391; if (yych <= 0x1F) goto yy194; - goto yy387; + goto yy391; } else { if (yych <= 'A') { if (yych <= '@') goto yy194; - goto yy392; + goto yy396; } else { - if (yych <= 'B') goto yy390; + if (yych <= 'B') goto yy394; if (yych <= 'C') goto yy194; - goto yy395; + goto yy399; } } } else { if (yych <= 'I') { - if (yych == 'F') goto yy396; + if (yych == 'F') goto yy400; if (yych <= 'H') goto yy194; - goto yy397; + goto yy401; } else { if (yych <= 'O') { if (yych <= 'N') goto yy194; - goto yy391; + goto yy395; } else { if (yych <= 'Q') goto yy194; - if (yych <= 'R') goto yy394; - goto yy393; + if (yych <= 'R') goto yy398; + goto yy397; } } } } else { if (yych <= 'f') { if (yych <= 'a') { - if (yych == 'U') goto yy389; + if (yych == 'U') goto yy393; if (yych <= '`') goto yy194; - goto yy392; + goto yy396; } else { if (yych <= 'c') { - if (yych <= 'b') goto yy390; + if (yych <= 'b') goto yy394; goto yy194; } else { - if (yych <= 'd') goto yy395; + if (yych <= 'd') goto yy399; if (yych <= 'e') goto yy194; - goto yy396; + goto yy400; } } } else { if (yych <= 'q') { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy397; + goto yy401; } else { - if (yych == 'o') goto yy391; + if (yych == 'o') goto yy395; goto yy194; } } else { if (yych <= 's') { - if (yych <= 'r') goto yy394; - goto yy393; + if (yych <= 'r') goto yy398; + goto yy397; } else { if (yych != 'u') goto yy194; } } } } -yy389: - YYDEBUG(389, *YYCURSOR); +yy393: + YYDEBUG(393, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy456; - if (yych == 'n') goto yy456; + if (yych == 'N') goto yy460; + if (yych == 'n') goto yy460; goto yy194; -yy390: - YYDEBUG(390, *YYCURSOR); +yy394: + YYDEBUG(394, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy443; + if (yych == 'I') goto yy447; if (yych <= 'N') goto yy194; - goto yy444; + goto yy448; } else { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy443; + goto yy447; } else { - if (yych == 'o') goto yy444; + if (yych == 'o') goto yy448; goto yy194; } } -yy391: - YYDEBUG(391, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy435; - if (yych == 'b') goto yy435; - goto yy194; -yy392: - YYDEBUG(392, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy428; - if (yych == 'r') goto yy428; - goto yy194; -yy393: - YYDEBUG(393, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy420; - if (yych == 't') goto yy420; - goto yy194; -yy394: - YYDEBUG(394, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy418; - if (yych == 'e') goto yy418; - goto yy194; yy395: YYDEBUG(395, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy414; - if (yych == 'o') goto yy414; + if (yych == 'B') goto yy439; + if (yych == 'b') goto yy439; goto yy194; yy396: YYDEBUG(396, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy407; - if (yych == 'l') goto yy407; + if (yych == 'R') goto yy432; + if (yych == 'r') goto yy432; goto yy194; yy397: YYDEBUG(397, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy398; - if (yych != 'n') goto yy194; + if (yych == 'T') goto yy424; + if (yych == 't') goto yy424; + goto yy194; yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy399; - if (yych != 't') goto yy194; + if (yych == 'E') goto yy422; + if (yych == 'e') goto yy422; + goto yy194; yy399: YYDEBUG(399, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy400; - if (yych != 'e') goto yy402; + if (yych == 'O') goto yy418; + if (yych == 'o') goto yy418; + goto yy194; yy400: YYDEBUG(400, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy405; - if (yych == 'g') goto yy405; + if (yych == 'L') goto yy411; + if (yych == 'l') goto yy411; goto yy194; yy401: YYDEBUG(401, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy402; + if (yych != 'n') goto yy194; +yy402: + YYDEBUG(402, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy403; + if (yych != 't') goto yy194; +yy403: + YYDEBUG(403, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy404; + if (yych != 'e') goto yy406; +yy404: + YYDEBUG(404, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'G') goto yy409; + if (yych == 'g') goto yy409; + goto yy194; +yy405: + YYDEBUG(405, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy402: - YYDEBUG(402, *YYCURSOR); +yy406: + YYDEBUG(406, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy401; + if (yych == '\t') goto yy405; goto yy194; } else { - if (yych <= ' ') goto yy401; + if (yych <= ' ') goto yy405; if (yych != ')') goto yy194; } - YYDEBUG(403, *YYCURSOR); + YYDEBUG(407, *YYCURSOR); ++YYCURSOR; - YYDEBUG(404, *YYCURSOR); + YYDEBUG(408, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1222 "Zend/zend_language_scanner.l" { return T_INT_CAST; } -#line 4745 "Zend/zend_language_scanner.c" -yy405: - YYDEBUG(405, *YYCURSOR); +#line 4767 "Zend/zend_language_scanner.c" +yy409: + YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy406; + if (yych == 'E') goto yy410; if (yych != 'e') goto yy194; -yy406: - YYDEBUG(406, *YYCURSOR); +yy410: + YYDEBUG(410, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy401; - if (yych == 'r') goto yy401; + if (yych == 'R') goto yy405; + if (yych == 'r') goto yy405; goto yy194; -yy407: - YYDEBUG(407, *YYCURSOR); +yy411: + YYDEBUG(411, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy408; + if (yych == 'O') goto yy412; if (yych != 'o') goto yy194; -yy408: - YYDEBUG(408, *YYCURSOR); +yy412: + YYDEBUG(412, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy409; + if (yych == 'A') goto yy413; if (yych != 'a') goto yy194; -yy409: - YYDEBUG(409, *YYCURSOR); +yy413: + YYDEBUG(413, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy410; + if (yych == 'T') goto yy414; if (yych != 't') goto yy194; -yy410: - YYDEBUG(410, *YYCURSOR); +yy414: + YYDEBUG(414, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(411, *YYCURSOR); + YYDEBUG(415, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy410; + if (yych == '\t') goto yy414; goto yy194; } else { - if (yych <= ' ') goto yy410; + if (yych <= ' ') goto yy414; if (yych != ')') goto yy194; } - YYDEBUG(412, *YYCURSOR); + YYDEBUG(416, *YYCURSOR); ++YYCURSOR; - YYDEBUG(413, *YYCURSOR); + YYDEBUG(417, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1226 "Zend/zend_language_scanner.l" { return T_DOUBLE_CAST; } -#line 4793 "Zend/zend_language_scanner.c" -yy414: - YYDEBUG(414, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy415; - if (yych != 'u') goto yy194; -yy415: - YYDEBUG(415, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy416; - if (yych != 'b') goto yy194; -yy416: - YYDEBUG(416, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy417; - if (yych != 'l') goto yy194; -yy417: - YYDEBUG(417, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy410; - if (yych == 'e') goto yy410; - goto yy194; +#line 4815 "Zend/zend_language_scanner.c" yy418: YYDEBUG(418, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy419; - if (yych != 'a') goto yy194; + if (yych == 'U') goto yy419; + if (yych != 'u') goto yy194; yy419: YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy410; - if (yych == 'l') goto yy410; - goto yy194; + if (yych == 'B') goto yy420; + if (yych != 'b') goto yy194; yy420: YYDEBUG(420, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy421; - if (yych != 'r') goto yy194; + if (yych == 'L') goto yy421; + if (yych != 'l') goto yy194; yy421: YYDEBUG(421, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy422; - if (yych != 'i') goto yy194; + if (yych == 'E') goto yy414; + if (yych == 'e') goto yy414; + goto yy194; yy422: YYDEBUG(422, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy423; - if (yych != 'n') goto yy194; + if (yych == 'A') goto yy423; + if (yych != 'a') goto yy194; yy423: YYDEBUG(423, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy424; - if (yych != 'g') goto yy194; + if (yych == 'L') goto yy414; + if (yych == 'l') goto yy414; + goto yy194; yy424: YYDEBUG(424, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy425; + if (yych != 'r') goto yy194; +yy425: + YYDEBUG(425, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy426; + if (yych != 'i') goto yy194; +yy426: + YYDEBUG(426, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy427; + if (yych != 'n') goto yy194; +yy427: + YYDEBUG(427, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'G') goto yy428; + if (yych != 'g') goto yy194; +yy428: + YYDEBUG(428, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(425, *YYCURSOR); + YYDEBUG(429, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy424; + if (yych == '\t') goto yy428; goto yy194; } else { - if (yych <= ' ') goto yy424; + if (yych <= ' ') goto yy428; if (yych != ')') goto yy194; } - YYDEBUG(426, *YYCURSOR); + YYDEBUG(430, *YYCURSOR); ++YYCURSOR; - YYDEBUG(427, *YYCURSOR); + YYDEBUG(431, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1230 "Zend/zend_language_scanner.l" { return T_STRING_CAST; } -#line 4867 "Zend/zend_language_scanner.c" -yy428: - YYDEBUG(428, *YYCURSOR); +#line 4889 "Zend/zend_language_scanner.c" +yy432: + YYDEBUG(432, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy429; + if (yych == 'R') goto yy433; if (yych != 'r') goto yy194; -yy429: - YYDEBUG(429, *YYCURSOR); +yy433: + YYDEBUG(433, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy430; + if (yych == 'A') goto yy434; if (yych != 'a') goto yy194; -yy430: - YYDEBUG(430, *YYCURSOR); +yy434: + YYDEBUG(434, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy431; + if (yych == 'Y') goto yy435; if (yych != 'y') goto yy194; -yy431: - YYDEBUG(431, *YYCURSOR); +yy435: + YYDEBUG(435, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(432, *YYCURSOR); + YYDEBUG(436, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy431; + if (yych == '\t') goto yy435; goto yy194; } else { - if (yych <= ' ') goto yy431; + if (yych <= ' ') goto yy435; if (yych != ')') goto yy194; } - YYDEBUG(433, *YYCURSOR); + YYDEBUG(437, *YYCURSOR); ++YYCURSOR; - YYDEBUG(434, *YYCURSOR); + YYDEBUG(438, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1234 "Zend/zend_language_scanner.l" { return T_ARRAY_CAST; } -#line 4904 "Zend/zend_language_scanner.c" -yy435: - YYDEBUG(435, *YYCURSOR); +#line 4926 "Zend/zend_language_scanner.c" +yy439: + YYDEBUG(439, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'J') goto yy436; + if (yych == 'J') goto yy440; if (yych != 'j') goto yy194; -yy436: - YYDEBUG(436, *YYCURSOR); +yy440: + YYDEBUG(440, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy437; + if (yych == 'E') goto yy441; if (yych != 'e') goto yy194; -yy437: - YYDEBUG(437, *YYCURSOR); +yy441: + YYDEBUG(441, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy438; + if (yych == 'C') goto yy442; if (yych != 'c') goto yy194; -yy438: - YYDEBUG(438, *YYCURSOR); +yy442: + YYDEBUG(442, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy439; + if (yych == 'T') goto yy443; if (yych != 't') goto yy194; -yy439: - YYDEBUG(439, *YYCURSOR); +yy443: + YYDEBUG(443, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(440, *YYCURSOR); + YYDEBUG(444, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy439; + if (yych == '\t') goto yy443; goto yy194; } else { - if (yych <= ' ') goto yy439; + if (yych <= ' ') goto yy443; if (yych != ')') goto yy194; } - YYDEBUG(441, *YYCURSOR); + YYDEBUG(445, *YYCURSOR); ++YYCURSOR; - YYDEBUG(442, *YYCURSOR); + YYDEBUG(446, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1238 "Zend/zend_language_scanner.l" { return T_OBJECT_CAST; } -#line 4946 "Zend/zend_language_scanner.c" -yy443: - YYDEBUG(443, *YYCURSOR); +#line 4968 "Zend/zend_language_scanner.c" +yy447: + YYDEBUG(447, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy453; - if (yych == 'n') goto yy453; + if (yych == 'N') goto yy457; + if (yych == 'n') goto yy457; goto yy194; -yy444: - YYDEBUG(444, *YYCURSOR); +yy448: + YYDEBUG(448, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy445; + if (yych == 'O') goto yy449; if (yych != 'o') goto yy194; -yy445: - YYDEBUG(445, *YYCURSOR); +yy449: + YYDEBUG(449, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy446; + if (yych == 'L') goto yy450; if (yych != 'l') goto yy194; -yy446: - YYDEBUG(446, *YYCURSOR); +yy450: + YYDEBUG(450, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy451; - if (yych == 'e') goto yy451; - goto yy448; -yy447: - YYDEBUG(447, *YYCURSOR); + if (yych == 'E') goto yy455; + if (yych == 'e') goto yy455; + goto yy452; +yy451: + YYDEBUG(451, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy448: - YYDEBUG(448, *YYCURSOR); +yy452: + YYDEBUG(452, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy447; + if (yych == '\t') goto yy451; goto yy194; } else { - if (yych <= ' ') goto yy447; + if (yych <= ' ') goto yy451; if (yych != ')') goto yy194; } - YYDEBUG(449, *YYCURSOR); + YYDEBUG(453, *YYCURSOR); ++YYCURSOR; - YYDEBUG(450, *YYCURSOR); + YYDEBUG(454, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1242 "Zend/zend_language_scanner.l" { return T_BOOL_CAST; } -#line 4991 "Zend/zend_language_scanner.c" -yy451: - YYDEBUG(451, *YYCURSOR); +#line 5013 "Zend/zend_language_scanner.c" +yy455: + YYDEBUG(455, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy452; + if (yych == 'A') goto yy456; if (yych != 'a') goto yy194; -yy452: - YYDEBUG(452, *YYCURSOR); +yy456: + YYDEBUG(456, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy447; - if (yych == 'n') goto yy447; + if (yych == 'N') goto yy451; + if (yych == 'n') goto yy451; goto yy194; -yy453: - YYDEBUG(453, *YYCURSOR); +yy457: + YYDEBUG(457, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy454; + if (yych == 'A') goto yy458; if (yych != 'a') goto yy194; -yy454: - YYDEBUG(454, *YYCURSOR); +yy458: + YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy455; + if (yych == 'R') goto yy459; if (yych != 'r') goto yy194; -yy455: - YYDEBUG(455, *YYCURSOR); +yy459: + YYDEBUG(459, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy424; - if (yych == 'y') goto yy424; + if (yych == 'Y') goto yy428; + if (yych == 'y') goto yy428; goto yy194; -yy456: - YYDEBUG(456, *YYCURSOR); +yy460: + YYDEBUG(460, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy457; + if (yych == 'S') goto yy461; if (yych != 's') goto yy194; -yy457: - YYDEBUG(457, *YYCURSOR); +yy461: + YYDEBUG(461, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy458; + if (yych == 'E') goto yy462; if (yych != 'e') goto yy194; -yy458: - YYDEBUG(458, *YYCURSOR); +yy462: + YYDEBUG(462, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy459; + if (yych == 'T') goto yy463; if (yych != 't') goto yy194; -yy459: - YYDEBUG(459, *YYCURSOR); +yy463: + YYDEBUG(463, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(460, *YYCURSOR); + YYDEBUG(464, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy459; + if (yych == '\t') goto yy463; goto yy194; } else { - if (yych <= ' ') goto yy459; + if (yych <= ' ') goto yy463; if (yych != ')') goto yy194; } - YYDEBUG(461, *YYCURSOR); + YYDEBUG(465, *YYCURSOR); ++YYCURSOR; - YYDEBUG(462, *YYCURSOR); + YYDEBUG(466, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1246 "Zend/zend_language_scanner.l" { return T_UNSET_CAST; } -#line 5055 "Zend/zend_language_scanner.c" -yy463: - YYDEBUG(463, *YYCURSOR); +#line 5077 "Zend/zend_language_scanner.c" +yy467: + YYDEBUG(467, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy464; + if (yych == 'R') goto yy468; if (yych != 'r') goto yy187; -yy464: - YYDEBUG(464, *YYCURSOR); +yy468: + YYDEBUG(468, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(465, *YYCURSOR); + YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1218 "Zend/zend_language_scanner.l" { return T_VAR; } -#line 5073 "Zend/zend_language_scanner.c" -yy466: - YYDEBUG(466, *YYCURSOR); +#line 5095 "Zend/zend_language_scanner.c" +yy470: + YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy470; - if (yych == 'm') goto yy470; + if (yych == 'M') goto yy474; + if (yych == 'm') goto yy474; goto yy187; -yy467: - YYDEBUG(467, *YYCURSOR); +yy471: + YYDEBUG(471, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy468; + if (yych == 'W') goto yy472; if (yych != 'w') goto yy187; -yy468: - YYDEBUG(468, *YYCURSOR); +yy472: + YYDEBUG(472, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(469, *YYCURSOR); + YYDEBUG(473, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1210 "Zend/zend_language_scanner.l" { return T_NEW; } -#line 5097 "Zend/zend_language_scanner.c" -yy470: - YYDEBUG(470, *YYCURSOR); +#line 5119 "Zend/zend_language_scanner.c" +yy474: + YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy471; + if (yych == 'E') goto yy475; if (yych != 'e') goto yy187; -yy471: - YYDEBUG(471, *YYCURSOR); +yy475: + YYDEBUG(475, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy472; + if (yych == 'S') goto yy476; if (yych != 's') goto yy187; -yy472: - YYDEBUG(472, *YYCURSOR); +yy476: + YYDEBUG(476, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy473; + if (yych == 'P') goto yy477; if (yych != 'p') goto yy187; -yy473: - YYDEBUG(473, *YYCURSOR); +yy477: + YYDEBUG(477, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy474; + if (yych == 'A') goto yy478; if (yych != 'a') goto yy187; -yy474: - YYDEBUG(474, *YYCURSOR); +yy478: + YYDEBUG(478, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy475; + if (yych == 'C') goto yy479; if (yych != 'c') goto yy187; -yy475: - YYDEBUG(475, *YYCURSOR); +yy479: + YYDEBUG(479, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy476; + if (yych == 'E') goto yy480; if (yych != 'e') goto yy187; -yy476: - YYDEBUG(476, *YYCURSOR); +yy480: + YYDEBUG(480, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(477, *YYCURSOR); + YYDEBUG(481, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1270 "Zend/zend_language_scanner.l" { return T_NAMESPACE; } -#line 5140 "Zend/zend_language_scanner.c" -yy478: - YYDEBUG(478, *YYCURSOR); +#line 5162 "Zend/zend_language_scanner.c" +yy482: + YYDEBUG(482, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(479, *YYCURSOR); + YYDEBUG(483, *YYCURSOR); if (yych <= 'D') { if (yych <= '/') goto yy190; - if (yych <= '9') goto yy478; + if (yych <= '9') goto yy482; goto yy190; } else { if (yych <= 'E') goto yy193; if (yych == 'e') goto yy193; goto yy190; } -yy480: - YYDEBUG(480, *YYCURSOR); +yy484: + YYDEBUG(484, *YYCURSOR); ++YYCURSOR; - YYDEBUG(481, *YYCURSOR); + YYDEBUG(485, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1390 "Zend/zend_language_scanner.l" +#line 1398 "Zend/zend_language_scanner.l" { return T_CONCAT_EQUAL; } -#line 5166 "Zend/zend_language_scanner.c" -yy482: - YYDEBUG(482, *YYCURSOR); +#line 5188 "Zend/zend_language_scanner.c" +yy486: + YYDEBUG(486, *YYCURSOR); yych = *++YYCURSOR; if (yych != '.') goto yy194; - YYDEBUG(483, *YYCURSOR); + YYDEBUG(487, *YYCURSOR); ++YYCURSOR; - YYDEBUG(484, *YYCURSOR); + YYDEBUG(488, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1206 "Zend/zend_language_scanner.l" { return T_ELLIPSIS; } -#line 5179 "Zend/zend_language_scanner.c" -yy485: - YYDEBUG(485, *YYCURSOR); +#line 5201 "Zend/zend_language_scanner.c" +yy489: + YYDEBUG(489, *YYCURSOR); ++YYCURSOR; - YYDEBUG(486, *YYCURSOR); + YYDEBUG(490, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1198 "Zend/zend_language_scanner.l" { return T_PAAMAYIM_NEKUDOTAYIM; } -#line 5189 "Zend/zend_language_scanner.c" -yy487: - YYDEBUG(487, *YYCURSOR); +#line 5211 "Zend/zend_language_scanner.c" +yy491: + YYDEBUG(491, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy488: - YYDEBUG(488, *YYCURSOR); +yy492: + YYDEBUG(492, *YYCURSOR); if (yych <= '\f') { if (yych <= 0x08) goto yy141; - if (yych <= '\n') goto yy487; + if (yych <= '\n') goto yy491; goto yy141; } else { - if (yych <= '\r') goto yy487; - if (yych == ' ') goto yy487; + if (yych <= '\r') goto yy491; + if (yych == ' ') goto yy491; goto yy141; } -yy489: - YYDEBUG(489, *YYCURSOR); +yy493: + YYDEBUG(493, *YYCURSOR); ++YYCURSOR; - YYDEBUG(490, *YYCURSOR); + YYDEBUG(494, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1378 "Zend/zend_language_scanner.l" { return T_MINUS_EQUAL; } -#line 5215 "Zend/zend_language_scanner.c" -yy491: - YYDEBUG(491, *YYCURSOR); +#line 5237 "Zend/zend_language_scanner.c" +yy495: + YYDEBUG(495, *YYCURSOR); ++YYCURSOR; - YYDEBUG(492, *YYCURSOR); + YYDEBUG(496, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1346 "Zend/zend_language_scanner.l" { return T_DEC; } -#line 5225 "Zend/zend_language_scanner.c" -yy493: - YYDEBUG(493, *YYCURSOR); +#line 5247 "Zend/zend_language_scanner.c" +yy497: + YYDEBUG(497, *YYCURSOR); ++YYCURSOR; - YYDEBUG(494, *YYCURSOR); + YYDEBUG(498, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1170 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); return T_OBJECT_OPERATOR; } -#line 5236 "Zend/zend_language_scanner.c" -yy495: - YYDEBUG(495, *YYCURSOR); +#line 5258 "Zend/zend_language_scanner.c" +yy499: + YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy502; + if (yych == 'I') goto yy506; if (yych <= 'N') goto yy187; - goto yy503; + goto yy507; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy502; + goto yy506; } else { - if (yych == 'o') goto yy503; + if (yych == 'o') goto yy507; goto yy187; } } -yy496: - YYDEBUG(496, *YYCURSOR); +yy500: + YYDEBUG(500, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy497; + if (yych == 'B') goto yy501; if (yych != 'b') goto yy187; -yy497: - YYDEBUG(497, *YYCURSOR); +yy501: + YYDEBUG(501, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy498; + if (yych == 'L') goto yy502; if (yych != 'l') goto yy187; -yy498: - YYDEBUG(498, *YYCURSOR); +yy502: + YYDEBUG(502, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy499; + if (yych == 'I') goto yy503; if (yych != 'i') goto yy187; -yy499: - YYDEBUG(499, *YYCURSOR); +yy503: + YYDEBUG(503, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy500; + if (yych == 'C') goto yy504; if (yych != 'c') goto yy187; -yy500: - YYDEBUG(500, *YYCURSOR); +yy504: + YYDEBUG(504, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(501, *YYCURSOR); + YYDEBUG(505, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1318 "Zend/zend_language_scanner.l" { return T_PUBLIC; } -#line 5285 "Zend/zend_language_scanner.c" -yy502: - YYDEBUG(502, *YYCURSOR); +#line 5307 "Zend/zend_language_scanner.c" +yy506: + YYDEBUG(506, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'V') { - if (yych == 'N') goto yy511; + if (yych == 'N') goto yy515; if (yych <= 'U') goto yy187; - goto yy512; + goto yy516; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy511; + goto yy515; } else { - if (yych == 'v') goto yy512; + if (yych == 'v') goto yy516; goto yy187; } } -yy503: - YYDEBUG(503, *YYCURSOR); +yy507: + YYDEBUG(507, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy504; + if (yych == 'T') goto yy508; if (yych != 't') goto yy187; -yy504: - YYDEBUG(504, *YYCURSOR); +yy508: + YYDEBUG(508, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy505; + if (yych == 'E') goto yy509; if (yych != 'e') goto yy187; -yy505: - YYDEBUG(505, *YYCURSOR); +yy509: + YYDEBUG(509, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy506; + if (yych == 'C') goto yy510; if (yych != 'c') goto yy187; -yy506: - YYDEBUG(506, *YYCURSOR); +yy510: + YYDEBUG(510, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy507; + if (yych == 'T') goto yy511; if (yych != 't') goto yy187; -yy507: - YYDEBUG(507, *YYCURSOR); +yy511: + YYDEBUG(511, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy508; + if (yych == 'E') goto yy512; if (yych != 'e') goto yy187; -yy508: - YYDEBUG(508, *YYCURSOR); +yy512: + YYDEBUG(512, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy509; + if (yych == 'D') goto yy513; if (yych != 'd') goto yy187; -yy509: - YYDEBUG(509, *YYCURSOR); +yy513: + YYDEBUG(513, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(510, *YYCURSOR); + YYDEBUG(514, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1314 "Zend/zend_language_scanner.l" { return T_PROTECTED; } -#line 5344 "Zend/zend_language_scanner.c" -yy511: - YYDEBUG(511, *YYCURSOR); +#line 5366 "Zend/zend_language_scanner.c" +yy515: + YYDEBUG(515, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy517; - if (yych == 't') goto yy517; + if (yych == 'T') goto yy521; + if (yych == 't') goto yy521; goto yy187; -yy512: - YYDEBUG(512, *YYCURSOR); +yy516: + YYDEBUG(516, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy513; + if (yych == 'A') goto yy517; if (yych != 'a') goto yy187; -yy513: - YYDEBUG(513, *YYCURSOR); +yy517: + YYDEBUG(517, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy514; + if (yych == 'T') goto yy518; if (yych != 't') goto yy187; -yy514: - YYDEBUG(514, *YYCURSOR); +yy518: + YYDEBUG(518, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy515; + if (yych == 'E') goto yy519; if (yych != 'e') goto yy187; -yy515: - YYDEBUG(515, *YYCURSOR); +yy519: + YYDEBUG(519, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(516, *YYCURSOR); + YYDEBUG(520, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1310 "Zend/zend_language_scanner.l" { return T_PRIVATE; } -#line 5378 "Zend/zend_language_scanner.c" -yy517: - YYDEBUG(517, *YYCURSOR); +#line 5400 "Zend/zend_language_scanner.c" +yy521: + YYDEBUG(521, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(518, *YYCURSOR); + YYDEBUG(522, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1146 "Zend/zend_language_scanner.l" { return T_PRINT; } -#line 5391 "Zend/zend_language_scanner.c" -yy519: - YYDEBUG(519, *YYCURSOR); +#line 5413 "Zend/zend_language_scanner.c" +yy523: + YYDEBUG(523, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy524; - if (yych == 'o') goto yy524; + if (yych == 'O') goto yy528; + if (yych == 'o') goto yy528; goto yy187; -yy520: - YYDEBUG(520, *YYCURSOR); +yy524: + YYDEBUG(524, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy521; + if (yych == 'T') goto yy525; if (yych != 't') goto yy187; -yy521: - YYDEBUG(521, *YYCURSOR); +yy525: + YYDEBUG(525, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy522; + if (yych == 'O') goto yy526; if (yych != 'o') goto yy187; -yy522: - YYDEBUG(522, *YYCURSOR); +yy526: + YYDEBUG(526, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(523, *YYCURSOR); + YYDEBUG(527, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1138 "Zend/zend_language_scanner.l" { return T_GOTO; } -#line 5420 "Zend/zend_language_scanner.c" -yy524: - YYDEBUG(524, *YYCURSOR); +#line 5442 "Zend/zend_language_scanner.c" +yy528: + YYDEBUG(528, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy525; + if (yych == 'B') goto yy529; if (yych != 'b') goto yy187; -yy525: - YYDEBUG(525, *YYCURSOR); +yy529: + YYDEBUG(529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy526; + if (yych == 'A') goto yy530; if (yych != 'a') goto yy187; -yy526: - YYDEBUG(526, *YYCURSOR); +yy530: + YYDEBUG(530, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy527; + if (yych == 'L') goto yy531; if (yych != 'l') goto yy187; -yy527: - YYDEBUG(527, *YYCURSOR); +yy531: + YYDEBUG(531, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(528, *YYCURSOR); + YYDEBUG(532, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1282 "Zend/zend_language_scanner.l" { return T_GLOBAL; } -#line 5448 "Zend/zend_language_scanner.c" -yy529: - YYDEBUG(529, *YYCURSOR); +#line 5470 "Zend/zend_language_scanner.c" +yy533: + YYDEBUG(533, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy537; + if (yych == '<') goto yy541; goto yy194; -yy530: - YYDEBUG(530, *YYCURSOR); +yy534: + YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; goto yy181; -yy531: - YYDEBUG(531, *YYCURSOR); +yy535: + YYDEBUG(535, *YYCURSOR); yych = *++YYCURSOR; goto yy179; -yy532: - YYDEBUG(532, *YYCURSOR); +yy536: + YYDEBUG(536, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy533; + if (yych == 'E') goto yy537; if (yych != 'e') goto yy187; -yy533: - YYDEBUG(533, *YYCURSOR); +yy537: + YYDEBUG(537, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy534; + if (yych == 'A') goto yy538; if (yych != 'a') goto yy187; -yy534: - YYDEBUG(534, *YYCURSOR); +yy538: + YYDEBUG(538, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'K') goto yy535; + if (yych == 'K') goto yy539; if (yych != 'k') goto yy187; -yy535: - YYDEBUG(535, *YYCURSOR); +yy539: + YYDEBUG(539, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(536, *YYCURSOR); + YYDEBUG(540, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1130 "Zend/zend_language_scanner.l" { return T_BREAK; } -#line 5489 "Zend/zend_language_scanner.c" -yy537: - YYDEBUG(537, *YYCURSOR); +#line 5511 "Zend/zend_language_scanner.c" +yy541: + YYDEBUG(541, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy266; + if (yych == '<') goto yy270; goto yy194; -yy538: - YYDEBUG(538, *YYCURSOR); +yy542: + YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy545; - if (yych == 'a') goto yy545; + if (yych == 'A') goto yy549; + if (yych == 'a') goto yy549; goto yy187; -yy539: - YYDEBUG(539, *YYCURSOR); +yy543: + YYDEBUG(543, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy540; + if (yych == 'I') goto yy544; if (yych != 'i') goto yy187; -yy540: - YYDEBUG(540, *YYCURSOR); +yy544: + YYDEBUG(544, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy541; + if (yych == 'T') goto yy545; if (yych != 't') goto yy187; -yy541: - YYDEBUG(541, *YYCURSOR); +yy545: + YYDEBUG(545, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy542; + if (yych == 'C') goto yy546; if (yych != 'c') goto yy187; -yy542: - YYDEBUG(542, *YYCURSOR); +yy546: + YYDEBUG(546, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy543; + if (yych == 'H') goto yy547; if (yych != 'h') goto yy187; -yy543: - YYDEBUG(543, *YYCURSOR); +yy547: + YYDEBUG(547, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(544, *YYCURSOR); + YYDEBUG(548, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1114 "Zend/zend_language_scanner.l" { return T_SWITCH; } -#line 5533 "Zend/zend_language_scanner.c" -yy545: - YYDEBUG(545, *YYCURSOR); +#line 5555 "Zend/zend_language_scanner.c" +yy549: + YYDEBUG(549, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy546; + if (yych == 'T') goto yy550; if (yych != 't') goto yy187; -yy546: - YYDEBUG(546, *YYCURSOR); +yy550: + YYDEBUG(550, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy547; + if (yych == 'I') goto yy551; if (yych != 'i') goto yy187; -yy547: - YYDEBUG(547, *YYCURSOR); +yy551: + YYDEBUG(551, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy548; + if (yych == 'C') goto yy552; if (yych != 'c') goto yy187; -yy548: - YYDEBUG(548, *YYCURSOR); +yy552: + YYDEBUG(552, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(549, *YYCURSOR); + YYDEBUG(553, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1298 "Zend/zend_language_scanner.l" { return T_STATIC; } -#line 5561 "Zend/zend_language_scanner.c" -yy550: - YYDEBUG(550, *YYCURSOR); +#line 5583 "Zend/zend_language_scanner.c" +yy554: + YYDEBUG(554, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy561; - if (yych == 's') goto yy561; + if (yych == 'S') goto yy565; + if (yych == 's') goto yy565; goto yy187; -yy551: - YYDEBUG(551, *YYCURSOR); +yy555: + YYDEBUG(555, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy559; - if (yych == 'd') goto yy559; + if (yych == 'D') goto yy563; + if (yych == 'd') goto yy563; goto yy187; -yy552: - YYDEBUG(552, *YYCURSOR); +yy556: + YYDEBUG(556, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy555; - if (yych == 'r') goto yy555; + if (yych == 'R') goto yy559; + if (yych == 'r') goto yy559; goto yy187; -yy553: - YYDEBUG(553, *YYCURSOR); +yy557: + YYDEBUG(557, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(554, *YYCURSOR); + YYDEBUG(558, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1110 "Zend/zend_language_scanner.l" { return T_AS; } -#line 5592 "Zend/zend_language_scanner.c" -yy555: - YYDEBUG(555, *YYCURSOR); +#line 5614 "Zend/zend_language_scanner.c" +yy559: + YYDEBUG(559, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy556; + if (yych == 'A') goto yy560; if (yych != 'a') goto yy187; -yy556: - YYDEBUG(556, *YYCURSOR); +yy560: + YYDEBUG(560, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy557; + if (yych == 'Y') goto yy561; if (yych != 'y') goto yy187; -yy557: - YYDEBUG(557, *YYCURSOR); +yy561: + YYDEBUG(561, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(558, *YYCURSOR); + YYDEBUG(562, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1334 "Zend/zend_language_scanner.l" { return T_ARRAY; } -#line 5615 "Zend/zend_language_scanner.c" -yy559: - YYDEBUG(559, *YYCURSOR); +#line 5637 "Zend/zend_language_scanner.c" +yy563: + YYDEBUG(563, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(560, *YYCURSOR); + YYDEBUG(564, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1430 "Zend/zend_language_scanner.l" +#line 1438 "Zend/zend_language_scanner.l" { return T_LOGICAL_AND; } -#line 5628 "Zend/zend_language_scanner.c" -yy561: - YYDEBUG(561, *YYCURSOR); +#line 5650 "Zend/zend_language_scanner.c" +yy565: + YYDEBUG(565, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy562; + if (yych == 'T') goto yy566; if (yych != 't') goto yy187; -yy562: - YYDEBUG(562, *YYCURSOR); +yy566: + YYDEBUG(566, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy563; + if (yych == 'R') goto yy567; if (yych != 'r') goto yy187; -yy563: - YYDEBUG(563, *YYCURSOR); +yy567: + YYDEBUG(567, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy564; + if (yych == 'A') goto yy568; if (yych != 'a') goto yy187; -yy564: - YYDEBUG(564, *YYCURSOR); +yy568: + YYDEBUG(568, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy565; + if (yych == 'C') goto yy569; if (yych != 'c') goto yy187; -yy565: - YYDEBUG(565, *YYCURSOR); +yy569: + YYDEBUG(569, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy566; + if (yych == 'T') goto yy570; if (yych != 't') goto yy187; -yy566: - YYDEBUG(566, *YYCURSOR); +yy570: + YYDEBUG(570, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(567, *YYCURSOR); + YYDEBUG(571, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1302 "Zend/zend_language_scanner.l" { return T_ABSTRACT; } -#line 5666 "Zend/zend_language_scanner.c" -yy568: - YYDEBUG(568, *YYCURSOR); +#line 5688 "Zend/zend_language_scanner.c" +yy572: + YYDEBUG(572, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy569; + if (yych == 'I') goto yy573; if (yych != 'i') goto yy187; -yy569: - YYDEBUG(569, *YYCURSOR); +yy573: + YYDEBUG(573, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy570; + if (yych == 'L') goto yy574; if (yych != 'l') goto yy187; -yy570: - YYDEBUG(570, *YYCURSOR); +yy574: + YYDEBUG(574, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy571; + if (yych == 'E') goto yy575; if (yych != 'e') goto yy187; -yy571: - YYDEBUG(571, *YYCURSOR); +yy575: + YYDEBUG(575, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(572, *YYCURSOR); + YYDEBUG(576, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1070 "Zend/zend_language_scanner.l" { return T_WHILE; } -#line 5694 "Zend/zend_language_scanner.c" -yy573: - YYDEBUG(573, *YYCURSOR); +#line 5716 "Zend/zend_language_scanner.c" +yy577: + YYDEBUG(577, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(574, *YYCURSOR); + YYDEBUG(578, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1054 "Zend/zend_language_scanner.l" { return T_IF; } -#line 5707 "Zend/zend_language_scanner.c" -yy575: - YYDEBUG(575, *YYCURSOR); +#line 5729 "Zend/zend_language_scanner.c" +yy579: + YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy617; - if (yych == 'p') goto yy617; + if (yych == 'P') goto yy621; + if (yych == 'p') goto yy621; goto yy187; -yy576: - YYDEBUG(576, *YYCURSOR); +yy580: + YYDEBUG(580, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'C') { if (yych <= 'B') goto yy187; - goto yy584; + goto yy588; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy582; - goto yy583; + if (yych <= 'S') goto yy586; + goto yy587; } } else { if (yych <= 'r') { - if (yych == 'c') goto yy584; + if (yych == 'c') goto yy588; goto yy187; } else { - if (yych <= 's') goto yy582; - if (yych <= 't') goto yy583; + if (yych <= 's') goto yy586; + if (yych <= 't') goto yy587; goto yy187; } } -yy577: - YYDEBUG(577, *YYCURSOR); +yy581: + YYDEBUG(581, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy578; + if (yych == 'S') goto yy582; if (yych != 's') goto yy187; -yy578: - YYDEBUG(578, *YYCURSOR); +yy582: + YYDEBUG(582, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy579; + if (yych == 'E') goto yy583; if (yych != 'e') goto yy187; -yy579: - YYDEBUG(579, *YYCURSOR); +yy583: + YYDEBUG(583, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy580; + if (yych == 'T') goto yy584; if (yych != 't') goto yy187; -yy580: - YYDEBUG(580, *YYCURSOR); +yy584: + YYDEBUG(584, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(581, *YYCURSOR); + YYDEBUG(585, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1286 "Zend/zend_language_scanner.l" { return T_ISSET; } -#line 5763 "Zend/zend_language_scanner.c" -yy582: - YYDEBUG(582, *YYCURSOR); +#line 5785 "Zend/zend_language_scanner.c" +yy586: + YYDEBUG(586, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy603; - if (yych == 't') goto yy603; + if (yych == 'T') goto yy607; + if (yych == 't') goto yy607; goto yy187; -yy583: - YYDEBUG(583, *YYCURSOR); +yy587: + YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy596; - if (yych == 'e') goto yy596; + if (yych == 'E') goto yy600; + if (yych == 'e') goto yy600; goto yy187; -yy584: - YYDEBUG(584, *YYCURSOR); +yy588: + YYDEBUG(588, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy585; + if (yych == 'L') goto yy589; if (yych != 'l') goto yy187; -yy585: - YYDEBUG(585, *YYCURSOR); +yy589: + YYDEBUG(589, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy586; + if (yych == 'U') goto yy590; if (yych != 'u') goto yy187; -yy586: - YYDEBUG(586, *YYCURSOR); +yy590: + YYDEBUG(590, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy587; + if (yych == 'D') goto yy591; if (yych != 'd') goto yy187; -yy587: - YYDEBUG(587, *YYCURSOR); +yy591: + YYDEBUG(591, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy588; + if (yych == 'E') goto yy592; if (yych != 'e') goto yy187; -yy588: - YYDEBUG(588, *YYCURSOR); +yy592: + YYDEBUG(592, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy589; + if (yych <= '@') goto yy593; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy590; + if (yych <= '_') goto yy594; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy589: - YYDEBUG(589, *YYCURSOR); +yy593: + YYDEBUG(593, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1254 "Zend/zend_language_scanner.l" { return T_INCLUDE; } -#line 5821 "Zend/zend_language_scanner.c" -yy590: - YYDEBUG(590, *YYCURSOR); +#line 5843 "Zend/zend_language_scanner.c" +yy594: + YYDEBUG(594, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy591; + if (yych == 'O') goto yy595; if (yych != 'o') goto yy187; -yy591: - YYDEBUG(591, *YYCURSOR); +yy595: + YYDEBUG(595, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy592; + if (yych == 'N') goto yy596; if (yych != 'n') goto yy187; -yy592: - YYDEBUG(592, *YYCURSOR); +yy596: + YYDEBUG(596, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy593; + if (yych == 'C') goto yy597; if (yych != 'c') goto yy187; -yy593: - YYDEBUG(593, *YYCURSOR); +yy597: + YYDEBUG(597, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy594; + if (yych == 'E') goto yy598; if (yych != 'e') goto yy187; -yy594: - YYDEBUG(594, *YYCURSOR); +yy598: + YYDEBUG(598, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(595, *YYCURSOR); + YYDEBUG(599, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1258 "Zend/zend_language_scanner.l" { return T_INCLUDE_ONCE; } -#line 5854 "Zend/zend_language_scanner.c" -yy596: - YYDEBUG(596, *YYCURSOR); +#line 5876 "Zend/zend_language_scanner.c" +yy600: + YYDEBUG(600, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy597; + if (yych == 'R') goto yy601; if (yych != 'r') goto yy187; -yy597: - YYDEBUG(597, *YYCURSOR); +yy601: + YYDEBUG(601, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy598; + if (yych == 'F') goto yy602; if (yych != 'f') goto yy187; -yy598: - YYDEBUG(598, *YYCURSOR); +yy602: + YYDEBUG(602, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy599; + if (yych == 'A') goto yy603; if (yych != 'a') goto yy187; -yy599: - YYDEBUG(599, *YYCURSOR); +yy603: + YYDEBUG(603, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy600; + if (yych == 'C') goto yy604; if (yych != 'c') goto yy187; -yy600: - YYDEBUG(600, *YYCURSOR); +yy604: + YYDEBUG(604, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy601; + if (yych == 'E') goto yy605; if (yych != 'e') goto yy187; -yy601: - YYDEBUG(601, *YYCURSOR); +yy605: + YYDEBUG(605, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(602, *YYCURSOR); + YYDEBUG(606, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1154 "Zend/zend_language_scanner.l" { return T_INTERFACE; } -#line 5892 "Zend/zend_language_scanner.c" -yy603: - YYDEBUG(603, *YYCURSOR); +#line 5914 "Zend/zend_language_scanner.c" +yy607: + YYDEBUG(607, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy604; + if (yych == 'A') goto yy608; if (yych <= 'D') goto yy187; - goto yy605; + goto yy609; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; } else { - if (yych == 'e') goto yy605; + if (yych == 'e') goto yy609; goto yy187; } } -yy604: - YYDEBUG(604, *YYCURSOR); +yy608: + YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy611; - if (yych == 'n') goto yy611; + if (yych == 'N') goto yy615; + if (yych == 'n') goto yy615; goto yy187; -yy605: - YYDEBUG(605, *YYCURSOR); +yy609: + YYDEBUG(609, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy606; + if (yych == 'A') goto yy610; if (yych != 'a') goto yy187; -yy606: - YYDEBUG(606, *YYCURSOR); +yy610: + YYDEBUG(610, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy607; + if (yych == 'D') goto yy611; if (yych != 'd') goto yy187; -yy607: - YYDEBUG(607, *YYCURSOR); +yy611: + YYDEBUG(611, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy608; + if (yych == 'O') goto yy612; if (yych != 'o') goto yy187; -yy608: - YYDEBUG(608, *YYCURSOR); +yy612: + YYDEBUG(612, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy609; + if (yych == 'F') goto yy613; if (yych != 'f') goto yy187; -yy609: - YYDEBUG(609, *YYCURSOR); +yy613: + YYDEBUG(613, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(610, *YYCURSOR); + YYDEBUG(614, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1278 "Zend/zend_language_scanner.l" { return T_INSTEADOF; } -#line 5946 "Zend/zend_language_scanner.c" -yy611: - YYDEBUG(611, *YYCURSOR); +#line 5968 "Zend/zend_language_scanner.c" +yy615: + YYDEBUG(615, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy612; + if (yych == 'C') goto yy616; if (yych != 'c') goto yy187; -yy612: - YYDEBUG(612, *YYCURSOR); +yy616: + YYDEBUG(616, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy613; + if (yych == 'E') goto yy617; if (yych != 'e') goto yy187; -yy613: - YYDEBUG(613, *YYCURSOR); +yy617: + YYDEBUG(617, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy614; + if (yych == 'O') goto yy618; if (yych != 'o') goto yy187; -yy614: - YYDEBUG(614, *YYCURSOR); +yy618: + YYDEBUG(618, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy615; + if (yych == 'F') goto yy619; if (yych != 'f') goto yy187; -yy615: - YYDEBUG(615, *YYCURSOR); +yy619: + YYDEBUG(619, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(616, *YYCURSOR); + YYDEBUG(620, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1106 "Zend/zend_language_scanner.l" { return T_INSTANCEOF; } -#line 5979 "Zend/zend_language_scanner.c" -yy617: - YYDEBUG(617, *YYCURSOR); +#line 6001 "Zend/zend_language_scanner.c" +yy621: + YYDEBUG(621, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy618; + if (yych == 'L') goto yy622; if (yych != 'l') goto yy187; -yy618: - YYDEBUG(618, *YYCURSOR); +yy622: + YYDEBUG(622, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy619; + if (yych == 'E') goto yy623; if (yych != 'e') goto yy187; -yy619: - YYDEBUG(619, *YYCURSOR); +yy623: + YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy620; + if (yych == 'M') goto yy624; if (yych != 'm') goto yy187; -yy620: - YYDEBUG(620, *YYCURSOR); +yy624: + YYDEBUG(624, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy621; + if (yych == 'E') goto yy625; if (yych != 'e') goto yy187; -yy621: - YYDEBUG(621, *YYCURSOR); +yy625: + YYDEBUG(625, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy622; + if (yych == 'N') goto yy626; if (yych != 'n') goto yy187; -yy622: - YYDEBUG(622, *YYCURSOR); +yy626: + YYDEBUG(626, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy623; + if (yych == 'T') goto yy627; if (yych != 't') goto yy187; -yy623: - YYDEBUG(623, *YYCURSOR); +yy627: + YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy624; + if (yych == 'S') goto yy628; if (yych != 's') goto yy187; -yy624: - YYDEBUG(624, *YYCURSOR); +yy628: + YYDEBUG(628, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(625, *YYCURSOR); + YYDEBUG(629, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1166 "Zend/zend_language_scanner.l" { return T_IMPLEMENTS; } -#line 6027 "Zend/zend_language_scanner.c" -yy626: - YYDEBUG(626, *YYCURSOR); +#line 6049 "Zend/zend_language_scanner.c" +yy630: + YYDEBUG(630, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy634; - if (yych == 'r') goto yy634; + if (yych == 'R') goto yy638; + if (yych == 'r') goto yy638; goto yy187; -yy627: - YYDEBUG(627, *YYCURSOR); +yy631: + YYDEBUG(631, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { - if (yych == 'A') goto yy630; + if (yych == 'A') goto yy634; if (yych <= 'X') goto yy187; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy630; + goto yy634; } else { if (yych != 'y') goto yy187; } } - YYDEBUG(628, *YYCURSOR); + YYDEBUG(632, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(629, *YYCURSOR); + YYDEBUG(633, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1038 "Zend/zend_language_scanner.l" { return T_TRY; } -#line 6059 "Zend/zend_language_scanner.c" -yy630: - YYDEBUG(630, *YYCURSOR); +#line 6081 "Zend/zend_language_scanner.c" +yy634: + YYDEBUG(634, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy631; + if (yych == 'I') goto yy635; if (yych != 'i') goto yy187; -yy631: - YYDEBUG(631, *YYCURSOR); +yy635: + YYDEBUG(635, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy632; + if (yych == 'T') goto yy636; if (yych != 't') goto yy187; -yy632: - YYDEBUG(632, *YYCURSOR); +yy636: + YYDEBUG(636, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(633, *YYCURSOR); + YYDEBUG(637, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1158 "Zend/zend_language_scanner.l" { return T_TRAIT; } -#line 6082 "Zend/zend_language_scanner.c" -yy634: - YYDEBUG(634, *YYCURSOR); +#line 6104 "Zend/zend_language_scanner.c" +yy638: + YYDEBUG(638, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy635; + if (yych == 'O') goto yy639; if (yych != 'o') goto yy187; -yy635: - YYDEBUG(635, *YYCURSOR); +yy639: + YYDEBUG(639, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy636; + if (yych == 'W') goto yy640; if (yych != 'w') goto yy187; -yy636: - YYDEBUG(636, *YYCURSOR); +yy640: + YYDEBUG(640, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(637, *YYCURSOR); + YYDEBUG(641, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1050 "Zend/zend_language_scanner.l" { return T_THROW; } -#line 6105 "Zend/zend_language_scanner.c" -yy638: - YYDEBUG(638, *YYCURSOR); +#line 6127 "Zend/zend_language_scanner.c" +yy642: + YYDEBUG(642, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy639; + if (yych == 'E') goto yy643; if (yych != 'e') goto yy187; -yy639: - YYDEBUG(639, *YYCURSOR); +yy643: + YYDEBUG(643, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy640; + if (yych == 'L') goto yy644; if (yych != 'l') goto yy187; -yy640: - YYDEBUG(640, *YYCURSOR); +yy644: + YYDEBUG(644, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy641; + if (yych == 'D') goto yy645; if (yych != 'd') goto yy187; -yy641: - YYDEBUG(641, *YYCURSOR); +yy645: + YYDEBUG(645, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(642, *YYCURSOR); + YYDEBUG(646, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1034 "Zend/zend_language_scanner.l" { return T_YIELD; } -#line 6133 "Zend/zend_language_scanner.c" -yy643: - YYDEBUG(643, *YYCURSOR); +#line 6155 "Zend/zend_language_scanner.c" +yy647: + YYDEBUG(647, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'Q') goto yy645; + if (yych == 'Q') goto yy649; if (yych <= 'S') goto yy187; } else { if (yych <= 'q') { if (yych <= 'p') goto yy187; - goto yy645; + goto yy649; } else { if (yych != 't') goto yy187; } } - YYDEBUG(644, *YYCURSOR); + YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy657; - if (yych == 'u') goto yy657; + if (yych == 'U') goto yy661; + if (yych == 'u') goto yy661; goto yy187; -yy645: - YYDEBUG(645, *YYCURSOR); +yy649: + YYDEBUG(649, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy646; + if (yych == 'U') goto yy650; if (yych != 'u') goto yy187; -yy646: - YYDEBUG(646, *YYCURSOR); +yy650: + YYDEBUG(650, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy647; + if (yych == 'I') goto yy651; if (yych != 'i') goto yy187; -yy647: - YYDEBUG(647, *YYCURSOR); +yy651: + YYDEBUG(651, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy648; + if (yych == 'R') goto yy652; if (yych != 'r') goto yy187; -yy648: - YYDEBUG(648, *YYCURSOR); +yy652: + YYDEBUG(652, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy649; + if (yych == 'E') goto yy653; if (yych != 'e') goto yy187; -yy649: - YYDEBUG(649, *YYCURSOR); +yy653: + YYDEBUG(653, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy650; + if (yych <= '@') goto yy654; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy651; + if (yych <= '_') goto yy655; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy650: - YYDEBUG(650, *YYCURSOR); +yy654: + YYDEBUG(654, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1262 "Zend/zend_language_scanner.l" { return T_REQUIRE; } -#line 6198 "Zend/zend_language_scanner.c" -yy651: - YYDEBUG(651, *YYCURSOR); +#line 6220 "Zend/zend_language_scanner.c" +yy655: + YYDEBUG(655, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy652; + if (yych == 'O') goto yy656; if (yych != 'o') goto yy187; -yy652: - YYDEBUG(652, *YYCURSOR); +yy656: + YYDEBUG(656, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy653; + if (yych == 'N') goto yy657; if (yych != 'n') goto yy187; -yy653: - YYDEBUG(653, *YYCURSOR); +yy657: + YYDEBUG(657, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy654; + if (yych == 'C') goto yy658; if (yych != 'c') goto yy187; -yy654: - YYDEBUG(654, *YYCURSOR); +yy658: + YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy655; + if (yych == 'E') goto yy659; if (yych != 'e') goto yy187; -yy655: - YYDEBUG(655, *YYCURSOR); +yy659: + YYDEBUG(659, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(656, *YYCURSOR); + YYDEBUG(660, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1266 "Zend/zend_language_scanner.l" { return T_REQUIRE_ONCE; } -#line 6231 "Zend/zend_language_scanner.c" -yy657: - YYDEBUG(657, *YYCURSOR); +#line 6253 "Zend/zend_language_scanner.c" +yy661: + YYDEBUG(661, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy658; + if (yych == 'R') goto yy662; if (yych != 'r') goto yy187; -yy658: - YYDEBUG(658, *YYCURSOR); +yy662: + YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy659; + if (yych == 'N') goto yy663; if (yych != 'n') goto yy187; -yy659: - YYDEBUG(659, *YYCURSOR); +yy663: + YYDEBUG(663, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(660, *YYCURSOR); + YYDEBUG(664, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1030 "Zend/zend_language_scanner.l" { return T_RETURN; } -#line 6254 "Zend/zend_language_scanner.c" -yy661: - YYDEBUG(661, *YYCURSOR); +#line 6276 "Zend/zend_language_scanner.c" +yy665: + YYDEBUG(665, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'L') { if (yych <= 'K') goto yy187; - goto yy684; + goto yy688; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy683; - goto yy682; + if (yych <= 'S') goto yy687; + goto yy686; } } else { if (yych <= 'r') { - if (yych == 'l') goto yy684; + if (yych == 'l') goto yy688; goto yy187; } else { - if (yych <= 's') goto yy683; - if (yych <= 't') goto yy682; + if (yych <= 's') goto yy687; + if (yych <= 't') goto yy686; goto yy187; } } -yy662: - YYDEBUG(662, *YYCURSOR); +yy666: + YYDEBUG(666, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'A') goto yy674; + if (yych == 'A') goto yy678; if (yych <= 'N') goto yy187; - goto yy675; + goto yy679; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy674; + goto yy678; } else { - if (yych == 'o') goto yy675; + if (yych == 'o') goto yy679; goto yy187; } } -yy663: - YYDEBUG(663, *YYCURSOR); +yy667: + YYDEBUG(667, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy664; + if (yych == 'N') goto yy668; if (yych != 'n') goto yy187; -yy664: - YYDEBUG(664, *YYCURSOR); +yy668: + YYDEBUG(668, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'R') goto yy187; - if (yych >= 'T') goto yy666; + if (yych >= 'T') goto yy670; } else { if (yych <= 'r') goto yy187; - if (yych <= 's') goto yy665; - if (yych <= 't') goto yy666; + if (yych <= 's') goto yy669; + if (yych <= 't') goto yy670; goto yy187; } -yy665: - YYDEBUG(665, *YYCURSOR); +yy669: + YYDEBUG(669, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy672; - if (yych == 't') goto yy672; + if (yych == 'T') goto yy676; + if (yych == 't') goto yy676; goto yy187; -yy666: - YYDEBUG(666, *YYCURSOR); +yy670: + YYDEBUG(670, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy667; + if (yych == 'I') goto yy671; if (yych != 'i') goto yy187; -yy667: - YYDEBUG(667, *YYCURSOR); +yy671: + YYDEBUG(671, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy668; + if (yych == 'N') goto yy672; if (yych != 'n') goto yy187; -yy668: - YYDEBUG(668, *YYCURSOR); +yy672: + YYDEBUG(672, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy669; + if (yych == 'U') goto yy673; if (yych != 'u') goto yy187; -yy669: - YYDEBUG(669, *YYCURSOR); +yy673: + YYDEBUG(673, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy670; + if (yych == 'E') goto yy674; if (yych != 'e') goto yy187; -yy670: - YYDEBUG(670, *YYCURSOR); +yy674: + YYDEBUG(674, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(671, *YYCURSOR); + YYDEBUG(675, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1134 "Zend/zend_language_scanner.l" { return T_CONTINUE; } -#line 6348 "Zend/zend_language_scanner.c" -yy672: - YYDEBUG(672, *YYCURSOR); +#line 6370 "Zend/zend_language_scanner.c" +yy676: + YYDEBUG(676, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(673, *YYCURSOR); + YYDEBUG(677, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1026 "Zend/zend_language_scanner.l" { return T_CONST; } -#line 6361 "Zend/zend_language_scanner.c" -yy674: - YYDEBUG(674, *YYCURSOR); +#line 6383 "Zend/zend_language_scanner.c" +yy678: + YYDEBUG(678, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy679; - if (yych == 's') goto yy679; + if (yych == 'S') goto yy683; + if (yych == 's') goto yy683; goto yy187; -yy675: - YYDEBUG(675, *YYCURSOR); +yy679: + YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy676; + if (yych == 'N') goto yy680; if (yych != 'n') goto yy187; -yy676: - YYDEBUG(676, *YYCURSOR); +yy680: + YYDEBUG(680, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy677; + if (yych == 'E') goto yy681; if (yych != 'e') goto yy187; -yy677: - YYDEBUG(677, *YYCURSOR); +yy681: + YYDEBUG(681, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(678, *YYCURSOR); + YYDEBUG(682, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1214 "Zend/zend_language_scanner.l" { return T_CLONE; } -#line 6390 "Zend/zend_language_scanner.c" -yy679: - YYDEBUG(679, *YYCURSOR); +#line 6412 "Zend/zend_language_scanner.c" +yy683: + YYDEBUG(683, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy680; + if (yych == 'S') goto yy684; if (yych != 's') goto yy187; -yy680: - YYDEBUG(680, *YYCURSOR); +yy684: + YYDEBUG(684, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(681, *YYCURSOR); + YYDEBUG(685, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1150 "Zend/zend_language_scanner.l" { return T_CLASS; } -#line 6408 "Zend/zend_language_scanner.c" -yy682: - YYDEBUG(682, *YYCURSOR); +#line 6430 "Zend/zend_language_scanner.c" +yy686: + YYDEBUG(686, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy693; - if (yych == 'c') goto yy693; + if (yych == 'C') goto yy697; + if (yych == 'c') goto yy697; goto yy187; -yy683: - YYDEBUG(683, *YYCURSOR); +yy687: + YYDEBUG(687, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy691; - if (yych == 'e') goto yy691; + if (yych == 'E') goto yy695; + if (yych == 'e') goto yy695; goto yy187; -yy684: - YYDEBUG(684, *YYCURSOR); +yy688: + YYDEBUG(688, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy685; + if (yych == 'L') goto yy689; if (yych != 'l') goto yy187; -yy685: - YYDEBUG(685, *YYCURSOR); +yy689: + YYDEBUG(689, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy686; + if (yych == 'A') goto yy690; if (yych != 'a') goto yy187; -yy686: - YYDEBUG(686, *YYCURSOR); +yy690: + YYDEBUG(690, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy687; + if (yych == 'B') goto yy691; if (yych != 'b') goto yy187; -yy687: - YYDEBUG(687, *YYCURSOR); +yy691: + YYDEBUG(691, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy688; + if (yych == 'L') goto yy692; if (yych != 'l') goto yy187; -yy688: - YYDEBUG(688, *YYCURSOR); +yy692: + YYDEBUG(692, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy689; + if (yych == 'E') goto yy693; if (yych != 'e') goto yy187; -yy689: - YYDEBUG(689, *YYCURSOR); +yy693: + YYDEBUG(693, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(690, *YYCURSOR); + YYDEBUG(694, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1338 "Zend/zend_language_scanner.l" { return T_CALLABLE; } -#line 6458 "Zend/zend_language_scanner.c" -yy691: - YYDEBUG(691, *YYCURSOR); +#line 6480 "Zend/zend_language_scanner.c" +yy695: + YYDEBUG(695, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(692, *YYCURSOR); + YYDEBUG(696, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1122 "Zend/zend_language_scanner.l" { return T_CASE; } -#line 6471 "Zend/zend_language_scanner.c" -yy693: - YYDEBUG(693, *YYCURSOR); +#line 6493 "Zend/zend_language_scanner.c" +yy697: + YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy694; + if (yych == 'H') goto yy698; if (yych != 'h') goto yy187; -yy694: - YYDEBUG(694, *YYCURSOR); +yy698: + YYDEBUG(698, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(695, *YYCURSOR); + YYDEBUG(699, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1042 "Zend/zend_language_scanner.l" { return T_CATCH; } -#line 6489 "Zend/zend_language_scanner.c" -yy696: - YYDEBUG(696, *YYCURSOR); +#line 6511 "Zend/zend_language_scanner.c" +yy700: + YYDEBUG(700, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy713; - if (yych == 'n') goto yy713; + if (yych == 'N') goto yy717; + if (yych == 'n') goto yy717; goto yy187; -yy697: - YYDEBUG(697, *YYCURSOR); +yy701: + YYDEBUG(701, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy706; - if (yych == 'r') goto yy706; + if (yych == 'R') goto yy710; + if (yych == 'r') goto yy710; goto yy187; -yy698: - YYDEBUG(698, *YYCURSOR); +yy702: + YYDEBUG(702, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy699; + if (yych == 'N') goto yy703; if (yych != 'n') goto yy187; -yy699: - YYDEBUG(699, *YYCURSOR); +yy703: + YYDEBUG(703, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy700; + if (yych == 'C') goto yy704; if (yych != 'c') goto yy187; -yy700: - YYDEBUG(700, *YYCURSOR); +yy704: + YYDEBUG(704, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy701; + if (yych == 'T') goto yy705; if (yych != 't') goto yy187; -yy701: - YYDEBUG(701, *YYCURSOR); +yy705: + YYDEBUG(705, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy702; + if (yych == 'I') goto yy706; if (yych != 'i') goto yy187; -yy702: - YYDEBUG(702, *YYCURSOR); +yy706: + YYDEBUG(706, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy703; + if (yych == 'O') goto yy707; if (yych != 'o') goto yy187; -yy703: - YYDEBUG(703, *YYCURSOR); +yy707: + YYDEBUG(707, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy704; + if (yych == 'N') goto yy708; if (yych != 'n') goto yy187; -yy704: - YYDEBUG(704, *YYCURSOR); +yy708: + YYDEBUG(708, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(705, *YYCURSOR); + YYDEBUG(709, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1022 "Zend/zend_language_scanner.l" { return T_FUNCTION; } -#line 6544 "Zend/zend_language_scanner.c" -yy706: - YYDEBUG(706, *YYCURSOR); +#line 6566 "Zend/zend_language_scanner.c" +yy710: + YYDEBUG(710, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy707; + if (yych <= '/') goto yy711; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy708; + if (yych == 'E') goto yy712; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy708; + if (yych <= 'e') goto yy712; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy707: - YYDEBUG(707, *YYCURSOR); +yy711: + YYDEBUG(711, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1082 "Zend/zend_language_scanner.l" { return T_FOR; } -#line 6572 "Zend/zend_language_scanner.c" -yy708: - YYDEBUG(708, *YYCURSOR); +#line 6594 "Zend/zend_language_scanner.c" +yy712: + YYDEBUG(712, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy709; + if (yych == 'A') goto yy713; if (yych != 'a') goto yy187; -yy709: - YYDEBUG(709, *YYCURSOR); +yy713: + YYDEBUG(713, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy710; + if (yych == 'C') goto yy714; if (yych != 'c') goto yy187; -yy710: - YYDEBUG(710, *YYCURSOR); +yy714: + YYDEBUG(714, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy711; + if (yych == 'H') goto yy715; if (yych != 'h') goto yy187; -yy711: - YYDEBUG(711, *YYCURSOR); +yy715: + YYDEBUG(715, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(712, *YYCURSOR); + YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1090 "Zend/zend_language_scanner.l" { return T_FOREACH; } -#line 6600 "Zend/zend_language_scanner.c" -yy713: - YYDEBUG(713, *YYCURSOR); +#line 6622 "Zend/zend_language_scanner.c" +yy717: + YYDEBUG(717, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy714; + if (yych == 'A') goto yy718; if (yych != 'a') goto yy187; -yy714: - YYDEBUG(714, *YYCURSOR); +yy718: + YYDEBUG(718, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy715; + if (yych == 'L') goto yy719; if (yych != 'l') goto yy187; -yy715: - YYDEBUG(715, *YYCURSOR); +yy719: + YYDEBUG(719, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy716; + if (yych <= '/') goto yy720; if (yych <= '9') goto yy186; } else { - if (yych == 'L') goto yy717; + if (yych == 'L') goto yy721; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'k') { if (yych != '`') goto yy186; } else { - if (yych <= 'l') goto yy717; + if (yych <= 'l') goto yy721; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy716: - YYDEBUG(716, *YYCURSOR); +yy720: + YYDEBUG(720, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1306 "Zend/zend_language_scanner.l" { return T_FINAL; } -#line 6638 "Zend/zend_language_scanner.c" -yy717: - YYDEBUG(717, *YYCURSOR); +#line 6660 "Zend/zend_language_scanner.c" +yy721: + YYDEBUG(721, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy718; + if (yych == 'Y') goto yy722; if (yych != 'y') goto yy187; -yy718: - YYDEBUG(718, *YYCURSOR); +yy722: + YYDEBUG(722, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(719, *YYCURSOR); + YYDEBUG(723, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1046 "Zend/zend_language_scanner.l" { return T_FINALLY; } -#line 6656 "Zend/zend_language_scanner.c" -yy720: - YYDEBUG(720, *YYCURSOR); +#line 6678 "Zend/zend_language_scanner.c" +yy724: + YYDEBUG(724, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'F') { - if (yych == 'C') goto yy726; + if (yych == 'C') goto yy730; if (yych <= 'E') goto yy187; - goto yy727; + goto yy731; } else { if (yych <= 'c') { if (yych <= 'b') goto yy187; - goto yy726; + goto yy730; } else { - if (yych == 'f') goto yy727; + if (yych == 'f') goto yy731; goto yy187; } } -yy721: - YYDEBUG(721, *YYCURSOR); +yy725: + YYDEBUG(725, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy724; - if (yych == 'e') goto yy724; + if (yych == 'E') goto yy728; + if (yych == 'e') goto yy728; goto yy187; -yy722: - YYDEBUG(722, *YYCURSOR); +yy726: + YYDEBUG(726, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(723, *YYCURSOR); + YYDEBUG(727, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1078 "Zend/zend_language_scanner.l" { return T_DO; } -#line 6691 "Zend/zend_language_scanner.c" -yy724: - YYDEBUG(724, *YYCURSOR); +#line 6713 "Zend/zend_language_scanner.c" +yy728: + YYDEBUG(728, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(725, *YYCURSOR); + YYDEBUG(729, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1018 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6704 "Zend/zend_language_scanner.c" -yy726: - YYDEBUG(726, *YYCURSOR); +#line 6726 "Zend/zend_language_scanner.c" +yy730: + YYDEBUG(730, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy733; - if (yych == 'l') goto yy733; + if (yych == 'L') goto yy737; + if (yych == 'l') goto yy737; goto yy187; -yy727: - YYDEBUG(727, *YYCURSOR); +yy731: + YYDEBUG(731, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy728; + if (yych == 'A') goto yy732; if (yych != 'a') goto yy187; -yy728: - YYDEBUG(728, *YYCURSOR); +yy732: + YYDEBUG(732, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy729; + if (yych == 'U') goto yy733; if (yych != 'u') goto yy187; -yy729: - YYDEBUG(729, *YYCURSOR); +yy733: + YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy730; + if (yych == 'L') goto yy734; if (yych != 'l') goto yy187; -yy730: - YYDEBUG(730, *YYCURSOR); +yy734: + YYDEBUG(734, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy731; + if (yych == 'T') goto yy735; if (yych != 't') goto yy187; -yy731: - YYDEBUG(731, *YYCURSOR); +yy735: + YYDEBUG(735, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(732, *YYCURSOR); + YYDEBUG(736, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1126 "Zend/zend_language_scanner.l" { return T_DEFAULT; } -#line 6743 "Zend/zend_language_scanner.c" -yy733: - YYDEBUG(733, *YYCURSOR); +#line 6765 "Zend/zend_language_scanner.c" +yy737: + YYDEBUG(737, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy734; + if (yych == 'A') goto yy738; if (yych != 'a') goto yy187; -yy734: - YYDEBUG(734, *YYCURSOR); +yy738: + YYDEBUG(738, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy735; + if (yych == 'R') goto yy739; if (yych != 'r') goto yy187; -yy735: - YYDEBUG(735, *YYCURSOR); +yy739: + YYDEBUG(739, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy736; + if (yych == 'E') goto yy740; if (yych != 'e') goto yy187; -yy736: - YYDEBUG(736, *YYCURSOR); +yy740: + YYDEBUG(740, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(737, *YYCURSOR); + YYDEBUG(741, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1098 "Zend/zend_language_scanner.l" { return T_DECLARE; } -#line 6771 "Zend/zend_language_scanner.c" -yy738: - YYDEBUG(738, *YYCURSOR); +#line 6793 "Zend/zend_language_scanner.c" +yy742: + YYDEBUG(742, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy800; - if (yych == 'h') goto yy800; + if (yych == 'H') goto yy804; + if (yych == 'h') goto yy804; goto yy187; -yy739: - YYDEBUG(739, *YYCURSOR); +yy743: + YYDEBUG(743, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy794; - if (yych == 's') goto yy794; + if (yych == 'S') goto yy798; + if (yych == 's') goto yy798; goto yy187; -yy740: - YYDEBUG(740, *YYCURSOR); +yy744: + YYDEBUG(744, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy790; - if (yych == 'p') goto yy790; + if (yych == 'P') goto yy794; + if (yych == 'p') goto yy794; goto yy187; -yy741: - YYDEBUG(741, *YYCURSOR); +yy745: + YYDEBUG(745, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy756; - if (yych == 'd') goto yy756; + if (yych == 'D') goto yy760; + if (yych == 'd') goto yy760; goto yy187; -yy742: - YYDEBUG(742, *YYCURSOR); +yy746: + YYDEBUG(746, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy753; - if (yych == 'a') goto yy753; + if (yych == 'A') goto yy757; + if (yych == 'a') goto yy757; goto yy187; -yy743: - YYDEBUG(743, *YYCURSOR); +yy747: + YYDEBUG(747, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'I') goto yy744; + if (yych == 'I') goto yy748; if (yych <= 'S') goto yy187; - goto yy745; + goto yy749; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; } else { - if (yych == 't') goto yy745; + if (yych == 't') goto yy749; goto yy187; } } -yy744: - YYDEBUG(744, *YYCURSOR); +yy748: + YYDEBUG(748, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy751; - if (yych == 't') goto yy751; + if (yych == 'T') goto yy755; + if (yych == 't') goto yy755; goto yy187; -yy745: - YYDEBUG(745, *YYCURSOR); +yy749: + YYDEBUG(749, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy746; + if (yych == 'E') goto yy750; if (yych != 'e') goto yy187; -yy746: - YYDEBUG(746, *YYCURSOR); +yy750: + YYDEBUG(750, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy747; + if (yych == 'N') goto yy751; if (yych != 'n') goto yy187; -yy747: - YYDEBUG(747, *YYCURSOR); +yy751: + YYDEBUG(751, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy748; + if (yych == 'D') goto yy752; if (yych != 'd') goto yy187; -yy748: - YYDEBUG(748, *YYCURSOR); +yy752: + YYDEBUG(752, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy749; + if (yych == 'S') goto yy753; if (yych != 's') goto yy187; -yy749: - YYDEBUG(749, *YYCURSOR); +yy753: + YYDEBUG(753, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(750, *YYCURSOR); + YYDEBUG(754, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1162 "Zend/zend_language_scanner.l" { return T_EXTENDS; } -#line 6855 "Zend/zend_language_scanner.c" -yy751: - YYDEBUG(751, *YYCURSOR); +#line 6877 "Zend/zend_language_scanner.c" +yy755: + YYDEBUG(755, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(752, *YYCURSOR); + YYDEBUG(756, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1014 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6868 "Zend/zend_language_scanner.c" -yy753: - YYDEBUG(753, *YYCURSOR); +#line 6890 "Zend/zend_language_scanner.c" +yy757: + YYDEBUG(757, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy754; + if (yych == 'L') goto yy758; if (yych != 'l') goto yy187; -yy754: - YYDEBUG(754, *YYCURSOR); +yy758: + YYDEBUG(758, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(755, *YYCURSOR); + YYDEBUG(759, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1250 "Zend/zend_language_scanner.l" { return T_EVAL; } -#line 6886 "Zend/zend_language_scanner.c" -yy756: - YYDEBUG(756, *YYCURSOR); +#line 6908 "Zend/zend_language_scanner.c" +yy760: + YYDEBUG(760, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'D': - case 'd': goto yy757; + case 'd': goto yy761; case 'F': - case 'f': goto yy758; + case 'f': goto yy762; case 'I': - case 'i': goto yy759; + case 'i': goto yy763; case 'S': - case 's': goto yy760; + case 's': goto yy764; case 'W': - case 'w': goto yy761; + case 'w': goto yy765; default: goto yy187; } -yy757: - YYDEBUG(757, *YYCURSOR); +yy761: + YYDEBUG(761, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy783; - if (yych == 'e') goto yy783; + if (yych == 'E') goto yy787; + if (yych == 'e') goto yy787; goto yy187; -yy758: - YYDEBUG(758, *YYCURSOR); +yy762: + YYDEBUG(762, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy775; - if (yych == 'o') goto yy775; + if (yych == 'O') goto yy779; + if (yych == 'o') goto yy779; goto yy187; -yy759: - YYDEBUG(759, *YYCURSOR); +yy763: + YYDEBUG(763, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy773; - if (yych == 'f') goto yy773; + if (yych == 'F') goto yy777; + if (yych == 'f') goto yy777; goto yy187; -yy760: - YYDEBUG(760, *YYCURSOR); +yy764: + YYDEBUG(764, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy767; - if (yych == 'w') goto yy767; + if (yych == 'W') goto yy771; + if (yych == 'w') goto yy771; goto yy187; -yy761: - YYDEBUG(761, *YYCURSOR); +yy765: + YYDEBUG(765, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy762; + if (yych == 'H') goto yy766; if (yych != 'h') goto yy187; -yy762: - YYDEBUG(762, *YYCURSOR); +yy766: + YYDEBUG(766, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy763; + if (yych == 'I') goto yy767; if (yych != 'i') goto yy187; -yy763: - YYDEBUG(763, *YYCURSOR); +yy767: + YYDEBUG(767, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy764; + if (yych == 'L') goto yy768; if (yych != 'l') goto yy187; -yy764: - YYDEBUG(764, *YYCURSOR); +yy768: + YYDEBUG(768, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy765; + if (yych == 'E') goto yy769; if (yych != 'e') goto yy187; -yy765: - YYDEBUG(765, *YYCURSOR); +yy769: + YYDEBUG(769, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(766, *YYCURSOR); + YYDEBUG(770, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1074 "Zend/zend_language_scanner.l" { return T_ENDWHILE; } -#line 6960 "Zend/zend_language_scanner.c" -yy767: - YYDEBUG(767, *YYCURSOR); +#line 6982 "Zend/zend_language_scanner.c" +yy771: + YYDEBUG(771, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy768; + if (yych == 'I') goto yy772; if (yych != 'i') goto yy187; -yy768: - YYDEBUG(768, *YYCURSOR); +yy772: + YYDEBUG(772, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy769; + if (yych == 'T') goto yy773; if (yych != 't') goto yy187; -yy769: - YYDEBUG(769, *YYCURSOR); +yy773: + YYDEBUG(773, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy770; + if (yych == 'C') goto yy774; if (yych != 'c') goto yy187; -yy770: - YYDEBUG(770, *YYCURSOR); +yy774: + YYDEBUG(774, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy771; + if (yych == 'H') goto yy775; if (yych != 'h') goto yy187; -yy771: - YYDEBUG(771, *YYCURSOR); +yy775: + YYDEBUG(775, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(772, *YYCURSOR); + YYDEBUG(776, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1118 "Zend/zend_language_scanner.l" { return T_ENDSWITCH; } -#line 6993 "Zend/zend_language_scanner.c" -yy773: - YYDEBUG(773, *YYCURSOR); +#line 7015 "Zend/zend_language_scanner.c" +yy777: + YYDEBUG(777, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(774, *YYCURSOR); + YYDEBUG(778, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1062 "Zend/zend_language_scanner.l" { return T_ENDIF; } -#line 7006 "Zend/zend_language_scanner.c" -yy775: - YYDEBUG(775, *YYCURSOR); +#line 7028 "Zend/zend_language_scanner.c" +yy779: + YYDEBUG(779, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy776; + if (yych == 'R') goto yy780; if (yych != 'r') goto yy187; -yy776: - YYDEBUG(776, *YYCURSOR); +yy780: + YYDEBUG(780, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy777; + if (yych <= '/') goto yy781; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy778; + if (yych == 'E') goto yy782; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy778; + if (yych <= 'e') goto yy782; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy777: - YYDEBUG(777, *YYCURSOR); +yy781: + YYDEBUG(781, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1086 "Zend/zend_language_scanner.l" { return T_ENDFOR; } -#line 7039 "Zend/zend_language_scanner.c" -yy778: - YYDEBUG(778, *YYCURSOR); +#line 7061 "Zend/zend_language_scanner.c" +yy782: + YYDEBUG(782, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy779; + if (yych == 'A') goto yy783; if (yych != 'a') goto yy187; -yy779: - YYDEBUG(779, *YYCURSOR); +yy783: + YYDEBUG(783, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy780; + if (yych == 'C') goto yy784; if (yych != 'c') goto yy187; -yy780: - YYDEBUG(780, *YYCURSOR); +yy784: + YYDEBUG(784, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy781; + if (yych == 'H') goto yy785; if (yych != 'h') goto yy187; -yy781: - YYDEBUG(781, *YYCURSOR); +yy785: + YYDEBUG(785, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(782, *YYCURSOR); + YYDEBUG(786, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1094 "Zend/zend_language_scanner.l" { return T_ENDFOREACH; } -#line 7067 "Zend/zend_language_scanner.c" -yy783: - YYDEBUG(783, *YYCURSOR); +#line 7089 "Zend/zend_language_scanner.c" +yy787: + YYDEBUG(787, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy784; + if (yych == 'C') goto yy788; if (yych != 'c') goto yy187; -yy784: - YYDEBUG(784, *YYCURSOR); +yy788: + YYDEBUG(788, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy785; + if (yych == 'L') goto yy789; if (yych != 'l') goto yy187; -yy785: - YYDEBUG(785, *YYCURSOR); +yy789: + YYDEBUG(789, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy786; + if (yych == 'A') goto yy790; if (yych != 'a') goto yy187; -yy786: - YYDEBUG(786, *YYCURSOR); +yy790: + YYDEBUG(790, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy787; + if (yych == 'R') goto yy791; if (yych != 'r') goto yy187; -yy787: - YYDEBUG(787, *YYCURSOR); +yy791: + YYDEBUG(791, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy788; + if (yych == 'E') goto yy792; if (yych != 'e') goto yy187; -yy788: - YYDEBUG(788, *YYCURSOR); +yy792: + YYDEBUG(792, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(789, *YYCURSOR); + YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1102 "Zend/zend_language_scanner.l" { return T_ENDDECLARE; } -#line 7105 "Zend/zend_language_scanner.c" -yy790: - YYDEBUG(790, *YYCURSOR); +#line 7127 "Zend/zend_language_scanner.c" +yy794: + YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy791; + if (yych == 'T') goto yy795; if (yych != 't') goto yy187; -yy791: - YYDEBUG(791, *YYCURSOR); +yy795: + YYDEBUG(795, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy792; + if (yych == 'Y') goto yy796; if (yych != 'y') goto yy187; -yy792: - YYDEBUG(792, *YYCURSOR); +yy796: + YYDEBUG(796, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(793, *YYCURSOR); + YYDEBUG(797, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1290 "Zend/zend_language_scanner.l" { return T_EMPTY; } -#line 7128 "Zend/zend_language_scanner.c" -yy794: - YYDEBUG(794, *YYCURSOR); +#line 7150 "Zend/zend_language_scanner.c" +yy798: + YYDEBUG(798, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy795; + if (yych == 'E') goto yy799; if (yych != 'e') goto yy187; -yy795: - YYDEBUG(795, *YYCURSOR); +yy799: + YYDEBUG(799, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy796; + if (yych <= '/') goto yy800; if (yych <= '9') goto yy186; } else { - if (yych == 'I') goto yy797; + if (yych == 'I') goto yy801; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'h') { if (yych != '`') goto yy186; } else { - if (yych <= 'i') goto yy797; + if (yych <= 'i') goto yy801; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy796: - YYDEBUG(796, *YYCURSOR); +yy800: + YYDEBUG(800, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1066 "Zend/zend_language_scanner.l" { return T_ELSE; } -#line 7161 "Zend/zend_language_scanner.c" -yy797: - YYDEBUG(797, *YYCURSOR); +#line 7183 "Zend/zend_language_scanner.c" +yy801: + YYDEBUG(801, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy798; + if (yych == 'F') goto yy802; if (yych != 'f') goto yy187; -yy798: - YYDEBUG(798, *YYCURSOR); +yy802: + YYDEBUG(802, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(799, *YYCURSOR); + YYDEBUG(803, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1058 "Zend/zend_language_scanner.l" { return T_ELSEIF; } -#line 7179 "Zend/zend_language_scanner.c" -yy800: - YYDEBUG(800, *YYCURSOR); +#line 7201 "Zend/zend_language_scanner.c" +yy804: + YYDEBUG(804, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy801; + if (yych == 'O') goto yy805; if (yych != 'o') goto yy187; -yy801: - YYDEBUG(801, *YYCURSOR); +yy805: + YYDEBUG(805, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(802, *YYCURSOR); + YYDEBUG(806, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1142 "Zend/zend_language_scanner.l" { return T_ECHO; } -#line 7197 "Zend/zend_language_scanner.c" +#line 7219 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7232,39 +7254,39 @@ yyc_ST_LOOKING_FOR_PROPERTY: 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, }; - YYDEBUG(803, *YYCURSOR); + YYDEBUG(807, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '-') { if (yych <= '\r') { - if (yych <= 0x08) goto yy811; - if (yych <= '\n') goto yy805; - if (yych <= '\f') goto yy811; + if (yych <= 0x08) goto yy815; + if (yych <= '\n') goto yy809; + if (yych <= '\f') goto yy815; } else { - if (yych == ' ') goto yy805; - if (yych <= ',') goto yy811; - goto yy807; + if (yych == ' ') goto yy809; + if (yych <= ',') goto yy815; + goto yy811; } } else { if (yych <= '_') { - if (yych <= '@') goto yy811; - if (yych <= 'Z') goto yy809; - if (yych <= '^') goto yy811; - goto yy809; + if (yych <= '@') goto yy815; + if (yych <= 'Z') goto yy813; + if (yych <= '^') goto yy815; + goto yy813; } else { - if (yych <= '`') goto yy811; - if (yych <= 'z') goto yy809; - if (yych <= '~') goto yy811; - goto yy809; + if (yych <= '`') goto yy815; + if (yych <= 'z') goto yy813; + if (yych <= '~') goto yy815; + goto yy813; } } -yy805: - YYDEBUG(805, *YYCURSOR); +yy809: + YYDEBUG(809, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy817; -yy806: - YYDEBUG(806, *YYCURSOR); + goto yy821; +yy810: + YYDEBUG(810, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1175 "Zend/zend_language_scanner.l" { @@ -7272,13 +7294,13 @@ yy806: HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 7276 "Zend/zend_language_scanner.c" -yy807: - YYDEBUG(807, *YYCURSOR); +#line 7298 "Zend/zend_language_scanner.c" +yy811: + YYDEBUG(811, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '>') goto yy814; -yy808: - YYDEBUG(808, *YYCURSOR); + if ((yych = *YYCURSOR) == '>') goto yy818; +yy812: + YYDEBUG(812, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1192 "Zend/zend_language_scanner.l" { @@ -7286,14 +7308,14 @@ yy808: yy_pop_state(TSRMLS_C); goto restart; } -#line 7290 "Zend/zend_language_scanner.c" -yy809: - YYDEBUG(809, *YYCURSOR); +#line 7312 "Zend/zend_language_scanner.c" +yy813: + YYDEBUG(813, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy813; -yy810: - YYDEBUG(810, *YYCURSOR); + goto yy817; +yy814: + YYDEBUG(814, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1185 "Zend/zend_language_scanner.l" { @@ -7302,43 +7324,43 @@ yy810: zendlval->type = IS_STRING; return T_STRING; } -#line 7306 "Zend/zend_language_scanner.c" -yy811: - YYDEBUG(811, *YYCURSOR); +#line 7328 "Zend/zend_language_scanner.c" +yy815: + YYDEBUG(815, *YYCURSOR); yych = *++YYCURSOR; - goto yy808; -yy812: - YYDEBUG(812, *YYCURSOR); + goto yy812; +yy816: + YYDEBUG(816, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy813: - YYDEBUG(813, *YYCURSOR); +yy817: + YYDEBUG(817, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy812; + goto yy816; } - goto yy810; -yy814: - YYDEBUG(814, *YYCURSOR); + goto yy814; +yy818: + YYDEBUG(818, *YYCURSOR); ++YYCURSOR; - YYDEBUG(815, *YYCURSOR); + YYDEBUG(819, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1181 "Zend/zend_language_scanner.l" { return T_OBJECT_OPERATOR; } -#line 7331 "Zend/zend_language_scanner.c" -yy816: - YYDEBUG(816, *YYCURSOR); +#line 7353 "Zend/zend_language_scanner.c" +yy820: + YYDEBUG(820, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy817: - YYDEBUG(817, *YYCURSOR); +yy821: + YYDEBUG(821, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy816; + goto yy820; } - goto yy806; + goto yy810; } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: @@ -7377,74 +7399,74 @@ yyc_ST_LOOKING_FOR_VARNAME: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(818, *YYCURSOR); + YYDEBUG(822, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy822; - if (yych <= 'Z') goto yy820; - if (yych <= '^') goto yy822; + if (yych <= '@') goto yy826; + if (yych <= 'Z') goto yy824; + if (yych <= '^') goto yy826; } else { - if (yych <= '`') goto yy822; - if (yych <= 'z') goto yy820; - if (yych <= '~') goto yy822; + if (yych <= '`') goto yy826; + if (yych <= 'z') goto yy824; + if (yych <= '~') goto yy826; } -yy820: - YYDEBUG(820, *YYCURSOR); +yy824: + YYDEBUG(824, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { - if (yych <= '/') goto yy821; - if (yych <= '9') goto yy824; + if (yych <= '/') goto yy825; + if (yych <= '9') goto yy828; } else { - if (yych <= '[') goto yy824; - if (yych >= '_') goto yy824; + if (yych <= '[') goto yy828; + if (yych >= '_') goto yy828; } } else { if (yych <= '|') { - if (yych <= '`') goto yy821; - if (yych <= 'z') goto yy824; + if (yych <= '`') goto yy825; + if (yych <= 'z') goto yy828; } else { - if (yych != '~') goto yy824; + if (yych != '~') goto yy828; } } -yy821: - YYDEBUG(821, *YYCURSOR); +yy825: + YYDEBUG(825, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1482 "Zend/zend_language_scanner.l" +#line 1490 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); goto restart; } -#line 7423 "Zend/zend_language_scanner.c" -yy822: - YYDEBUG(822, *YYCURSOR); +#line 7445 "Zend/zend_language_scanner.c" +yy826: + YYDEBUG(826, *YYCURSOR); yych = *++YYCURSOR; - goto yy821; -yy823: - YYDEBUG(823, *YYCURSOR); + goto yy825; +yy827: + YYDEBUG(827, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy824: - YYDEBUG(824, *YYCURSOR); +yy828: + YYDEBUG(828, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy823; + goto yy827; } - if (yych == '[') goto yy826; - if (yych == '}') goto yy826; - YYDEBUG(825, *YYCURSOR); + if (yych == '[') goto yy830; + if (yych == '}') goto yy830; + YYDEBUG(829, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy821; -yy826: - YYDEBUG(826, *YYCURSOR); + goto yy825; +yy830: + YYDEBUG(830, *YYCURSOR); ++YYCURSOR; - YYDEBUG(827, *YYCURSOR); + YYDEBUG(831, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1472 "Zend/zend_language_scanner.l" +#line 1480 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7453,18 +7475,18 @@ yy826: yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return T_STRING_VARNAME; } -#line 7457 "Zend/zend_language_scanner.c" +#line 7479 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: - YYDEBUG(828, *YYCURSOR); + YYDEBUG(832, *YYCURSOR); YYFILL(1); yych = *YYCURSOR; - YYDEBUG(830, *YYCURSOR); + YYDEBUG(834, *YYCURSOR); ++YYCURSOR; - YYDEBUG(831, *YYCURSOR); + YYDEBUG(835, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2302 "Zend/zend_language_scanner.l" +#line 2310 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7521,7 +7543,7 @@ nowdoc_scan_done: HANDLE_NEWLINES(yytext, yyleng - newline); return T_ENCAPSED_AND_WHITESPACE; } -#line 7525 "Zend/zend_language_scanner.c" +#line 7547 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7559,76 +7581,76 @@ yyc_ST_VAR_OFFSET: 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }; - YYDEBUG(832, *YYCURSOR); + YYDEBUG(836, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '/') { if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy846; - if (yych <= '\n') goto yy842; - goto yy846; + if (yych <= 0x08) goto yy850; + if (yych <= '\n') goto yy846; + goto yy850; } else { - if (yych <= '\r') goto yy842; - if (yych <= 0x1F) goto yy846; - goto yy842; + if (yych <= '\r') goto yy846; + if (yych <= 0x1F) goto yy850; + goto yy846; } } else { if (yych <= '$') { - if (yych <= '"') goto yy841; - if (yych <= '#') goto yy842; - goto yy837; - } else { - if (yych == '\'') goto yy842; + if (yych <= '"') goto yy845; + if (yych <= '#') goto yy846; goto yy841; + } else { + if (yych == '\'') goto yy846; + goto yy845; } } } else { if (yych <= '\\') { if (yych <= '@') { - if (yych <= '0') goto yy834; - if (yych <= '9') goto yy836; - goto yy841; + if (yych <= '0') goto yy838; + if (yych <= '9') goto yy840; + goto yy845; } else { - if (yych <= 'Z') goto yy844; - if (yych <= '[') goto yy841; - goto yy842; + if (yych <= 'Z') goto yy848; + if (yych <= '[') goto yy845; + goto yy846; } } else { if (yych <= '_') { - if (yych <= ']') goto yy839; - if (yych <= '^') goto yy841; - goto yy844; + if (yych <= ']') goto yy843; + if (yych <= '^') goto yy845; + goto yy848; } else { - if (yych <= '`') goto yy841; - if (yych <= 'z') goto yy844; - if (yych <= '~') goto yy841; - goto yy844; + if (yych <= '`') goto yy845; + if (yych <= 'z') goto yy848; + if (yych <= '~') goto yy845; + goto yy848; } } } -yy834: - YYDEBUG(834, *YYCURSOR); +yy838: + YYDEBUG(838, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { if (yych <= '9') { - if (yych >= '0') goto yy858; + if (yych >= '0') goto yy862; } else { - if (yych == 'B') goto yy855; + if (yych == 'B') goto yy859; } } else { if (yych <= 'b') { - if (yych <= 'X') goto yy857; - if (yych >= 'b') goto yy855; + if (yych <= 'X') goto yy861; + if (yych >= 'b') goto yy859; } else { - if (yych == 'x') goto yy857; + if (yych == 'x') goto yy861; } } -yy835: - YYDEBUG(835, *YYCURSOR); +yy839: + YYDEBUG(839, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1558 "Zend/zend_language_scanner.l" +#line 1566 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); @@ -7637,81 +7659,81 @@ yy835: } return T_NUM_STRING; } -#line 7641 "Zend/zend_language_scanner.c" -yy836: - YYDEBUG(836, *YYCURSOR); +#line 7663 "Zend/zend_language_scanner.c" +yy840: + YYDEBUG(840, *YYCURSOR); yych = *++YYCURSOR; - goto yy854; -yy837: - YYDEBUG(837, *YYCURSOR); + goto yy858; +yy841: + YYDEBUG(841, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '_') { - if (yych <= '@') goto yy838; - if (yych <= 'Z') goto yy850; - if (yych >= '_') goto yy850; + if (yych <= '@') goto yy842; + if (yych <= 'Z') goto yy854; + if (yych >= '_') goto yy854; } else { - if (yych <= '`') goto yy838; - if (yych <= 'z') goto yy850; - if (yych >= 0x7F) goto yy850; + if (yych <= '`') goto yy842; + if (yych <= 'z') goto yy854; + if (yych >= 0x7F) goto yy854; } -yy838: - YYDEBUG(838, *YYCURSOR); +yy842: + YYDEBUG(842, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1834 "Zend/zend_language_scanner.l" +#line 1842 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ return yytext[0]; } -#line 7666 "Zend/zend_language_scanner.c" -yy839: - YYDEBUG(839, *YYCURSOR); +#line 7688 "Zend/zend_language_scanner.c" +yy843: + YYDEBUG(843, *YYCURSOR); ++YYCURSOR; - YYDEBUG(840, *YYCURSOR); + YYDEBUG(844, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1829 "Zend/zend_language_scanner.l" +#line 1837 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); return ']'; } -#line 7677 "Zend/zend_language_scanner.c" -yy841: - YYDEBUG(841, *YYCURSOR); +#line 7699 "Zend/zend_language_scanner.c" +yy845: + YYDEBUG(845, *YYCURSOR); yych = *++YYCURSOR; - goto yy838; -yy842: - YYDEBUG(842, *YYCURSOR); + goto yy842; +yy846: + YYDEBUG(846, *YYCURSOR); ++YYCURSOR; - YYDEBUG(843, *YYCURSOR); + YYDEBUG(847, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1839 "Zend/zend_language_scanner.l" +#line 1847 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); yy_pop_state(TSRMLS_C); return T_ENCAPSED_AND_WHITESPACE; } -#line 7694 "Zend/zend_language_scanner.c" -yy844: - YYDEBUG(844, *YYCURSOR); +#line 7716 "Zend/zend_language_scanner.c" +yy848: + YYDEBUG(848, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy849; -yy845: - YYDEBUG(845, *YYCURSOR); + goto yy853; +yy849: + YYDEBUG(849, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1846 "Zend/zend_language_scanner.l" +#line 1854 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7709 "Zend/zend_language_scanner.c" -yy846: - YYDEBUG(846, *YYCURSOR); +#line 7731 "Zend/zend_language_scanner.c" +yy850: + YYDEBUG(850, *YYCURSOR); ++YYCURSOR; - YYDEBUG(847, *YYCURSOR); + YYDEBUG(851, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2360 "Zend/zend_language_scanner.l" +#line 2368 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -7720,116 +7742,116 @@ yy846: zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7724 "Zend/zend_language_scanner.c" -yy848: - YYDEBUG(848, *YYCURSOR); +#line 7746 "Zend/zend_language_scanner.c" +yy852: + YYDEBUG(852, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy849: - YYDEBUG(849, *YYCURSOR); +yy853: + YYDEBUG(853, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy848; + goto yy852; } - goto yy845; -yy850: - YYDEBUG(850, *YYCURSOR); + goto yy849; +yy854: + YYDEBUG(854, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(851, *YYCURSOR); + YYDEBUG(855, *YYCURSOR); if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy850; + if (yych >= '0') goto yy854; } else { - if (yych <= '@') goto yy852; - if (yych <= 'Z') goto yy850; + if (yych <= '@') goto yy856; + if (yych <= 'Z') goto yy854; } } else { if (yych <= '`') { - if (yych <= '_') goto yy850; + if (yych <= '_') goto yy854; } else { - if (yych <= 'z') goto yy850; - if (yych >= 0x7F) goto yy850; + if (yych <= 'z') goto yy854; + if (yych >= 0x7F) goto yy854; } } -yy852: - YYDEBUG(852, *YYCURSOR); +yy856: + YYDEBUG(856, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1823 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 7766 "Zend/zend_language_scanner.c" -yy853: - YYDEBUG(853, *YYCURSOR); +#line 7788 "Zend/zend_language_scanner.c" +yy857: + YYDEBUG(857, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy854: - YYDEBUG(854, *YYCURSOR); +yy858: + YYDEBUG(858, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy853; + goto yy857; } - goto yy835; -yy855: - YYDEBUG(855, *YYCURSOR); + goto yy839; +yy859: + YYDEBUG(859, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy863; + goto yy867; } -yy856: - YYDEBUG(856, *YYCURSOR); +yy860: + YYDEBUG(860, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy835; -yy857: - YYDEBUG(857, *YYCURSOR); + goto yy839; +yy861: + YYDEBUG(861, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy861; + goto yy865; } - goto yy856; -yy858: - YYDEBUG(858, *YYCURSOR); + goto yy860; +yy862: + YYDEBUG(862, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(859, *YYCURSOR); - if (yych <= '/') goto yy860; - if (yych <= '9') goto yy858; -yy860: - YYDEBUG(860, *YYCURSOR); + YYDEBUG(863, *YYCURSOR); + if (yych <= '/') goto yy864; + if (yych <= '9') goto yy862; +yy864: + YYDEBUG(864, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1567 "Zend/zend_language_scanner.l" +#line 1575 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } -#line 7811 "Zend/zend_language_scanner.c" -yy861: - YYDEBUG(861, *YYCURSOR); +#line 7833 "Zend/zend_language_scanner.c" +yy865: + YYDEBUG(865, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(862, *YYCURSOR); + YYDEBUG(866, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy861; + goto yy865; } - goto yy860; -yy863: - YYDEBUG(863, *YYCURSOR); + goto yy864; +yy867: + YYDEBUG(867, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(864, *YYCURSOR); + YYDEBUG(868, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy863; + goto yy867; } - goto yy860; + goto yy864; } } -#line 2369 "Zend/zend_language_scanner.l" +#line 2377 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index ccf8a4ca0..4f50658a5 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1383,6 +1383,14 @@ NEWLINE ("\r"|"\n"|"\r\n") return T_MUL_EQUAL; } +<ST_IN_SCRIPTING>"*\*" { + return T_POW; +} + +<ST_IN_SCRIPTING>"*\*=" { + return T_POW_EQUAL; +} + <ST_IN_SCRIPTING>"/=" { return T_DIV_EQUAL; } diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h index 70ce8b890..5926e3c61 100644 --- a/Zend/zend_language_scanner_defs.h +++ b/Zend/zend_language_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Dec 22 13:03:33 2013 */ +/* Generated by re2c 0.13.5 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index af64e5a7f..457f08f31 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -768,6 +768,9 @@ ZEND_API binary_op_type get_binary_op(int opcode) case ZEND_ASSIGN_MUL: return (binary_op_type) mul_function; break; + case ZEND_POW: + return (binary_op_type) pow_function; + break; case ZEND_DIV: case ZEND_ASSIGN_DIV: return (binary_op_type) div_function; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 3434694f4..f022909bc 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -963,6 +963,89 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ * } /* }}} */ +ZEND_API int pow_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) +{ + zval op1_copy, op2_copy; + int converted = 0; + + while (1) { + switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) { + case TYPE_PAIR(IS_LONG, IS_LONG): + if (Z_LVAL_P(op2) >= 0) { + long l1 = 1, l2 = Z_LVAL_P(op1), i = Z_LVAL_P(op2); + + if (i == 0) { + ZVAL_LONG(result, 1L); + return SUCCESS; + } else if (l2 == 0) { + ZVAL_LONG(result, 0); + return SUCCESS; + } + + while (i >= 1) { + long overflow; + double dval = 0.0; + + if (i % 2) { + --i; + ZEND_SIGNED_MULTIPLY_LONG(l1, l2, l1, dval, overflow); + if (overflow) { + ZVAL_DOUBLE(result, dval * pow(l2, i)); + return SUCCESS; + } + } else { + i /= 2; + ZEND_SIGNED_MULTIPLY_LONG(l2, l2, l2, dval, overflow); + if (overflow) { + ZVAL_DOUBLE(result, (double)l1 * pow(dval, i)); + return SUCCESS; + } + } + } + /* i == 0 */ + ZVAL_LONG(result, l1); + } else { + ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2))); + } + return SUCCESS; + + case TYPE_PAIR(IS_LONG, IS_DOUBLE): + ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), Z_DVAL_P(op2))); + return SUCCESS; + + case TYPE_PAIR(IS_DOUBLE, IS_LONG): + ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), (double)Z_LVAL_P(op2))); + return SUCCESS; + + case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE): + ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), Z_DVAL_P(op2))); + return SUCCESS; + + default: + if (!converted) { + ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW); + + if (Z_TYPE_P(op1) == IS_ARRAY) { + ZVAL_LONG(result, 0); + return SUCCESS; + } else { + zendi_convert_scalar_to_number(op1, op1_copy, result); + } + if (Z_TYPE_P(op2) == IS_ARRAY) { + ZVAL_LONG(result, 1L); + return SUCCESS; + } else { + zendi_convert_scalar_to_number(op2, op2_copy, result); + } + converted = 1; + } else { + zend_error(E_ERROR, "Unsupported operand types"); + return FAILURE; + } + } + } +} + ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ { zval op1_copy, op2_copy; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index cfc84063e..1fab48126 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -47,6 +47,7 @@ BEGIN_EXTERN_C() ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); +ZEND_API int pow_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1e8a83155..713d6fade 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5659,4 +5659,24 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, ANY) } } +ZEND_VM_HANDLER(166, ZEND_POW, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + GET_OP1_ZVAL_PTR(BP_VAR_R), + GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC); + FREE_OP1(); + FREE_OP2(); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV) +{ + ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op,pow_function); +} + ZEND_VM_EXPORT_HELPER(zend_do_fcall, zend_do_fcall_common_helper) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7e613cd6e..2593c26f4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4492,6 +4492,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + opline->op1.zv, + opline->op2.zv TSRMLS_CC); + + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -5179,6 +5194,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + opline->op1.zv, + _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + + zval_dtor(free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6192,6 +6222,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + opline->op1.zv, + _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + + zval_ptr_dtor_nogc(&free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -7660,6 +7705,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + opline->op1.zv, + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); + + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -9709,6 +9769,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + opline->op2.zv TSRMLS_CC); + zval_dtor(free_op1.var); + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10398,6 +10473,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + zval_dtor(free_op1.var); + zval_dtor(free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -11413,6 +11503,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + zval_dtor(free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -12678,6 +12783,21 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); + zval_dtor(free_op1.var); + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16575,6 +16695,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + opline->op2.zv TSRMLS_CC); + zval_ptr_dtor_nogc(&free_op1.var); + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -18645,6 +18785,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + zval_ptr_dtor_nogc(&free_op1.var); + zval_dtor(free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_VAR_TMP(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -21096,6 +21256,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_VAR_VAR(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -22243,6 +22423,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -24362,6 +24547,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); + zval_ptr_dtor_nogc(&free_op1.var); + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_VAR_CV(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -25854,6 +26059,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -27163,6 +27373,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -28473,6 +28688,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -28897,6 +29117,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -30203,6 +30428,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_UNUSED_CV(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -33699,6 +33929,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), + opline->op2.zv TSRMLS_CC); + + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_CV_CONST(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -35630,6 +35880,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), + _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + + zval_dtor(free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_CV_TMP(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -37941,6 +38211,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), + _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); + + zval_ptr_dtor_nogc(&free_op2.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_CV_VAR(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -38939,6 +39229,11 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_CV_UNUSED(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -40918,6 +41213,26 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS ZEND_VM_RETURN(); } +static int ZEND_FASTCALL ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + + SAVE_OPLINE(); + pow_function(&EX_T(opline->result.var).tmp_var, + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), + _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); + + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + return zend_binary_assign_op_helper_SPEC_CV_CV(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type); @@ -45078,6 +45393,56 @@ void zend_init_opcodes_handlers(void) ZEND_SEND_UNPACK_SPEC_HANDLER, ZEND_SEND_UNPACK_SPEC_HANDLER, ZEND_SEND_UNPACK_SPEC_HANDLER, + ZEND_POW_SPEC_CONST_CONST_HANDLER, + ZEND_POW_SPEC_CONST_TMP_HANDLER, + ZEND_POW_SPEC_CONST_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POW_SPEC_CONST_CV_HANDLER, + ZEND_POW_SPEC_TMP_CONST_HANDLER, + ZEND_POW_SPEC_TMP_TMP_HANDLER, + ZEND_POW_SPEC_TMP_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POW_SPEC_TMP_CV_HANDLER, + ZEND_POW_SPEC_VAR_CONST_HANDLER, + ZEND_POW_SPEC_VAR_TMP_HANDLER, + ZEND_POW_SPEC_VAR_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POW_SPEC_VAR_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POW_SPEC_CV_CONST_HANDLER, + ZEND_POW_SPEC_CV_TMP_HANDLER, + ZEND_POW_SPEC_CV_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POW_SPEC_CV_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMP_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_VAR_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER, + ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_HANDLER, + ZEND_ASSIGN_POW_SPEC_UNUSED_TMP_HANDLER, + ZEND_ASSIGN_POW_SPEC_UNUSED_VAR_HANDLER, + ZEND_ASSIGN_POW_SPEC_UNUSED_UNUSED_HANDLER, + ZEND_ASSIGN_POW_SPEC_UNUSED_CV_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMP_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_VAR_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_UNUSED_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER, ZEND_NULL_HANDLER }; zend_opcode_handlers = (opcode_handler_t*)labels; diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index fc6c6177b..a25ff9deb 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1216,7 +1216,7 @@ function gen_vm($def, $skel) { fputs($f,"#define $op $code\n"); } - fputs($f, "\n#endif"); + fputs($f, "\n#endif\n"); fclose($f); echo "zend_vm_opcodes.h generated successfully.\n"; diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index d6f51cce5..23edabc47 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -21,7 +21,7 @@ #include <stdio.h> #include <zend.h> -const char *zend_vm_opcodes_map[166] = { +const char *zend_vm_opcodes_map[168] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -188,6 +188,8 @@ const char *zend_vm_opcodes_map[166] = { "ZEND_FAST_RET", "ZEND_RECV_VARIADIC", "ZEND_SEND_UNPACK", + "ZEND_POW", + "ZEND_ASSIGN_POW", }; ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index c4cab07ae..f9c30ca12 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -171,5 +171,7 @@ ZEND_API const char *zend_get_opcode_name(zend_uchar opcode); #define ZEND_FAST_RET 163 #define ZEND_RECV_VARIADIC 164 #define ZEND_SEND_UNPACK 165 +#define ZEND_POW 166 +#define ZEND_ASSIGN_POW 167 -#endif
\ No newline at end of file +#endif @@ -3666,7 +3666,7 @@ ac_config_headers="$ac_config_headers main/php_config.h" PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=6 PHP_RELEASE_VERSION=0 -PHP_EXTRA_VERSION="alpha1" +PHP_EXTRA_VERSION="alpha2" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr $PHP_MAJOR_VERSION \* 10000 + $PHP_MINOR_VERSION \* 100 + $PHP_RELEASE_VERSION` diff --git a/configure.in b/configure.in index 5843023f9..c9ccd880a 100644 --- a/configure.in +++ b/configure.in @@ -120,7 +120,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=6 PHP_RELEASE_VERSION=0 -PHP_EXTRA_VERSION="alpha1" +PHP_EXTRA_VERSION="alpha2" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/ext/curl/tests/bug61948-win32.phpt b/ext/curl/tests/bug61948-win32.phpt index dc86526b7..00f498f91 100644 --- a/ext/curl/tests/bug61948-win32.phpt +++ b/ext/curl/tests/bug61948-win32.phpt @@ -17,9 +17,7 @@ open_basedir="c:/tmp" ?> --EXPECTF-- %a - -Warning: curl_setopt(): open_basedir restriction in effect. File(c:/tmp/foo) is not within the allowed path(s): (c:/tmp) in %sbug61948-win32.php on line %d -bool(false) +bool(true) Warning: curl_setopt(): open_basedir restriction in effect. File(c:/xxx/bar) is not within the allowed path(s): (c:/tmp) in %sbug61948-win32.php on line %d bool(false) diff --git a/ext/date/lib/fallbackmap.h b/ext/date/lib/fallbackmap.h index 4e4c23c96..af69482c0 100644 --- a/ext/date/lib/fallbackmap.h +++ b/ext/date/lib/fallbackmap.h @@ -1,40 +1,42 @@ - { "sst", 0, -11, "Pacific/Apia" }, - { "hst", 0, -10, "Pacific/Honolulu" }, - { "akst", 0, -9, "America/Anchorage" }, - { "akdt", 1, -8, "America/Anchorage" }, - { "pst", 0, -8, "America/Los_Angeles" }, - { "pdt", 1, -7, "America/Los_Angeles" }, - { "mst", 0, -7, "America/Denver" }, - { "mdt", 1, -6, "America/Denver" }, - { "cst", 0, -6, "America/Chicago" }, - { "cdt", 1, -5, "America/Chicago" }, - { "est", 0, -5, "America/New_York" }, - { "edt", 1, -4, "America/New_York" }, - { "ast", 0, -4, "America/Halifax" }, - { "adt", 1, -3, "America/Halifax" }, - { "brt", 0, -3, "America/Sao_Paulo" }, - { "brst", 1, -2, "America/Sao_Paulo" }, - { "azost", 0, -1, "Atlantic/Azores" }, - { "azodt", 1, 0, "Atlantic/Azores" }, - { "gmt", 0, 0, "Europe/London" }, - { "bst", 1, 1, "Europe/London" }, - { "cet", 0, 1, "Europe/Paris" }, - { "cest", 1, 2, "Europe/Paris" }, - { "eet", 0, 2, "Europe/Helsinki" }, - { "eest", 1, 3, "Europe/Helsinki" }, - { "msk", 0, 3, "Europe/Moscow" }, - { "msd", 1, 4, "Europe/Moscow" }, - { "gst", 0, 4, "Asia/Dubai" }, - { "pkt", 0, 5, "Asia/Karachi" }, - { "ist", 0, 5.5, "Asia/Kolkata" }, - { "npt", 0, 5.75, "Asia/Katmandu" }, - { "yekt", 1, 6, "Asia/Yekaterinburg" }, - { "novst", 1, 7, "Asia/Novosibirsk" }, - { "krat", 0, 7, "Asia/Krasnoyarsk" }, - { "krast", 1, 8, "Asia/Krasnoyarsk" }, - { "jst", 0, 9, "Asia/Tokyo" }, - { "est", 0, 10, "Australia/Melbourne" }, - { "cst", 1, 10.5, "Australia/Adelaide" }, - { "est", 1, 11, "Australia/Melbourne" }, - { "nzst", 0, 12, "Pacific/Auckland" }, - { "nzdt", 1, 13, "Pacific/Auckland" }, + { "sst", 0, -660, "Pacific/Apia" }, + { "hst", 0, -600, "Pacific/Honolulu" }, + { "akst", 0, -540, "America/Anchorage" }, + { "akdt", 1, -480, "America/Anchorage" }, + { "pst", 0, -480, "America/Los_Angeles" }, + { "pdt", 1, -420, "America/Los_Angeles" }, + { "mst", 0, -420, "America/Denver" }, + { "mdt", 1, -360, "America/Denver" }, + { "cst", 0, -360, "America/Chicago" }, + { "cdt", 1, -300, "America/Chicago" }, + { "est", 0, -300, "America/New_York" }, + { "vet", 0, -270, "America/Caracas" }, + { "edt", 1, -240, "America/New_York" }, + { "ast", 0, -240, "America/Halifax" }, + { "adt", 1, -180, "America/Halifax" }, + { "brt", 0, -180, "America/Sao_Paulo" }, + { "brst", 1, -120, "America/Sao_Paulo" }, + { "azost", 0, -60, "Atlantic/Azores" }, + { "azodt", 1, 0, "Atlantic/Azores" }, + { "gmt", 0, 0, "Europe/London" }, + { "bst", 1, 60, "Europe/London" }, + { "cet", 0, 60, "Europe/Paris" }, + { "cest", 1, 120, "Europe/Paris" }, + { "eet", 0, 120, "Europe/Helsinki" }, + { "eest", 1, 180, "Europe/Helsinki" }, + { "msk", 0, 180, "Europe/Moscow" }, + { "msd", 1, 240, "Europe/Moscow" }, + { "gst", 0, 240, "Asia/Dubai" }, + { "pkt", 0, 300, "Asia/Karachi" }, + { "ist", 0, 330, "Asia/Kolkata" }, + { "npt", 0, 345, "Asia/Katmandu" }, + { "yekt", 1, 360, "Asia/Yekaterinburg" }, + { "novst", 1, 420, "Asia/Novosibirsk" }, + { "krat", 0, 420, "Asia/Krasnoyarsk" }, + { "cst", 0, 480, "Asia/Shanghai" }, + { "krast", 1, 480, "Asia/Krasnoyarsk" }, + { "jst", 0, 540, "Asia/Tokyo" }, + { "est", 0, 600, "Australia/Melbourne" }, + { "cst", 1, 630, "Australia/Adelaide" }, + { "est", 1, 660, "Australia/Melbourne" }, + { "nzst", 0, 720, "Pacific/Auckland" }, + { "nzdt", 1, 780, "Pacific/Auckland" }, diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index d2e00584f..8fd3a198b 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,9 +1,9 @@ -/* Generated by re2c 0.13.5 on Sun Aug 25 15:12:48 2013 */ +/* Generated by re2c 0.13.5 on Thu Feb 6 07:35:53 2014 */ /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2014 The PHP Group | + | Copyright (c) 1997-2013 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -716,7 +716,7 @@ const static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffs /* Still didn't find anything, let's find the zone solely based on * offset/isdst then */ for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) { - if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) { + if ((fmp->gmtoffset * 60) == gmtoffset && fmp->type == isdst) { return fmp; } } @@ -750,7 +750,7 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found return value; } -static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) +long timelib_parse_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) { timelib_tzinfo *res; long retval = 0; @@ -1000,7 +1000,7 @@ yy4: DEBUG_OUTPUT("tzcorrection | tz"); TIMELIB_INIT; TIMELIB_HAVE_TZ(); - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -4446,7 +4446,7 @@ yy223: } if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -9760,7 +9760,7 @@ yy491: } if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -12021,7 +12021,7 @@ yy701: s->time->h = timelib_get_nr((char **) &ptr, 2); s->time->i = timelib_get_nr((char **) &ptr, 2); s->time->s = timelib_get_nr((char **) &ptr, 2); - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -13396,7 +13396,7 @@ yy843: if (*ptr == '.') { s->time->f = timelib_get_frac_nr((char **) &ptr, 9); if (*ptr) { /* timezone is optional */ - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -15737,7 +15737,7 @@ yy1076: s->time->s = timelib_get_nr((char **) &ptr, 2); if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -24949,7 +24949,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim case 'O': /* timezone */ { int tz_not_found; - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_pbf_error(s, "The timezone could not be found in the database", string, begin); } diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 6d91d9ada..e01e292e1 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -715,7 +715,7 @@ const static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffs /* Still didn't find anything, let's find the zone solely based on * offset/isdst then */ for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) { - if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) { + if ((fmp->gmtoffset * 60) == gmtoffset && fmp->type == isdst) { return fmp; } } @@ -749,7 +749,7 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found return value; } -static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) +long timelib_parse_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) { timelib_tzinfo *res; long retval = 0; @@ -1161,7 +1161,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of } if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -1202,7 +1202,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of s->time->h = timelib_get_nr((char **) &ptr, 2); s->time->i = timelib_get_nr((char **) &ptr, 2); s->time->s = 0; - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, s->tzdb, tz_get_wrapper); break; case 1: s->time->y = timelib_get_nr((char **) &ptr, 4); @@ -1227,7 +1227,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of s->time->s = timelib_get_nr((char **) &ptr, 2); if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -1429,7 +1429,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of if (*ptr == '.') { s->time->f = timelib_get_frac_nr((char **) &ptr, 9); if (*ptr) { /* timezone is optional */ - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -1532,7 +1532,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of s->time->h = timelib_get_nr((char **) &ptr, 2); s->time->i = timelib_get_nr((char **) &ptr, 2); s->time->s = timelib_get_nr((char **) &ptr, 2); - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -1645,7 +1645,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of DEBUG_OUTPUT("tzcorrection | tz"); TIMELIB_INIT; TIMELIB_HAVE_TZ(); - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -1698,7 +1698,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of } if (*ptr != '\0') { - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_error(s, "The timezone could not be found in the database"); } @@ -2054,7 +2054,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim case 'O': /* timezone */ { int tz_not_found; - s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); + s->time->z = timelib_parse_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); if (tz_not_found) { add_pbf_error(s, "The timezone could not be found in the database", string, begin); } diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h index f5e759783..08484fbec 100644 --- a/ext/date/lib/timelib.h +++ b/ext/date/lib/timelib.h @@ -92,6 +92,8 @@ int timelib_apply_localtime(timelib_time *t, unsigned int localtime); void timelib_unixtime2gmt(timelib_time* tm, timelib_sll ts); void timelib_unixtime2local(timelib_time *tm, timelib_sll ts); void timelib_update_from_sse(timelib_time *tm); +void timelib_set_timezone_from_offset(timelib_time *t, timelib_sll utc_offset); +void timelib_set_timezone_from_abbr(timelib_time *t, timelib_abbr_info abbr_info); void timelib_set_timezone(timelib_time *t, timelib_tzinfo *tz); /* From parse_tz.c */ @@ -103,6 +105,7 @@ timelib_sll timelib_get_current_offset(timelib_time *t); void timelib_dump_tzinfo(timelib_tzinfo *tz); const timelib_tzdb *timelib_builtin_db(void); const timelib_tzdb_index_entry *timelib_timezone_builtin_identifiers_list(int *count); +long timelib_parse_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper); /* From timelib.c */ timelib_tzinfo* timelib_tzinfo_ctor(char *name); diff --git a/ext/date/lib/timelib_structs.h b/ext/date/lib/timelib_structs.h index de75545c4..503332135 100644 --- a/ext/date/lib/timelib_structs.h +++ b/ext/date/lib/timelib_structs.h @@ -142,6 +142,12 @@ typedef struct timelib_time { * 2 TimeZone abbreviation */ } timelib_time; +typedef struct timelib_abbr_info { + timelib_sll utc_offset; + char *abbr; + int dst; +} timelib_abbr_info; + typedef struct timelib_error_message { int position; char character; diff --git a/ext/date/lib/unixtime2tm.c b/ext/date/lib/unixtime2tm.c index eefbaa8f3..9870313fb 100644 --- a/ext/date/lib/unixtime2tm.c +++ b/ext/date/lib/unixtime2tm.c @@ -214,6 +214,34 @@ void timelib_unixtime2local(timelib_time *tm, timelib_sll ts) tm->have_zone = 1; } +void timelib_set_timezone_from_offset(timelib_time *t, timelib_sll utc_offset) +{ + if (t->tz_abbr) { + free(t->tz_abbr); + } + t->tz_abbr = NULL; + + t->z = utc_offset; + t->have_zone = 1; + t->zone_type = TIMELIB_ZONETYPE_OFFSET; + t->dst = 0; + t->tz_info = NULL; +} + +void timelib_set_timezone_from_abbr(timelib_time *t, timelib_abbr_info abbr_info) +{ + if (t->tz_abbr) { + free(t->tz_abbr); + } + t->tz_abbr = strdup(abbr_info.abbr); + + t->z = abbr_info.utc_offset; + t->have_zone = 1; + t->zone_type = TIMELIB_ZONETYPE_ABBR; + t->dst = abbr_info.dst; + t->tz_info = NULL; +} + void timelib_set_timezone(timelib_time *t, timelib_tzinfo *tz) { timelib_time_offset *gmt_offset; diff --git a/ext/date/php_date.c b/ext/date/php_date.c index c069e0cca..f6b12bc42 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2297,7 +2297,7 @@ static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC) case TIMELIB_ZONETYPE_ABBR: new_obj->tzi.z.utc_offset = old_obj->tzi.z.utc_offset; new_obj->tzi.z.dst = old_obj->tzi.z.dst; - new_obj->tzi.z.abbr = old_obj->tzi.z.abbr; + new_obj->tzi.z.abbr = strdup(old_obj->tzi.z.abbr); break; } @@ -3238,6 +3238,26 @@ PHP_METHOD(DateTimeImmutable, sub) } /* }}} */ +static void set_timezone_from_timelib_time(php_timezone_obj *tzobj, timelib_time *t) +{ + tzobj->initialized = 1; + tzobj->type = t->zone_type; + switch (t->zone_type) { + case TIMELIB_ZONETYPE_ID: + tzobj->tzi.tz = t->tz_info; + break; + case TIMELIB_ZONETYPE_OFFSET: + tzobj->tzi.utc_offset = t->z; + break; + case TIMELIB_ZONETYPE_ABBR: + tzobj->tzi.z.utc_offset = t->z; + tzobj->tzi.z.dst = t->dst; + tzobj->tzi.z.abbr = strdup(t->tz_abbr); + break; + } +} + + /* {{{ proto DateTimeZone date_timezone_get(DateTimeInterface object) Return new DateTimeZone object relative to give DateTime */ @@ -3255,21 +3275,7 @@ PHP_FUNCTION(date_timezone_get) if (dateobj->time->is_localtime/* && dateobj->time->tz_info*/) { php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC); tzobj = (php_timezone_obj *) zend_object_store_get_object(return_value TSRMLS_CC); - tzobj->initialized = 1; - tzobj->type = dateobj->time->zone_type; - switch (dateobj->time->zone_type) { - case TIMELIB_ZONETYPE_ID: - tzobj->tzi.tz = dateobj->time->tz_info; - break; - case TIMELIB_ZONETYPE_OFFSET: - tzobj->tzi.utc_offset = dateobj->time->z; - break; - case TIMELIB_ZONETYPE_ABBR: - tzobj->tzi.z.utc_offset = dateobj->time->z; - tzobj->tzi.z.dst = dateobj->time->dst; - tzobj->tzi.z.abbr = strdup(dateobj->time->tz_abbr); - break; - } + set_timezone_from_timelib_time(tzobj, dateobj->time); } else { RETURN_FALSE; } @@ -3284,11 +3290,18 @@ static void php_date_timezone_set(zval *object, zval *timezone_object, zval *ret dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC); - if (tzobj->type != TIMELIB_ZONETYPE_ID) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only do this for zones with ID for now"); - return; + + switch (tzobj->type) { + case TIMELIB_ZONETYPE_OFFSET: + timelib_set_timezone_from_offset(dateobj->time, tzobj->tzi.utc_offset); + break; + case TIMELIB_ZONETYPE_ABBR: + timelib_set_timezone_from_abbr(dateobj->time, tzobj->tzi.z); + break; + case TIMELIB_ZONETYPE_ID: + timelib_set_timezone(dateobj->time, tzobj->tzi.tz); + break; } - timelib_set_timezone(dateobj->time, tzobj->tzi.tz); timelib_unixtime2local(dateobj->time, dateobj->time->sse); } @@ -3613,23 +3626,21 @@ PHP_FUNCTION(date_diff) } /* }}} */ -static int timezone_initialize(timelib_tzinfo **tzi, /*const*/ char *tz TSRMLS_DC) +static int timezone_initialize(php_timezone_obj *tzobj, /*const*/ char *tz TSRMLS_DC) { - char *tzid; - - *tzi = NULL; - - if ((tzid = timelib_timezone_id_from_abbr(tz, -1, 0))) { - *tzi = php_date_parse_tzfile(tzid, DATE_TIMEZONEDB TSRMLS_CC); + timelib_time *dummy_t = ecalloc(1, sizeof(timelib_time)); + int dst, not_found; + char *orig_tz = tz; + + dummy_t->z = timelib_parse_zone(&tz, &dst, dummy_t, ¬_found, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); + if (not_found) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad timezone (%s)", orig_tz); + efree(dummy_t); + return FAILURE; } else { - *tzi = php_date_parse_tzfile(tz, DATE_TIMEZONEDB TSRMLS_CC); - } - - if (*tzi) { + set_timezone_from_timelib_time(tzobj, dummy_t); + efree(dummy_t); return SUCCESS; - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad timezone (%s)", tz); - return FAILURE; } } @@ -3640,19 +3651,15 @@ PHP_FUNCTION(timezone_open) { char *tz; int tz_len; - timelib_tzinfo *tzi = NULL; php_timezone_obj *tzobj; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len) == FAILURE) { RETURN_FALSE; } - if (SUCCESS != timezone_initialize(&tzi, tz TSRMLS_CC)) { + tzobj = zend_object_store_get_object(php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC) TSRMLS_CC); + if (SUCCESS != timezone_initialize(tzobj, tz TSRMLS_CC)) { RETURN_FALSE; } - tzobj = zend_object_store_get_object(php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC) TSRMLS_CC); - tzobj->type = TIMELIB_ZONETYPE_ID; - tzobj->tzi.tz = tzi; - tzobj->initialized = 1; } /* }}} */ @@ -3663,18 +3670,13 @@ PHP_METHOD(DateTimeZone, __construct) { char *tz; int tz_len; - timelib_tzinfo *tzi = NULL; php_timezone_obj *tzobj; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len)) { - if (SUCCESS == timezone_initialize(&tzi, tz TSRMLS_CC)) { - tzobj = zend_object_store_get_object(getThis() TSRMLS_CC); - tzobj->type = TIMELIB_ZONETYPE_ID; - tzobj->tzi.tz = tzi; - tzobj->initialized = 1; - } else { + tzobj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (FAILURE == timezone_initialize(tzobj, tz TSRMLS_CC)) { ZVAL_NULL(getThis()); } } @@ -3686,39 +3688,12 @@ static int php_date_timezone_initialize_from_hash(zval **return_value, php_timez { zval **z_timezone = NULL; zval **z_timezone_type = NULL; - timelib_tzinfo *tzi; if (zend_hash_find(myht, "timezone_type", 14, (void**) &z_timezone_type) == SUCCESS) { if (zend_hash_find(myht, "timezone", 9, (void**) &z_timezone) == SUCCESS) { convert_to_long(*z_timezone_type); - switch (Z_LVAL_PP(z_timezone_type)) { - case TIMELIB_ZONETYPE_OFFSET: { - char *offset, *offset_start; - - offset = emalloc(sizeof(char) * (Z_STRLEN_PP(z_timezone) + 1)); - memmove(offset, Z_STRVAL_PP(z_timezone), Z_STRLEN_PP(z_timezone)+1); - offset_start = offset; - - ++offset; - if(*offset_start == '+'){ - (*tzobj)->tzi.utc_offset = -1 * timelib_parse_tz_cor(&offset); - } else { - (*tzobj)->tzi.utc_offset = timelib_parse_tz_cor(&offset); - } - efree(offset_start); - (*tzobj)->type = TIMELIB_ZONETYPE_OFFSET; - (*tzobj)->initialized = 1; - return SUCCESS; - break; - } - case TIMELIB_ZONETYPE_ABBR: - case TIMELIB_ZONETYPE_ID: - if (SUCCESS == timezone_initialize(&tzi, Z_STRVAL_PP(z_timezone) TSRMLS_CC)) { - (*tzobj)->type = TIMELIB_ZONETYPE_ID; - (*tzobj)->tzi.tz = tzi; - (*tzobj)->initialized = 1; - return SUCCESS; - } + if (SUCCESS == timezone_initialize(*tzobj, Z_STRVAL_PP(z_timezone) TSRMLS_CC)) { + return SUCCESS; } } } diff --git a/ext/date/php_date.h b/ext/date/php_date.h index d4204ebd7..d7343e02b 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -137,14 +137,9 @@ struct _php_timezone_obj { int initialized; int type; union { - timelib_tzinfo *tz; /* TIMELIB_ZONETYPE_ID; */ - timelib_sll utc_offset; /* TIMELIB_ZONETYPE_OFFSET */ - struct /* TIMELIB_ZONETYPE_ABBR */ - { - timelib_sll utc_offset; - char *abbr; - int dst; - } z; + timelib_tzinfo *tz; /* TIMELIB_ZONETYPE_ID */ + timelib_sll utc_offset; /* TIMELIB_ZONETYPE_OFFSET */ + timelib_abbr_info z; /* TIMELIB_ZONETYPE_ABBR */ } tzi; HashTable *props; }; diff --git a/ext/date/tests/DateTimeZone_clone_basic1.phpt b/ext/date/tests/DateTimeZone_clone_basic1.phpt index a89005aae..49c190cf9 100644 --- a/ext/date/tests/DateTimeZone_clone_basic1.phpt +++ b/ext/date/tests/DateTimeZone_clone_basic1.phpt @@ -31,15 +31,15 @@ if ($clone != $orig) { *** Testing clone on DateTime objects *** object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(3) "UTC" + string(3) "GMT" } object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(3) "UTC" + string(3) "GMT" } TEST PASSED : Objects equal but not indetical ===DONE=== diff --git a/ext/date/tests/DateTimeZone_construct_basic.phpt b/ext/date/tests/DateTimeZone_construct_basic.phpt index 2f18f81c0..12b109066 100644 --- a/ext/date/tests/DateTimeZone_construct_basic.phpt +++ b/ext/date/tests/DateTimeZone_construct_basic.phpt @@ -23,9 +23,9 @@ var_dump( new DateTimeZone("America/Los_Angeles") ); *** Testing new DateTimeZone() : basic functionality *** object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(3) "UTC" + string(3) "GMT" } object(DateTimeZone)#%d (2) { ["timezone_type"]=> diff --git a/ext/date/tests/DateTimeZone_construct_variation1.phpt b/ext/date/tests/DateTimeZone_construct_variation1.phpt index 65e575ee4..025c6e267 100644 --- a/ext/date/tests/DateTimeZone_construct_variation1.phpt +++ b/ext/date/tests/DateTimeZone_construct_variation1.phpt @@ -48,11 +48,9 @@ $inputs = array( 'int 0' => 0, 'int 1' => 1, 'int 12345' => 12345, - 'int -12345' => -12345, // float data 'float 10.5' => 10.5, - 'float -10.5' => -10.5, 'float .5' => .5, // array data @@ -123,15 +121,9 @@ FAILED: DateTimeZone::__construct(): Unknown or bad timezone (1) -- int 12345 -- FAILED: DateTimeZone::__construct(): Unknown or bad timezone (12345) --- int -12345 -- -FAILED: DateTimeZone::__construct(): Unknown or bad timezone (-12345) - -- float 10.5 -- FAILED: DateTimeZone::__construct(): Unknown or bad timezone (10.5) --- float -10.5 -- -FAILED: DateTimeZone::__construct(): Unknown or bad timezone (-10.5) - -- float .5 -- FAILED: DateTimeZone::__construct(): Unknown or bad timezone (0.5) diff --git a/ext/date/tests/DateTimeZone_serialize_type_2.phpt b/ext/date/tests/DateTimeZone_serialize_type_2.phpt index a264322f3..4147efe92 100644 --- a/ext/date/tests/DateTimeZone_serialize_type_2.phpt +++ b/ext/date/tests/DateTimeZone_serialize_type_2.phpt @@ -20,16 +20,16 @@ var_dump( $tz2->getName() ); --EXPECTF-- object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(16) "America/New_York" + string(3) "EST" } -string(88) "O:12:"DateTimeZone":2:{s:13:"timezone_type";i:3;s:8:"timezone";s:16:"America/New_York";}" +string(74) "O:12:"DateTimeZone":2:{s:13:"timezone_type";i:2;s:8:"timezone";s:3:"EST";}" object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(16) "America/New_York" + string(3) "EST" } -string(16) "America/New_York" +string(3) "EST" ===DONE=== diff --git a/ext/date/tests/DateTimeZone_serialize_type_3.phpt b/ext/date/tests/DateTimeZone_serialize_type_3.phpt index 49b9349bb..396bff919 100644 --- a/ext/date/tests/DateTimeZone_serialize_type_3.phpt +++ b/ext/date/tests/DateTimeZone_serialize_type_3.phpt @@ -18,14 +18,14 @@ var_dump( $tz2->getName() ); ?> ===DONE=== --EXPECTF-- -object(DateTimeZone)#%d (2) { +object(DateTimeZone)#1 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } string(88) "O:12:"DateTimeZone":2:{s:13:"timezone_type";i:3;s:8:"timezone";s:16:"America/New_York";}" -object(DateTimeZone)#%d (2) { +object(DateTimeZone)#2 (2) { ["timezone_type"]=> int(3) ["timezone"]=> diff --git a/ext/date/tests/bug44780.phpt b/ext/date/tests/bug44780.phpt new file mode 100644 index 000000000..5c822d48e --- /dev/null +++ b/ext/date/tests/bug44780.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #44780 (some time zone offsets not recognized by timezone_name_from_abbr) +--FILE-- +<?php +var_dump( timezone_name_from_abbr("", 5.5*3600, false) ); +var_dump( timezone_name_from_abbr("", 28800, false) ); +?> +--EXPECT-- +string(12) "Asia/Kolkata" +string(13) "Asia/Shanghai" diff --git a/ext/date/tests/bug45543.phpt b/ext/date/tests/bug45543.phpt new file mode 100644 index 000000000..8e36e6287 --- /dev/null +++ b/ext/date/tests/bug45543.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test for bug #45543: DateTime::setTimezone can not set timezones without ID. +--INI-- +date.timezone=UTC +--FILE-- +<?php +$test_dates = array( + '2008-01-01 12:00:00 PDT', + '2008-01-01 12:00:00 +02:00', +); + +foreach ($test_dates as $test_date) +{ + $d1 = new DateTime($test_date); + $d2 = new DateTime('2008-01-01 12:00:00 UTC'); + echo $d1->format(DATE_ISO8601), PHP_EOL; + echo $d2->format(DATE_ISO8601), PHP_EOL; + $tz = $d1->getTimeZone(); + $d2->setTimeZone($tz); + echo $d1->format(DATE_ISO8601), PHP_EOL; + echo $d2->format(DATE_ISO8601), PHP_EOL; + echo PHP_EOL; +} +--EXPECT-- +2008-01-01T12:00:00-0700 +2008-01-01T12:00:00+0000 +2008-01-01T12:00:00-0700 +2008-01-01T05:00:00-0700 + +2008-01-01T12:00:00+0200 +2008-01-01T12:00:00+0000 +2008-01-01T12:00:00+0200 +2008-01-01T14:00:00+0200 + diff --git a/ext/date/tests/timezone_open_basic1.phpt b/ext/date/tests/timezone_open_basic1.phpt index 7fcfcb34c..abd016b35 100644 --- a/ext/date/tests/timezone_open_basic1.phpt +++ b/ext/date/tests/timezone_open_basic1.phpt @@ -20,9 +20,9 @@ var_dump( timezone_open("America/Los_Angeles") ); *** Testing timezone_open() : basic functionality *** object(DateTimeZone)#%d (2) { ["timezone_type"]=> - int(3) + int(2) ["timezone"]=> - string(3) "UTC" + string(3) "GMT" } object(DateTimeZone)#%d (2) { ["timezone_type"]=> @@ -36,4 +36,4 @@ object(DateTimeZone)#%d (2) { ["timezone"]=> string(19) "America/Los_Angeles" } -===DONE===
\ No newline at end of file +===DONE=== diff --git a/ext/date/tests/timezone_open_variation1.phpt b/ext/date/tests/timezone_open_variation1.phpt index 9a069f647..eb4d4b782 100644 --- a/ext/date/tests/timezone_open_variation1.phpt +++ b/ext/date/tests/timezone_open_variation1.phpt @@ -48,11 +48,9 @@ $inputs = array( 'int 0' => 0, 'int 1' => 1, 'int 12345' => 12345, - 'int -12345' => -12345, // float data 'float 10.5' => 10.5, - 'float -10.5' => -10.5, 'float .5' => .5, // array data @@ -124,21 +122,11 @@ bool(false) Warning: timezone_open(): Unknown or bad timezone (12345) in %s on line %d bool(false) --- int -12345 -- - -Warning: timezone_open(): Unknown or bad timezone (-12345) in %s on line %d -bool(false) - -- float 10.5 -- Warning: timezone_open(): Unknown or bad timezone (10.5) in %s on line %d bool(false) --- float -10.5 -- - -Warning: timezone_open(): Unknown or bad timezone (-10.5) in %s on line %d -bool(false) - -- float .5 -- Warning: timezone_open(): Unknown or bad timezone (0.5) in %s on line %d diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 954d4799a..8c4eec551 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -532,6 +532,9 @@ static int gmp_do_operation(zend_uchar opcode, zval *result, zval *op1, zval *op DO_BINARY_UI_OP(mpz_sub); case ZEND_MUL: DO_BINARY_UI_OP(mpz_mul); + case ZEND_POW: + shift_operator_helper(mpz_pow_ui, result, op1, op2 TSRMLS_CC); + return SUCCESS; case ZEND_DIV: DO_BINARY_UI_OP_EX(mpz_tdiv_q, mpz_tdiv_q_ui, 1); case ZEND_MOD: diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt index 18e0bb2aa..0d8f5cfed 100644 --- a/ext/gmp/tests/overloading.phpt +++ b/ext/gmp/tests/overloading.phpt @@ -83,6 +83,10 @@ var_dump(--$a); var_dump($a--); var_dump($a); +$x = gmp_init(3); +$y = gmp_init(2); +var_dump($x ** $y); + ?> --EXPECTF-- object(GMP)#%d (1) { @@ -256,4 +260,7 @@ object(GMP)#%d (1) { ["num"]=> string(2) "42" } - +object(GMP)#%d (1) { + ["num"]=> + string(1) "9" +} diff --git a/ext/intl/tests/calendar_getDayOfWeekType_basic.phpt b/ext/intl/tests/calendar_getDayOfWeekType_basic.phpt index d5319f147..324e229de 100644 --- a/ext/intl/tests/calendar_getDayOfWeekType_basic.phpt +++ b/ext/intl/tests/calendar_getDayOfWeekType_basic.phpt @@ -6,8 +6,8 @@ date.timezone=Atlantic/Azores <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); -if (version_compare(INTL_ICU_VERSION, '4.4') < 0) - die('skip for ICU 4.4+'); +if (version_compare(INTL_ICU_VERSION, '4.4') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) + die('skip for ICU >= 4.4 and ICU < 52.1'); --FILE-- <?php ini_set("intl.error_level", E_WARNING); @@ -31,4 +31,4 @@ int(0) int(0) int(0) int(1) -==DONE==
\ No newline at end of file +==DONE==
diff --git a/ext/intl/tests/calendar_getDayOfWeekType_basic2.phpt b/ext/intl/tests/calendar_getDayOfWeekType_basic2.phpt new file mode 100644 index 000000000..9bf996708 --- /dev/null +++ b/ext/intl/tests/calendar_getDayOfWeekType_basic2.phpt @@ -0,0 +1,34 @@ +--TEST-- +IntlCalendar::getDayOfWeekType() basic test +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- +<?php +if (!extension_loaded('intl')) + die('skip intl extension not enabled'); +if (version_compare(INTL_ICU_VERSION, '52.1') < 0) + die('skip for ICU >= 52.1'); +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "nl"); + +$intlcal = IntlCalendar::createInstance('UTC'); +$intlcal->setTime(strtotime('2012-02-29 00:00:00 +0000') * 1000); +var_dump( + intlcal_get_day_of_week_type($intlcal, IntlCalendar::DOW_SUNDAY), + $intlcal->getDayOfWeekType(IntlCalendar::DOW_MONDAY), + $intlcal->getDayOfWeekType(IntlCalendar::DOW_TUESDAY), + $intlcal->getDayOfWeekType(IntlCalendar::DOW_FRIDAY), + $intlcal->getDayOfWeekType(IntlCalendar::DOW_SATURDAY) +); + +?> +==DONE== +--EXPECT-- +int(1) +int(0) +int(0) +int(0) +int(1) +==DONE== diff --git a/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt index 70b862017..77ec53047 100644 --- a/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt +++ b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter: several forms of the calendar arg --SKIPIF-- <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_create_cal_arg_variant3.phpt b/ext/intl/tests/dateformat_create_cal_arg_variant3.phpt new file mode 100644 index 000000000..8a8c45d41 --- /dev/null +++ b/ext/intl/tests/dateformat_create_cal_arg_variant3.phpt @@ -0,0 +1,53 @@ +--TEST-- +IntlDateFormatter: several forms of the calendar arg +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "pt_PT"); +ini_set("date.timezone", 'Atlantic/Azores'); + +$ts = strtotime('2012-01-01 00:00:00 UTC'); + +$cal = new IntlGregorianCalendar('UTC', NULL); +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, $cal); +echo $df->format($ts), "\n"; + +$cal = IntlCalendar::createInstance('UTC', 'en@calendar=islamic'); +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, $cal); +echo $df->format($ts), "\n"; + +//override calendar's timezone +$cal = new IntlGregorianCalendar('UTC', NULL); +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Madrid', $cal); +echo $df->format($ts), "\n"; + +//default calendar is gregorian +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0); +echo $df->format($ts), "\n"; + +//try now with traditional +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, NULL, IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +//the timezone can be overridden when not specifying a calendar +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, 'UTC', IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'UTC', 0); +echo $df->format($ts), "\n"; + +?> +==DONE== +--EXPECTF-- +domingo%S 1 de enero de 2012, 0:00:00 (GMT) +domingo%S 8 de Safar de 1433, 0:00:00 (GMT) +domingo%S 1 de enero de 2012, 1:00:00 (Hora estándar de Europa central) +sábado%S 31 de diciembre de 2011 d. C., 23:00:00 (Hora estándar %Sde las Azores) +sábado%S 7 de Safar de 1433 AH, 23:00:00 (Hora estándar %Sde las Azores) +domingo%S 8 de Safar de 1433 AH, 0:00:00 (GMT) +domingo%S 1 de enero de 2012, 0:00:00 (GMT) +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt index 1ec1fa669..d59c635a7 100644 --- a/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt +++ b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter::formatObject(): IntlCalendar tests --SKIPIF--
<?php
if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE--
<?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_formatObject_calendar_variant3.phpt b/ext/intl/tests/dateformat_formatObject_calendar_variant3.phpt new file mode 100644 index 000000000..0c5486263 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_calendar_variant3.phpt @@ -0,0 +1,40 @@ +--TEST-- +IntlDateFormatter::formatObject(): IntlCalendar tests +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "pt_PT"); +ini_set("date.timezone", "Europe/Lisbon"); + +$cal = IntlCalendar::fromDateTime('2012-01-01 00:00:00'); //Europe/Lisbon +echo IntlDateFormatter::formatObject($cal), "\n"; +echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n"; +echo IntlDateFormatter::formatObject($cal, null, "en-US"), "\n"; +echo IntlDateFormatter::formatObject($cal, array(IntlDateFormatter::SHORT, IntlDateFormatter::FULL), "en-US"), "\n"; +echo IntlDateFormatter::formatObject($cal, 'E y-MM-d HH,mm,ss.SSS v', "en-US"), "\n"; + +$cal = IntlCalendar::fromDateTime('2012-01-01 05:00:00+03:00'); +echo datefmt_format_object($cal, IntlDateFormatter::FULL), "\n"; + +$cal = IntlCalendar::createInstance(null,'en-US@calendar=islamic-civil'); +$cal->setTime(strtotime('2012-01-01 00:00:00')*1000.); +echo IntlDateFormatter::formatObject($cal), "\n"; +echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL, "en-US"), "\n"; + +?> +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +domingo, 1 de Janeiro de 2012 às 00:00:00 Hora Padrão %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +domingo, 1 de Janeiro de 2012 às 05:00:00 GMT+03:00 +06/02/1433, 00:00:00 +Sunday, Safar 6, 1433 at 12:00:00 AM Western European Standard Time +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt index 2ca9ffd7e..b4e59f5b7 100644 --- a/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt +++ b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter::formatObject(): DateTime tests --SKIPIF--
<?php
if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE--
<?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_formatObject_datetime_variant3.phpt b/ext/intl/tests/dateformat_formatObject_datetime_variant3.phpt new file mode 100644 index 000000000..fec88e9d1 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_datetime_variant3.phpt @@ -0,0 +1,33 @@ +--TEST-- +IntlDateFormatter::formatObject(): DateTime tests +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "pt_PT"); +ini_set("date.timezone", "Europe/Lisbon"); + +$dt = new DateTime('2012-01-01 00:00:00'); //Europe/Lisbon +echo IntlDateFormatter::formatObject($dt), "\n"; +echo IntlDateFormatter::formatObject($dt, IntlDateFormatter::FULL), "\n"; +echo IntlDateFormatter::formatObject($dt, null, "en-US"), "\n"; +echo IntlDateFormatter::formatObject($dt, array(IntlDateFormatter::SHORT, IntlDateFormatter::FULL), "en-US"), "\n"; +echo IntlDateFormatter::formatObject($dt, 'E y-MM-d HH,mm,ss.SSS v', "en-US"), "\n"; + +$dt = new DateTime('2012-01-01 05:00:00+03:00'); +echo IntlDateFormatter::formatObject($dt, IntlDateFormatter::FULL), "\n"; + +?> +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +domingo, 1 de Janeiro de 2012 à s 00:00:00 Hora Padrão %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +domingo, 1 de Janeiro de 2012 à s 05:00:00 GMT+03:00 +==DONE== diff --git a/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt index 1c5169e65..9e8d76c1b 100644 --- a/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt +++ b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter: setCalendar()/getCalendar()/getCalendarObject() --SKIPIF-- <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_get_set_calendar_variant3.phpt b/ext/intl/tests/dateformat_get_set_calendar_variant3.phpt new file mode 100644 index 000000000..5dee52db9 --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_calendar_variant3.phpt @@ -0,0 +1,55 @@ +--TEST-- +IntlDateFormatter: setCalendar()/getCalendar()/getCalendarObject() +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "pt_PT"); +ini_set("date.timezone", 'Atlantic/Azores'); + +$ts = strtotime('2012-01-01 00:00:00 UTC'); + +function d(IntlDateFormatter $df) { +global $ts; +echo $df->format($ts), "\n"; +var_dump($df->getCalendar(), +$df->getCalendarObject()->getType(), +$df->getCalendarObject()->getTimeZone()->getId()); +echo "\n"; +} + +$df = new IntlDateFormatter('fr@calendar=islamic', 0, 0, 'Europe/Minsk'); +d($df); + + +//changing the calendar with a cal type should not change tz +$df->setCalendar(IntlDateFormatter::TRADITIONAL); +d($df); + +//but changing with an actual calendar should +$cal = IntlCalendar::createInstance("UTC"); +$df->setCalendar($cal); +d($df); + +?> +==DONE== +--EXPECT-- +dimanche 1 janvier 2012 ap. J.-C. à 03:00:00 UTC+03:00 +int(1) +string(9) "gregorian" +string(12) "Europe/Minsk" + +dimanche 8 safar 1433 AH à 03:00:00 UTC+03:00 +int(0) +string(7) "islamic" +string(12) "Europe/Minsk" + +dimanche 1 janvier 2012 ap. J.-C. à 00:00:00 UTC +bool(false) +string(9) "gregorian" +string(3) "UTC" + +==DONE== diff --git a/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt index af9ddf29a..f19f0ffd5 100644 --- a/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt +++ b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter: get/setTimeZone() --SKIPIF-- <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_get_set_timezone_variant3.phpt b/ext/intl/tests/dateformat_get_set_timezone_variant3.phpt new file mode 100644 index 000000000..fe0663e06 --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_timezone_variant3.phpt @@ -0,0 +1,62 @@ +--TEST-- +IntlDateFormatter: get/setTimeZone() +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("intl.default_locale", "pt_PT"); +ini_set("date.timezone", 'Atlantic/Azores'); + +$ts = strtotime('2012-01-01 00:00:00 UTC'); + +function d(IntlDateFormatter $df) { +global $ts; +echo $df->format($ts), "\n"; +var_dump( +$df->getTimeZoneID(), +$df->getTimeZone()->getID()); +echo "\n"; +} + +$df = new IntlDateFormatter('pt_PT', 0, 0, 'Europe/Minsk'); +d($df); + +$df->setTimeZone(NULL); +d($df); + +$df->setTimeZone('Europe/Madrid'); +d($df); + +$df->setTimeZone(IntlTimeZone::createTimeZone('Europe/Paris')); +d($df); + +$df->setTimeZone(new DateTimeZone('Europe/Amsterdam')); +d($df); + +?> +==DONE== +--EXPECTF-- +domingo, 1 de Janeiro de 2012 à s 03:00:00 GMT+03:00 +string(12) "Europe/Minsk" +string(12) "Europe/Minsk" + +sábado, 31 de Dezembro de 2011 à s 23:00:00 Hor%s Padrão %Sdos Açores +string(15) "Atlantic/Azores" +string(15) "Atlantic/Azores" + +domingo, 1 de Janeiro de 2012 à s 01:00:00 Hor%s Padrão %Sda Europa Central +string(13) "Europe/Madrid" +string(13) "Europe/Madrid" + +domingo, 1 de Janeiro de 2012 à s 01:00:00 Hor%s Padrão %Sda Europa Central +string(12) "Europe/Paris" +string(12) "Europe/Paris" + +domingo, 1 de Janeiro de 2012 à s 01:00:00 Hor%s Padrão %Sda Europa Central +string(16) "Europe/Amsterdam" +string(16) "Europe/Amsterdam" + +==DONE== diff --git a/ext/intl/tests/dateformat_timezone_arg_variations2.phpt b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt index a957963a4..53ee82054 100644 --- a/ext/intl/tests/dateformat_timezone_arg_variations2.phpt +++ b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt @@ -3,7 +3,7 @@ IntlDateFormatter: several forms of the timezone arg --SKIPIF-- <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/dateformat_timezone_arg_variations3.phpt b/ext/intl/tests/dateformat_timezone_arg_variations3.phpt new file mode 100644 index 000000000..0ef743ea4 --- /dev/null +++ b/ext/intl/tests/dateformat_timezone_arg_variations3.phpt @@ -0,0 +1,45 @@ +--TEST-- +IntlDateFormatter: several forms of the timezone arg +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +ini_set("date.timezone", 'Atlantic/Azores'); + +$ts = strtotime('2012-01-01 00:00:00 UTC'); + +//should use Atlantic/Azores +$df = new IntlDateFormatter('es_ES', 0, 0, NULL); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam'); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, new DateTimeZone('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, IntlTimeZone::createTimeZone('America/New_York')); +echo $df->format($ts), "\n"; + +//time zone has priority +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +//calendar has priority +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', 0); +echo $df->format($ts), "\n"; + +--EXPECTF-- +sábado%S 31 de diciembre de 2011, 23:00:00 (Hora estándar de las Azores) +domingo%S 1 de enero de 2012, 1:00:00 (Hora estándar de Europa central) +domingo%S 1 de enero de 2012, 0:00:00 (Hora%S estándar de Europa occidental) +sábado%S 31 de diciembre de 2011, 19:00:00 (Hora estándar oriental) +domingo%S 1 de enero de 2012, 1:00:00 (Hora estándar de Europa central) +domingo%S 1 de enero de 2012, 0:00:00 (Hora%S estándar de Europa occidental) +domingo%S 1 de enero de 2012, 1:00:00 (Hora estándar de Europa central) diff --git a/ext/intl/tests/formatter_format2.phpt b/ext/intl/tests/formatter_format2.phpt index 0732e419d..32c42f69d 100644 --- a/ext/intl/tests/formatter_format2.phpt +++ b/ext/intl/tests/formatter_format2.phpt @@ -2,7 +2,7 @@ numfmt_format() icu >= 4.8 --SKIPIF-- <?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> -<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?> +<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) print 'skip'; ?> --FILE-- <?php diff --git a/ext/intl/tests/formatter_format3.phpt b/ext/intl/tests/formatter_format3.phpt new file mode 100644 index 000000000..d52d15999 --- /dev/null +++ b/ext/intl/tests/formatter_format3.phpt @@ -0,0 +1,130 @@ +--TEST-- +numfmt_format() icu >= 52.1 +--SKIPIF-- +<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> +<?php if(version_compare(INTL_ICU_VERSION, '52.1') < 0) print 'skip'; ?> +--FILE-- +<?php + +/* + * Format a number using misc locales/patterns. + */ + +/* + * TODO: doesn't pass on ICU 3.6 because 'ru' and 'de' locales changed + * currency and percent formatting. + */ + +function ut_main() +{ + $styles = array( + NumberFormatter::PATTERN_DECIMAL => '##.#####################', + NumberFormatter::DECIMAL => '', + NumberFormatter::CURRENCY => '', + NumberFormatter::PERCENT => '', + NumberFormatter::SCIENTIFIC => '', + NumberFormatter::SPELLOUT => '@@@@@@@', + NumberFormatter::ORDINAL => '', + NumberFormatter::DURATION => '', + NumberFormatter::PATTERN_RULEBASED => '#####.###', + 1234999, // bad one + ); + + $integer = array( + NumberFormatter::ORDINAL => '', + NumberFormatter::DURATION => '', + ); + $locales = array( + 'en_US', + 'ru_UA', + 'de', + 'fr', + 'en_UK' + ); + + $str_res = ''; + $number = 1234567.891234567890000; + + foreach( $locales as $locale ) + { + $str_res .= "\nLocale is: $locale\n"; + foreach( $styles as $style => $pattern ) + { + $fmt = ut_nfmt_create( $locale, $style, $pattern ); + + if(!$fmt) { + $str_res .= "Bad formatter!\n"; + continue; + } + $str_res .= dump( isset($integer[$style])?ut_nfmt_format( $fmt, $number, NumberFormatter::TYPE_INT32):ut_nfmt_format( $fmt, $number ) ) . "\n"; + } + } + return $str_res; +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); + +?> +--EXPECTREGEX-- +Locale is: en_US +'1234567.89123457' +'1,234,567.891' +'\$1,234,567.89' +'123,456,789%' +'1.23456789123457E6' +'one million,? two hundred (and )?thirty-four thousand,? five hundred (and )?sixty-seven point eight nine one two three four five seven' +'1,234,567(th|áµ—Ê°)' +'342:56:07' +'#####.###' +Bad formatter! + +Locale is: ru_UA +'1234567,89123457' +'1 234 567,891' +'1 234 567,89 ?(грн\.|â‚´)' +'123 456 789 ?%' +'1,23456789123457E6' +'один миллион двеÑти тридцать четыре Ñ‚Ñ‹ÑÑч пÑÑ‚ÑŒÑот шеÑтьдеÑÑÑ‚ Ñемь запÑÑ‚Ð°Ñ Ð²Ð¾Ñемь девÑÑ‚ÑŒ один два три четыре пÑÑ‚ÑŒ Ñемь' +'1 234 567.?' +'1 234 567' +'#####.###' +Bad formatter! + +Locale is: de +'1234567,89123457' +'1.234.567,891' +'(¤ )?1.234.567,89( ¤)?' +'123\.456\.789 %' +'1,23456789123457E6' +'eine Million zweiÂhundertÂvierÂundÂdreißigÂtausendÂfünfÂhundertÂsiebenÂundÂsechzig Komma acht neun eins zwei drei vier fünf sieben' +'1.234.567.?' +'1.234.567' +'#####.###' +Bad formatter! + +Locale is: fr +'1234567,89123457' +'1 234 567,891' +'1 234 567,89 ¤' +'123 456 789 ?%' +'1,23456789123457E6' +'un million deux cent trente-quatre mille cinq cent soixante-sept virgule huit neuf un deux trois quatre cinq sept' +'1 234 567e' +'1 234 567' +'#####.###' +Bad formatter! + +Locale is: en_UK +'1234567.89123457' +'1,234,567.891' +'¤1,234,567.89' +'123,456,789%' +'1.23456789123457E6' +'one million,? two hundred (and )?thirty-four thousand,? five hundred (and )?sixty-seven point eight nine one two three four five seven' +'1,234,567(th|áµ—Ê°)' +'342:56:07' +'#####.###' +Bad formatter! diff --git a/ext/intl/tests/locale_get_display_name3.phpt b/ext/intl/tests/locale_get_display_name3.phpt index 3f3d26fcf..0340f14b2 100644 --- a/ext/intl/tests/locale_get_display_name3.phpt +++ b/ext/intl/tests/locale_get_display_name3.phpt @@ -2,7 +2,7 @@ locale_get_display_name() icu >= 51.2 --SKIPIF-- <?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php diff --git a/ext/intl/tests/locale_get_display_name4.phpt b/ext/intl/tests/locale_get_display_name4.phpt new file mode 100644 index 000000000..470674997 --- /dev/null +++ b/ext/intl/tests/locale_get_display_name4.phpt @@ -0,0 +1,342 @@ +--TEST-- +locale_get_display_name() icu >= 52.1 +--SKIPIF-- +<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php + +/* + * Try getting the display_name for different locales + * with Procedural and Object methods. + */ + +function ut_main() +{ + $res_str=''; + + $disp_locales=array('en','fr','de'); + + $locales = array( + 'sl_IT_nedis_KIRTI', + 'sl_IT_nedis-a-kirti-x-xyz', + 'sl_IT_rozaj', + 'sl_IT_NEDIS_ROJAZ_1901', + 'i-enochian', + 'zh-hakka', + 'zh-wuu', + 'i-tay', + 'sgn-BE-nl', + 'sgn-CH-de', + 'sl_IT_rozaj@currency=EUR', + 'uk-ua_CALIFORNIA@currency=;currency=GRN', + 'root', + 'uk@currency=EURO', + 'Hindi', +//Simple language subtag + 'de', + 'fr', + 'ja', + 'i-enochian', //(example of a grandfathered tag) +//Language subtag plus Script subtag: + 'zh-Hant', + 'zh-Hans', + 'sr-Cyrl', + 'sr-Latn', +//Language-Script-Region + 'zh-Hans-CN', + 'sr-Latn-CS', +//Language-Variant + 'sl-rozaj', + 'sl-nedis', +//Language-Region-Variant + 'de-CH-1901', + 'sl-IT-nedis', +//Language-Script-Region-Variant + 'sl-Latn-IT-nedis', +//Language-Region: + 'de-DE', + 'en-US', + 'es-419', +//Private use subtags: + 'de-CH-x-phonebk', + 'az-Arab-x-AZE-derbend', +//Extended language subtags + 'zh-min', + 'zh-min-nan-Hant-CN', +//Private use registry values + 'x-whatever', + 'qaa-Qaaa-QM-x-southern', + 'sr-Latn-QM', + 'sr-Qaaa-CS', +/*Tags that use extensions (examples ONLY: extensions MUST be defined + by revision or update to this document or by RFC): */ + 'en-US-u-islamCal', + 'zh-CN-a-myExt-x-private', + 'en-a-myExt-b-another', +//Some Invalid Tags: + 'de-419-DE', + 'a-DE', + 'ar-a-aaa-b-bbb-a-ccc' + ); + + + $res_str = ''; + + foreach( $locales as $locale ) + { + $res_str .= "locale='$locale'\n"; + foreach( $disp_locales as $disp_locale ) + { + $scr = ut_loc_get_display_name( $locale ,$disp_locale ); + $scr = str_replace(array('(', ')'), '#', $scr); + $res_str .= "disp_locale=$disp_locale : display_name=$scr"; + $res_str .= "\n"; + } + $res_str .= "-----------------\n"; + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); +ut_run(); + +?> +--EXPECTREGEX-- +locale='sl_IT_nedis_KIRTI' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_KIRTI# +disp_locale=fr : display_name=slovène #Italie, NEDIS_KIRTI# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_KIRTI# +----------------- +locale='sl_IT_nedis-a-kirti-x-xyz' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_A_KIRTI_X_XYZ# +disp_locale=fr : display_name=slovène #Italie, NEDIS_A_KIRTI_X_XYZ# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_A_KIRTI_X_XYZ# +----------------- +locale='sl_IT_rozaj' +disp_locale=en : display_name=Slovenian #Italy, Resian# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch)# +----------------- +locale='sl_IT_NEDIS_ROJAZ_1901' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_ROJAZ_1901# +disp_locale=fr : display_name=slovène #Italie, NEDIS_ROJAZ_1901# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_ROJAZ_1901# +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-hakka' +disp_locale=en : display_name=Chinese( #HAKKA#)? +disp_locale=fr : display_name=chinois( #HAKKA#)? +disp_locale=de : display_name=Chinesisch( #HAKKA#)? +----------------- +locale='zh-wuu' +disp_locale=en : display_name=Chinese #WUU# +disp_locale=fr : display_name=chinois #WUU# +disp_locale=de : display_name=Chinesisch #WUU# +----------------- +locale='i-tay' +disp_locale=en : display_name=i-tay +disp_locale=fr : display_name=i-tay +disp_locale=de : display_name=i-tay +----------------- +locale='sgn-BE-nl' +disp_locale=en : display_name=Sign Languages? #Belgium, NL# +disp_locale=fr : display_name=langues? des signes #Belgique, NL# +disp_locale=de : display_name=Gebärdensprache #Belgien, NL# +----------------- +locale='sgn-CH-de' +disp_locale=en : display_name=Sign Languages? #Switzerland, DE# +disp_locale=fr : display_name=langues? des signes #Suisse, DE# +disp_locale=de : display_name=Gebärdensprache #Schweiz, DE# +----------------- +locale='sl_IT_rozaj@currency=EUR' +disp_locale=en : display_name=Slovenian #Italy, Resian, [Cc]urrency=Euro# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia, [Dd]evise=euro# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch), Währung=Euro# +----------------- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_name= +disp_locale=fr : display_name= +disp_locale=de : display_name= +----------------- +locale='root' +disp_locale=en : display_name=Root +disp_locale=fr : display_name=racine +disp_locale=de : display_name=[Rr]oot +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_name=Ukrainian #[Cc]urrency=EURO# +disp_locale=fr : display_name=ukrainien #[Dd]evise=EURO# +disp_locale=de : display_name=Ukrainisch #Währung=EURO# +----------------- +locale='Hindi' +disp_locale=en : display_name=hindi +disp_locale=fr : display_name=hindi +disp_locale=de : display_name=hindi +----------------- +locale='de' +disp_locale=en : display_name=German +disp_locale=fr : display_name=allemand +disp_locale=de : display_name=Deutsch +----------------- +locale='fr' +disp_locale=en : display_name=French +disp_locale=fr : display_name=français +disp_locale=de : display_name=Französisch +----------------- +locale='ja' +disp_locale=en : display_name=Japanese +disp_locale=fr : display_name=japonais +disp_locale=de : display_name=Japanisch +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-Hant' +disp_locale=en : display_name=Chinese #Traditional# +disp_locale=fr : display_name=chinois #traditionnel# +disp_locale=de : display_name=Chinesisch #Traditionell# +----------------- +locale='zh-Hans' +disp_locale=en : display_name=Chinese #Simplified# +disp_locale=fr : display_name=chinois #simplifié# +disp_locale=de : display_name=Chinesisch #Vereinfacht# +----------------- +locale='sr-Cyrl' +disp_locale=en : display_name=Serbian #Cyrillic# +disp_locale=fr : display_name=serbe #cyrillique# +disp_locale=de : display_name=Serbisch #Kyrillisch# +----------------- +locale='sr-Latn' +disp_locale=en : display_name=Serbian #Latin# +disp_locale=fr : display_name=serbe #latin# +disp_locale=de : display_name=Serbisch #Lateinisch# +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_name=Chinese #Simplified, China# +disp_locale=fr : display_name=chinois #simplifié, Chine# +disp_locale=de : display_name=Chinesisch #Vereinfacht, China# +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_name=Serbian #Latin, Serbia# +disp_locale=fr : display_name=serbe #latin, Serbie# +disp_locale=de : display_name=Serbisch #Lateinisch, Serbien# +----------------- +locale='sl-rozaj' +disp_locale=en : display_name=Slovenian #Resian# +disp_locale=fr : display_name=slovène #dialecte de Resia# +disp_locale=de : display_name=Slowenisch( #(ROZAJ|Resianisch)#)? +----------------- +locale='sl-nedis' +disp_locale=en : display_name=Slovenian #Natisone dialect# +disp_locale=fr : display_name=slovène #dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Natisone-Dialekt# +----------------- +locale='de-CH-1901' +disp_locale=en : display_name=German #Switzerland, Traditional German orthography# +disp_locale=fr : display_name=allemand #Suisse, orthographe allemande traditionnelle# +disp_locale=de : display_name=Deutsch #Schweiz, (1901|[aA]lte deutsche Rechtschreibung)# +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_name=Slovenian #Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_name=Slovenian #Latin, Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #latin, Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Lateinisch, Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='de-DE' +disp_locale=en : display_name=German #Germany# +disp_locale=fr : display_name=allemand #Allemagne# +disp_locale=de : display_name=Deutsch #Deutschland# +----------------- +locale='en-US' +disp_locale=en : display_name=English #United States# +disp_locale=fr : display_name=anglais #États-Unis# +disp_locale=de : display_name=Englisch #Vereinigte Staaten# +----------------- +locale='es-419' +disp_locale=en : display_name=Spanish #Latin America# +disp_locale=fr : display_name=espagnol #Amérique latine# +disp_locale=de : display_name=Spanisch #Lateinamerika# +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_name=German #Switzerland, Private-Use=phonebk# +disp_locale=fr : display_name=allemand #Suisse, Usage privé=phonebk# +disp_locale=de : display_name=Deutsch #Schweiz, Privatnutzung=phonebk# +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_name=Azerbaijani #Arabic, Private-Use=aze-derbend# +disp_locale=fr : display_name=azéri #arabe, Usage privé=aze-derbend# +disp_locale=de : display_name=Aserbaidschanisch #Arabisch, Privatnutzung=aze-derbend# +----------------- +locale='zh-min' +disp_locale=en : display_name=Chinese #MIN# +disp_locale=fr : display_name=chinois #MIN# +disp_locale=de : display_name=Chinesisch #MIN# +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_name=Chinese #MIN, NAN_HANT_CN# +disp_locale=fr : display_name=chinois #MIN, NAN_HANT_CN# +disp_locale=de : display_name=Chinesisch #MIN, NAN_HANT_CN# +----------------- +locale='x-whatever' +disp_locale=en : display_name=x-whatever #Private-Use=whatever# +disp_locale=fr : display_name=x-whatever #Usage privé=whatever# +disp_locale=de : display_name=x-whatever #Privatnutzung=whatever# +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_name=qaa #Qaaa, QM, Private-Use=southern# +disp_locale=fr : display_name=qaa #Qaaa, QM, Usage privé=southern# +disp_locale=de : display_name=qaa #Qaaa, QM, Privatnutzung=southern# +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_name=Serbian #Latin, QM# +disp_locale=fr : display_name=serbe #latin, QM# +disp_locale=de : display_name=Serbisch #Lateinisch, QM# +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_name=Serbian #Qaaa, Serbia# +disp_locale=fr : display_name=serbe #Qaaa, Serbie# +disp_locale=de : display_name=Serbisch #Qaaa, Serbien# +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_name=English #United States, attribute=islamcal# +disp_locale=fr : display_name=anglais #États-Unis, attribute=islamcal# +disp_locale=de : display_name=Englisch #Vereinigte Staaten, attribute=islamcal# +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_name=Chinese #China, a=myext, Private-Use=private# +disp_locale=fr : display_name=chinois #Chine, a=myext, Usage privé=private# +disp_locale=de : display_name=Chinesisch #China, a=myext, Privatnutzung=private# +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_name=English #a=myext, b=another# +disp_locale=fr : display_name=anglais #a=myext, b=another# +disp_locale=de : display_name=Englisch #a=myext, b=another# +----------------- +locale='de-419-DE' +disp_locale=en : display_name=German #Latin America, DE# +disp_locale=fr : display_name=allemand #Amérique latine, DE# +disp_locale=de : display_name=Deutsch #Lateinamerika, DE# +----------------- +locale='a-DE' +disp_locale=en : display_name=a #Germany# +disp_locale=fr : display_name=a #Allemagne# +disp_locale=de : display_name=a #Deutschland# +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_name=Arabic #a=aaa, b=bbb# +disp_locale=fr : display_name=arabe #a=aaa, b=bbb# +disp_locale=de : display_name=Arabisch #a=aaa, b=bbb# +----------------- diff --git a/ext/intl/tests/locale_get_display_script3.phpt b/ext/intl/tests/locale_get_display_script3.phpt index 447766e6b..972f060cd 100644 --- a/ext/intl/tests/locale_get_display_script3.phpt +++ b/ext/intl/tests/locale_get_display_script3.phpt @@ -2,7 +2,7 @@ locale_get_display_script() icu >= 49 --SKIPIF-- <?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> -<?php if(version_compare(INTL_ICU_VERSION, '49') < 0) print 'skip'; ?> +<?php if(version_compare(INTL_ICU_VERSION, '49') < 0 || version_compare(INTL_ICU_VERSION, '52.1') >= 0) print 'skip'; ?> --FILE-- <?php diff --git a/ext/intl/tests/locale_get_display_script4.phpt b/ext/intl/tests/locale_get_display_script4.phpt new file mode 100644 index 000000000..dd50dcfc0 --- /dev/null +++ b/ext/intl/tests/locale_get_display_script4.phpt @@ -0,0 +1,275 @@ +--TEST-- +locale_get_display_script() icu >= 52.1 +--SKIPIF-- +<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> +<?php if(version_compare(INTL_ICU_VERSION, '52.1') < 0) print 'skip'; ?> +--FILE-- +<?php + +/* + * Try getting the display_script for different locales + * with Procedural and Object methods. + */ + +function ut_main() +{ + $res_str = ''; + + $disp_locales=array('en','fr','de'); + + $locales = array( + 'uk-ua_CALIFORNIA@currency=;currency=GRN', + 'root', + 'uk@currency=EURO', + 'Hindi', +//Simple language subtag + 'de', + 'fr', + 'ja', + 'i-enochian', //(example of a grandfathered tag) +//Language subtag plus Script subtag: + 'zh-Hant', + 'zh-Hans', + 'sr-Cyrl', + 'sr-Latn', +//Language-Script-Region + 'zh-Hans-CN', + 'sr-Latn-CS', +//Language-Variant + 'sl-rozaj', + 'sl-nedis', +//Language-Region-Variant + 'de-CH-1901', + 'sl-IT-nedis', +//Language-Script-Region-Variant + 'sl-Latn-IT-nedis', +//Language-Region: + 'de-DE', + 'en-US', + 'es-419', +//Private use subtags: + 'de-CH-x-phonebk', + 'az-Arab-x-AZE-derbend', +//Extended language subtags + 'zh-min', + 'zh-min-nan-Hant-CN', +//Private use registry values + 'x-whatever', + 'qaa-Qaaa-QM-x-southern', + 'sr-Latn-QM', + 'sr-Qaaa-CS', +/*Tags that use extensions (examples ONLY: extensions MUST be defined + by revision or update to this document or by RFC): */ + 'en-US-u-islamCal', + 'zh-CN-a-myExt-x-private', + 'en-a-myExt-b-another', +//Some Invalid Tags: + 'de-419-DE', + 'a-DE', + 'ar-a-aaa-b-bbb-a-ccc' + ); + + + $res_str = ''; + + foreach( $locales as $locale ) + { + $res_str .= "locale='$locale'\n"; + foreach( $disp_locales as $disp_locale ) + { + $scr = ut_loc_get_display_script( $locale ,$disp_locale ); + $res_str .= "disp_locale=$disp_locale : display_script=$scr"; + $res_str .= "\n"; + } + $res_str .= "-----------------\n"; + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); +ut_run(); + +?> +--EXPECT-- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='root' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='Hindi' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='de' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='fr' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='ja' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='i-enochian' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='zh-Hant' +disp_locale=en : display_script=Traditional Han +disp_locale=fr : display_script=sinogrammes traditionnels +disp_locale=de : display_script=Traditionelles Chinesisch +----------------- +locale='zh-Hans' +disp_locale=en : display_script=Simplified Han +disp_locale=fr : display_script=sinogrammes simplifiés +disp_locale=de : display_script=Vereinfachtes Chinesisch +----------------- +locale='sr-Cyrl' +disp_locale=en : display_script=Cyrillic +disp_locale=fr : display_script=cyrillique +disp_locale=de : display_script=Kyrillisch +----------------- +locale='sr-Latn' +disp_locale=en : display_script=Latin +disp_locale=fr : display_script=latin +disp_locale=de : display_script=Lateinisch +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_script=Simplified Han +disp_locale=fr : display_script=sinogrammes simplifiés +disp_locale=de : display_script=Vereinfachtes Chinesisch +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_script=Latin +disp_locale=fr : display_script=latin +disp_locale=de : display_script=Lateinisch +----------------- +locale='sl-rozaj' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='sl-nedis' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='de-CH-1901' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_script=Latin +disp_locale=fr : display_script=latin +disp_locale=de : display_script=Lateinisch +----------------- +locale='de-DE' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='en-US' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='es-419' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_script=Arabic +disp_locale=fr : display_script=arabe +disp_locale=de : display_script=Arabisch +----------------- +locale='zh-min' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='x-whatever' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_script=Qaaa +disp_locale=fr : display_script=Qaaa +disp_locale=de : display_script=Qaaa +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_script=Latin +disp_locale=fr : display_script=latin +disp_locale=de : display_script=Lateinisch +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_script=Qaaa +disp_locale=fr : display_script=Qaaa +disp_locale=de : display_script=Qaaa +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='de-419-DE' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='a-DE' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_script= +disp_locale=fr : display_script= +disp_locale=de : display_script= +----------------- diff --git a/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt index f2d16b899..55dd0e405 100644 --- a/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt +++ b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt @@ -3,7 +3,7 @@ MessageFormat accepts IntlCalendar args --SKIPIF-- <?php if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> -<?php if (version_compare(INTL_ICU_VERSION, '51.2') < 0) die('skip for ICU >= 51.2'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '51.2') || version_compare(INTL_ICU_VERSION, '52.1') >= 0) die('skip for ICU >= 51.2 and < 52.1'); ?> --FILE-- <?php ini_set("intl.error_level", E_WARNING); diff --git a/ext/intl/tests/msgfmt_format_intlcalendar_variant3.phpt b/ext/intl/tests/msgfmt_format_intlcalendar_variant3.phpt new file mode 100644 index 000000000..c390366b5 --- /dev/null +++ b/ext/intl/tests/msgfmt_format_intlcalendar_variant3.phpt @@ -0,0 +1,30 @@ +--TEST-- +MessageFormat accepts IntlCalendar args +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?> +<?php if (version_compare(INTL_ICU_VERSION, '52.1') < 0) die('skip for ICU >= 52.1'); ?> +--FILE-- +<?php +ini_set("intl.error_level", E_WARNING); +//ini_set("intl.default_locale", "nl"); +ini_set('date.timezone', 'Europe/Lisbon'); + +$cal = new IntlGregorianCalendar(2012,04,17,17,35,36); + +$msgf = new MessageFormatter('pt_PT', '{0,date,full} {0,time,h:m:s a V}'); +echo $msgf->format(array($cal)), "\n"; + +//NOT FIXED: +/*$msgf = new MessageFormatter('en_US', +'{1, select, date {{0,date,full}} other {{0,time,h:m:s a V}}}'); + +echo "msgf2: ", $msgf->format(array($time, 'date')), " ", + $msgf->format(array($time, 'time')), "\n"; +*/ + +?> +==DONE== +--EXPECT-- +quinta-feira, 17 de Maio de 2012 5:35:36 da tarde ptlis +==DONE== diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index e9b9d2e97..f5583cd8c 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -155,6 +155,15 @@ PHP_MINIT_FUNCTION(ldap) REGISTER_LONG_CONSTANT("LDAP_DEREF_FINDING", LDAP_DEREF_FINDING, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("LDAP_DEREF_ALWAYS", LDAP_DEREF_ALWAYS, CONST_PERSISTENT | CONST_CS); + /* Constants to be used with ldap_modify_batch() */ + REGISTER_LONG_CONSTANT("LDAP_MODIFY_BATCH_ADD", LDAP_MODIFY_BATCH_ADD, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("LDAP_MODIFY_BATCH_REMOVE", LDAP_MODIFY_BATCH_REMOVE, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("LDAP_MODIFY_BATCH_REMOVE_ALL", LDAP_MODIFY_BATCH_REMOVE_ALL, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("LDAP_MODIFY_BATCH_REPLACE", LDAP_MODIFY_BATCH_REPLACE, CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("LDAP_MODIFY_BATCH_ATTRIB", LDAP_MODIFY_BATCH_ATTRIB, CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("LDAP_MODIFY_BATCH_MODTYPE", LDAP_MODIFY_BATCH_MODTYPE, CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("LDAP_MODIFY_BATCH_VALUES", LDAP_MODIFY_BATCH_VALUES, CONST_PERSISTENT | CONST_CS); + #if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP /* LDAP options */ REGISTER_LONG_CONSTANT("LDAP_OPT_DEREF", LDAP_OPT_DEREF, CONST_PERSISTENT | CONST_CS); @@ -1438,6 +1447,355 @@ PHP_FUNCTION(ldap_delete) } /* }}} */ +/* {{{ _ldap_str_equal_to_const + */ +static int _ldap_str_equal_to_const(const char *str, uint str_len, const char *cstr) +{ + int i; + + if (strlen(cstr) != str_len) + return 0; + + for (i = 0; i < str_len; ++i) { + if (str[i] != cstr[i]) { + return 0; + } + } + + return 1; +} +/* }}} */ + +/* {{{ _ldap_strlen_max + */ +static int _ldap_strlen_max(const char *str, uint max_len) +{ + int i; + + for (i = 0; i < max_len; ++i) { + if (str[i] == '\0') { + return i; + } + } + + return max_len; +} +/* }}} */ + +/* {{{ _ldap_hash_fetch + */ +static void _ldap_hash_fetch(zval *hashTbl, const char *key, zval **out) +{ + zval **fetched; + if (zend_hash_find(Z_ARRVAL_P(hashTbl), key, strlen(key)+1, (void **) &fetched) == SUCCESS) { + *out = *fetched; + } + else { + *out = NULL; + } +} +/* }}} */ + +/* {{{ proto bool ldap_modify_batch(resource link, string dn, array modifs) + Perform multiple modifications as part of one operation */ +PHP_FUNCTION(ldap_modify_batch) +{ + ldap_linkdata *ld; + zval *link, *mods, *mod, *modinfo, *modval; + zval *attrib, *modtype, *vals; + zval **fetched; + char *dn; + int dn_len; + int i, j, k; + int num_mods, num_modprops, num_modvals; + LDAPMod **ldap_mods; + uint oper; + + /* + $mods = array( + array( + "attrib" => "unicodePwd", + "modtype" => LDAP_MODIFY_BATCH_REMOVE, + "values" => array($oldpw) + ), + array( + "attrib" => "unicodePwd", + "modtype" => LDAP_MODIFY_BATCH_ADD, + "values" => array($newpw) + ), + array( + "attrib" => "userPrincipalName", + "modtype" => LDAP_MODIFY_BATCH_REPLACE, + "values" => array("janitor@corp.contoso.com") + ), + array( + "attrib" => "userCert", + "modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL + ) + ); + */ + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa", &link, &dn, &dn_len, &mods) != SUCCESS) { + return; + } + + ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link); + + /* perform validation */ + { + char *modkey; + uint modkeylen; + long modtype; + + /* to store the wrongly-typed keys */ + ulong tmpUlong; + + /* make sure the DN contains no NUL bytes */ + if (_ldap_strlen_max(dn, dn_len) != dn_len) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "DN must not contain NUL bytes"); + RETURN_FALSE; + } + + /* make sure the top level is a normal array */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(mods)); + if (zend_hash_get_current_key_type(Z_ARRVAL_P(mods)) != HASH_KEY_IS_LONG) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Modifications array must not be string-indexed"); + RETURN_FALSE; + } + + num_mods = zend_hash_num_elements(Z_ARRVAL_P(mods)); + + for (i = 0; i < num_mods; i++) { + /* is the numbering consecutive? */ + if (zend_hash_index_find(Z_ARRVAL_P(mods), i, (void **) &fetched) != SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Modifications array must have consecutive indices 0, 1, ..."); + RETURN_FALSE; + } + mod = *fetched; + + /* is it an array? */ + if (Z_TYPE_P(mod) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Each entry of modifications array must be an array itself"); + RETURN_FALSE; + } + + /* for the modification hashtable... */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(mod)); + num_modprops = zend_hash_num_elements(Z_ARRVAL_P(mod)); + + for (j = 0; j < num_modprops; j++) { + /* are the keys strings? */ + if (zend_hash_get_current_key_ex(Z_ARRVAL_P(mod), &modkey, &modkeylen, &tmpUlong, 0, NULL) != HASH_KEY_IS_STRING) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Each entry of modifications array must be string-indexed"); + RETURN_FALSE; + } + + /* modkeylen includes the terminating NUL byte; remove that */ + --modkeylen; + + /* is this a valid entry? */ + if ( + !_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_ATTRIB) && + !_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_MODTYPE) && + !_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_VALUES) + ) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The only allowed keys in entries of the modifications array are '" LDAP_MODIFY_BATCH_ATTRIB "', '" LDAP_MODIFY_BATCH_MODTYPE "' and '" LDAP_MODIFY_BATCH_VALUES "'"); + RETURN_FALSE; + } + + zend_hash_get_current_data(Z_ARRVAL_P(mod), (void **) &fetched); + modinfo = *fetched; + + /* does the value type match the key? */ + if (_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_ATTRIB)) { + if (Z_TYPE_P(modinfo) != IS_STRING) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_ATTRIB "' value must be a string"); + RETURN_FALSE; + } + + if (Z_STRLEN_P(modinfo) != _ldap_strlen_max(Z_STRVAL_P(modinfo), Z_STRLEN_P(modinfo))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_ATTRIB "' value must not contain NUL bytes"); + RETURN_FALSE; + } + } + else if (_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_MODTYPE)) { + if (Z_TYPE_P(modinfo) != IS_LONG) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_MODTYPE "' value must be a long"); + RETURN_FALSE; + } + + /* is the value in range? */ + modtype = Z_LVAL_P(modinfo); + if ( + modtype != LDAP_MODIFY_BATCH_ADD && + modtype != LDAP_MODIFY_BATCH_REMOVE && + modtype != LDAP_MODIFY_BATCH_REPLACE && + modtype != LDAP_MODIFY_BATCH_REMOVE_ALL + ) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The '" LDAP_MODIFY_BATCH_MODTYPE "' value must match one of the LDAP_MODIFY_BATCH_* constants"); + RETURN_FALSE; + } + + /* if it's REMOVE_ALL, there must not be a values array; otherwise, there must */ + if (modtype == LDAP_MODIFY_BATCH_REMOVE_ALL) { + if (zend_hash_exists(Z_ARRVAL_P(mod), LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES) + 1)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "If '" LDAP_MODIFY_BATCH_MODTYPE "' is LDAP_MODIFY_BATCH_REMOVE_ALL, a '" LDAP_MODIFY_BATCH_VALUES "' array must not be provided"); + RETURN_FALSE; + } + } + else { + if (!zend_hash_exists(Z_ARRVAL_P(mod), LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES) + 1)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "If '" LDAP_MODIFY_BATCH_MODTYPE "' is not LDAP_MODIFY_BATCH_REMOVE_ALL, a '" LDAP_MODIFY_BATCH_VALUES "' array must be provided"); + RETURN_FALSE; + } + } + } + else if (_ldap_str_equal_to_const(modkey, modkeylen, LDAP_MODIFY_BATCH_VALUES)) { + if (Z_TYPE_P(modinfo) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_VALUES "' value must be an array"); + RETURN_FALSE; + } + + /* is the array not empty? */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(modinfo)); + num_modvals = zend_hash_num_elements(Z_ARRVAL_P(modinfo)); + if (num_modvals == 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_VALUES "' array must have at least one element"); + RETURN_FALSE; + } + + /* are its keys integers? */ + if (zend_hash_get_current_key_type(Z_ARRVAL_P(modinfo)) != HASH_KEY_IS_LONG) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_VALUES "' array must not be string-indexed"); + RETURN_FALSE; + } + + /* are the keys consecutive? */ + for (k = 0; k < num_modvals; k++) { + if (zend_hash_index_find(Z_ARRVAL_P(modinfo), k, (void **) &fetched) != SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "A '" LDAP_MODIFY_BATCH_VALUES "' array must have consecutive indices 0, 1, ..."); + RETURN_FALSE; + } + modval = *fetched; + + /* is the data element a string? */ + if (Z_TYPE_P(modval) != IS_STRING) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Each element of a '" LDAP_MODIFY_BATCH_VALUES "' array must be a string"); + RETURN_FALSE; + } + } + } + + zend_hash_move_forward(Z_ARRVAL_P(mod)); + } + } + } + /* validation was successful */ + + /* allocate array of modifications */ + ldap_mods = safe_emalloc((num_mods+1), sizeof(LDAPMod *), 0); + + /* for each modification */ + for (i = 0; i < num_mods; i++) { + /* allocate the modification struct */ + ldap_mods[i] = safe_emalloc(1, sizeof(LDAPMod), 0); + + /* fetch the relevant data */ + zend_hash_index_find(Z_ARRVAL_P(mods), i, (void **) &fetched); + mod = *fetched; + + _ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_ATTRIB, &attrib); + _ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_MODTYPE, &modtype); + _ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_VALUES, &vals); + + /* map the modification type */ + switch (Z_LVAL_P(modtype)) { + case LDAP_MODIFY_BATCH_ADD: + oper = LDAP_MOD_ADD; + break; + case LDAP_MODIFY_BATCH_REMOVE: + case LDAP_MODIFY_BATCH_REMOVE_ALL: + oper = LDAP_MOD_DELETE; + break; + case LDAP_MODIFY_BATCH_REPLACE: + oper = LDAP_MOD_REPLACE; + break; + default: + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Unknown and uncaught modification type."); + RETURN_FALSE; + } + + /* fill in the basic info */ + ldap_mods[i]->mod_op = oper | LDAP_MOD_BVALUES; + ldap_mods[i]->mod_type = estrndup(Z_STRVAL_P(attrib), Z_STRLEN_P(attrib)); + + if (Z_LVAL_P(modtype) == LDAP_MODIFY_BATCH_REMOVE_ALL) { + /* no values */ + ldap_mods[i]->mod_bvalues = NULL; + } + else { + /* allocate space for the values as part of this modification */ + num_modvals = zend_hash_num_elements(Z_ARRVAL_P(vals)); + ldap_mods[i]->mod_bvalues = safe_emalloc((num_modvals+1), sizeof(struct berval *), 0); + + /* for each value */ + for (j = 0; j < num_modvals; j++) { + /* fetch it */ + zend_hash_index_find(Z_ARRVAL_P(vals), j, (void **) &fetched); + modval = *fetched; + + /* allocate the data struct */ + ldap_mods[i]->mod_bvalues[j] = safe_emalloc(1, sizeof(struct berval), 0); + + /* fill it */ + ldap_mods[i]->mod_bvalues[j]->bv_len = Z_STRLEN_P(modval); + ldap_mods[i]->mod_bvalues[j]->bv_val = estrndup(Z_STRVAL_P(modval), Z_STRLEN_P(modval)); + } + + /* NULL-terminate values */ + ldap_mods[i]->mod_bvalues[num_modvals] = NULL; + } + } + + /* NULL-terminate modifications */ + ldap_mods[num_mods] = NULL; + + /* perform (finally) */ + if ((i = ldap_modify_ext_s(ld->link, dn, ldap_mods, NULL, NULL)) != LDAP_SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Batch Modify: %s", ldap_err2string(i)); + RETVAL_FALSE; + } else RETVAL_TRUE; + + /* clean up */ + { + for (i = 0; i < num_mods; i++) { + /* attribute */ + efree(ldap_mods[i]->mod_type); + + if (ldap_mods[i]->mod_bvalues != NULL) { + /* each BER value */ + for (j = 0; ldap_mods[i]->mod_bvalues[j] != NULL; j++) { + /* free the data bytes */ + efree(ldap_mods[i]->mod_bvalues[j]->bv_val); + + /* free the bvalue struct */ + efree(ldap_mods[i]->mod_bvalues[j]); + } + + /* the BER value array */ + efree(ldap_mods[i]->mod_bvalues); + } + + /* the modification */ + efree(ldap_mods[i]); + } + + /* the modifications array */ + efree(ldap_mods); + } +} +/* }}} */ + /* {{{ proto int ldap_errno(resource link) Get the current ldap error number */ PHP_FUNCTION(ldap_errno) @@ -2599,6 +2957,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_modify, 0, 0, 3) ZEND_ARG_INFO(0, entry) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_modify_batch, 0, 0, 3) + ZEND_ARG_INFO(0, link_identifier) + ZEND_ARG_INFO(0, dn) + ZEND_ARG_ARRAY_INFO(0, modifications_info, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_mod_add, 0, 0, 3) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, dn) @@ -2758,6 +3122,7 @@ const zend_function_entry ldap_functions[] = { PHP_FE(ldap_dn2ufn, arginfo_ldap_dn2ufn) PHP_FE(ldap_add, arginfo_ldap_add) PHP_FE(ldap_delete, arginfo_ldap_delete) + PHP_FE(ldap_modify_batch, arginfo_ldap_modify_batch) PHP_FALIAS(ldap_modify, ldap_mod_replace, arginfo_ldap_modify) /* additional functions for attribute based modifications, Gerrit Thomson */ diff --git a/ext/ldap/php_ldap.h b/ext/ldap/php_ldap.h index e10c8a7e6..bd3731819 100644 --- a/ext/ldap/php_ldap.h +++ b/ext/ldap/php_ldap.h @@ -50,4 +50,14 @@ ZEND_END_MODULE_GLOBALS(ldap) #define phpext_ldap_ptr ldap_module_ptr +/* Constants for ldap_modify_batch */ +#define LDAP_MODIFY_BATCH_ADD 0x01 +#define LDAP_MODIFY_BATCH_REMOVE 0x02 +#define LDAP_MODIFY_BATCH_REMOVE_ALL 0x12 +#define LDAP_MODIFY_BATCH_REPLACE 0x03 + +#define LDAP_MODIFY_BATCH_ATTRIB "attrib" +#define LDAP_MODIFY_BATCH_MODTYPE "modtype" +#define LDAP_MODIFY_BATCH_VALUES "values" + #endif /* PHP_LDAP_H */ diff --git a/ext/ldap/tests/ldap_modify_batch_basic.phpt b/ext/ldap/tests/ldap_modify_batch_basic.phpt new file mode 100644 index 000000000..4f6705c7e --- /dev/null +++ b/ext/ldap/tests/ldap_modify_batch_basic.phpt @@ -0,0 +1,109 @@ +--TEST-- +ldap_modify_batch() - Basic batch modify operation +--CREDITS-- +Patrick Allaert <patrickallaert@php.net> +OndÅ™ej HoÅ¡ek <ondra.hosek@gmail.com> +--SKIPIF-- +<?php require_once('skipif.inc'); ?> +<?php require_once('skipifbindfailure.inc'); ?> +--FILE-- +<?php +require "connect.inc"; + +$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); +insert_dummy_data($link); + +$mods = array( + array( + "attrib" => "telephoneNumber", + "modtype" => LDAP_MODIFY_BATCH_ADD, + "values" => array( + "+1 555 5551717" + ) + ), + array( + "attrib" => "sn", + "modtype" => LDAP_MODIFY_BATCH_REPLACE, + "values" => array("Brown-Smith") + ), + array( + "attrib" => "description", + "modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL + ) +); + +var_dump( + ldap_modify_batch($link, "cn=userA,dc=my-domain,dc=com", $mods), + ldap_get_entries($link, ldap_search($link, "dc=my-domain,dc=com", "(sn=Brown-Smith)")) +); +?> +===DONE=== +--CLEAN-- +<?php +require "connect.inc"; + +$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); + +remove_dummy_data($link); +?> +--EXPECT-- +bool(true) +array(2) { + ["count"]=> + int(1) + [0]=> + array(12) { + ["objectclass"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "person" + } + [0]=> + string(11) "objectclass" + ["cn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(5) "userA" + } + [1]=> + string(2) "cn" + ["userpassword"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(4) "oops" + } + [2]=> + string(12) "userpassword" + ["telephonenumber"]=> + array(3) { + ["count"]=> + int(2) + [0]=> + string(14) "xx-xx-xx-xx-xx" + [1]=> + string(14) "+1 555 5551717" + } + [3]=> + string(15) "telephonenumber" + ["sn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(11) "Brown-Smith" + } + [4]=> + string(2) "sn" + ["count"]=> + int(5) + ["dn"]=> + string(28) "cn=userA,dc=my-domain,dc=com" + } +} +===DONE=== diff --git a/ext/ldap/tests/ldap_modify_batch_error.phpt b/ext/ldap/tests/ldap_modify_batch_error.phpt new file mode 100644 index 000000000..687c371c4 --- /dev/null +++ b/ext/ldap/tests/ldap_modify_batch_error.phpt @@ -0,0 +1,104 @@ +--TEST-- +ldap_modify_batch() - Batch modify operations that should fail +--CREDITS-- +Patrick Allaert <patrickallaert@php.net> +OndÅ™ej HoÅ¡ek <ondra.hosek@gmail.com> +--SKIPIF-- +<?php require_once('skipif.inc'); ?> +<?php require_once('skipifbindfailure.inc'); ?> +--FILE-- +<?php +require "connect.inc"; + +$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); + +$addGivenName = array( + array( + "attrib" => "givenName", + "modtype" => LDAP_MODIFY_BATCH_ADD, + "values" => array("Jack") + ) +); + +// Too few parameters +var_dump(ldap_modify_batch()); +var_dump(ldap_modify_batch($link)); +var_dump(ldap_modify_batch($link, "dc=my-domain,dc=com")); + +// Too many parameters +var_dump(ldap_modify_batch($link, "dc=my-domain,dc=com", $addGivenName, "Invalid additional parameter")); + +// DN not found +var_dump(ldap_modify_batch($link, "dc=my-domain,dc=com", $addGivenName)); + +// Invalid DN +var_dump(ldap_modify_batch($link, "weirdAttribute=val", $addGivenName)); + +// prepare +$entry = array( + "objectClass" => array( + "top", + "dcObject", + "organization"), + "dc" => "my-domain", + "o" => "my-domain", +); + +ldap_add($link, "dc=my-domain,dc=com", $entry); + +// invalid domain +$mods = array( + array( + "attrib" => "dc", + "modtype" => LDAP_MODIFY_BATCH_REPLACE, + "values" => array("Wrong Domain") + ) +); + +var_dump(ldap_modify_batch($link, "dc=my-domain,dc=com", $mods)); + +// invalid attribute +$mods = array( + array( + "attrib" => "weirdAttribute", + "modtype" => LDAP_MODIFY_BATCH_ADD, + "values" => array("weirdVal", "anotherWeirdval") + ) +); + +var_dump(ldap_modify_batch($link, "dc=my-domain,dc=com", $mods)); +?> +===DONE=== +--CLEAN-- +<?php +require "connect.inc"; + +$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); + +ldap_delete($link, "dc=my-domain,dc=com"); +?> +--EXPECTF-- +Warning: ldap_modify_batch() expects exactly 3 parameters, 0 given in %s on line %d +NULL + +Warning: ldap_modify_batch() expects exactly 3 parameters, 1 given in %s on line %d +NULL + +Warning: ldap_modify_batch() expects exactly 3 parameters, 2 given in %s on line %d +NULL + +Warning: ldap_modify_batch() expects exactly 3 parameters, 4 given in %s on line %d +NULL + +Warning: ldap_modify_batch(): Batch Modify: No such object in %s on line %d +bool(false) + +Warning: ldap_modify_batch(): Batch Modify: Invalid DN syntax in %s on line %d +bool(false) + +Warning: ldap_modify_batch(): Batch Modify: Naming violation in %s on line %d +bool(false) + +Warning: ldap_modify_batch(): Batch Modify: Undefined attribute type in %s on line %d +bool(false) +===DONE=== diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c index 2e6e00b10..3114b2519 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -88,7 +88,7 @@ static PHP_MINIT_FUNCTION(libxml); static PHP_RINIT_FUNCTION(libxml); static PHP_MSHUTDOWN_FUNCTION(libxml); static PHP_MINFO_FUNCTION(libxml); -static int php_libxml_post_deactivate(); +static int php_libxml_post_deactivate(void); /* }}} */ @@ -876,7 +876,7 @@ static PHP_MSHUTDOWN_FUNCTION(libxml) return SUCCESS; } -static int php_libxml_post_deactivate() +static int php_libxml_post_deactivate(void) { TSRMLS_FETCH(); /* reset libxml generic error handling */ diff --git a/ext/mbstring/tests/zend_multibyte-02.phpt b/ext/mbstring/tests/zend_multibyte-02.phpt index 494b50412..ebc10b48b 100644 --- a/ext/mbstring/tests/zend_multibyte-02.phpt +++ b/ext/mbstring/tests/zend_multibyte-02.phpt @@ -1,6 +1,7 @@ --TEST-- zend multibyte (2) ---SKIPIF-- +--XFAIL-- +https://bugs.php.net/bug.php?id=66582 --INI-- zend.multibyte=On zend.script_encoding=UTF-8 @@ -9,5 +10,5 @@ mbstring.internal_encoding=CP932 <?php var_dump(bin2hex("テスト")); ?> ---EXPECT-- -string(12) "836583588367" +--EXPECTF-- +php: Zend/zend_language_scanner.l:%d: encoding_filter_script_to_internal: Assertion `internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding)' failed. diff --git a/ext/mbstring/tests/zend_multibyte-06.phpt b/ext/mbstring/tests/zend_multibyte-06.phpt index 95fdd78c3..e0b4ead54 100644 --- a/ext/mbstring/tests/zend_multibyte-06.phpt +++ b/ext/mbstring/tests/zend_multibyte-06.phpt @@ -1,6 +1,7 @@ --TEST-- zend multibyte (6) ---SKIPIF-- +--XFAIL-- +https://bugs.php.net/bug.php?id=66582 --INI-- zend.multibyte=On zend.script_encoding=EUC-JP @@ -10,5 +11,5 @@ mbstring.internal_encoding=CP932 declare(encoding="UTF-8"); var_dump(bin2hex("テスト")); ?> ---EXPECT-- -string(12) "836583588367" +--EXPECTF-- +php: Zend/zend_language_scanner.l:%d: encoding_filter_script_to_internal: Assertion `internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding)' failed. diff --git a/ext/mbstring/tests/zend_multibyte-07.phpt b/ext/mbstring/tests/zend_multibyte-07.phpt index 3c79f84f5..08db1d0f7 100644 --- a/ext/mbstring/tests/zend_multibyte-07.phpt +++ b/ext/mbstring/tests/zend_multibyte-07.phpt @@ -1,6 +1,8 @@ --TEST-- zend multibyte (7) --SKIPIF-- +--XFAIL-- +https://bugs.php.net/bug.php?id=66582 --INI-- zend.multibyte=On zend.script_encoding=ISO-8859-1 diff --git a/ext/mbstring/tests/zend_multibyte-09.phpt b/ext/mbstring/tests/zend_multibyte-09.phpt index c088e7cdd..8ad00b4e1 100644 --- a/ext/mbstring/tests/zend_multibyte-09.phpt +++ b/ext/mbstring/tests/zend_multibyte-09.phpt @@ -1,6 +1,8 @@ --TEST-- zend multibyte (9) --SKIPIF-- +--XFAIL-- +https://bugs.php.net/bug.php?id=66582 --INI-- zend.multibyte=On zend.script_encoding=cp1251 diff --git a/ext/mbstring/tests/zend_multibyte-10.phpt b/ext/mbstring/tests/zend_multibyte-10.phpt index a5ba74d50..139d973b9 100644 --- a/ext/mbstring/tests/zend_multibyte-10.phpt +++ b/ext/mbstring/tests/zend_multibyte-10.phpt @@ -1,6 +1,8 @@ --TEST-- zend multibyte (10) --SKIPIF-- +--INI-- +zend.multibyte=1 --FILE-- <?php declare(encoding="ISO-8859-15"); diff --git a/ext/mbstring/tests/zend_multibyte-11.phpt b/ext/mbstring/tests/zend_multibyte-11.phpt index 0b59e75fb..c6e45fa5c 100644 --- a/ext/mbstring/tests/zend_multibyte-11.phpt +++ b/ext/mbstring/tests/zend_multibyte-11.phpt @@ -1,6 +1,8 @@ --TEST-- zend multibyte (11) --SKIPIF-- +--INI-- +zend.multibyte=1 --FILE-- <?php declare(encoding="ISO-8859-15") { diff --git a/ext/mbstring/tests/zend_multibyte-12.phpt b/ext/mbstring/tests/zend_multibyte-12.phpt index d7207e49d..90968e882 100644 --- a/ext/mbstring/tests/zend_multibyte-12.phpt +++ b/ext/mbstring/tests/zend_multibyte-12.phpt @@ -1,6 +1,8 @@ --TEST-- zend multibyte (12) --SKIPIF-- +--INI-- +zend.multibyte=1 --FILE-- <?php declare(encoding="ISO-8859-15"); diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 929f776a4..2a5a8c61f 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -558,6 +558,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY_EX("mysqli.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_links, zend_mysqli_globals, mysqli_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX("mysqli.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_mysqli_globals, mysqli_globals, display_link_numbers) STD_PHP_INI_BOOLEAN("mysqli.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_persistent, zend_mysqli_globals, mysqli_globals) + STD_PHP_INI_BOOLEAN("mysqli.rollback_on_cached_plink", "0",PHP_INI_SYSTEM, OnUpdateBool, rollback_on_cached_plink, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.default_host", NULL, PHP_INI_ALL, OnUpdateString, default_host, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.default_pw", NULL, PHP_INI_ALL, OnUpdateString, default_pw, zend_mysqli_globals, mysqli_globals) @@ -597,6 +598,7 @@ static PHP_GINIT_FUNCTION(mysqli) #else mysqli_globals->embedded = 0; #endif + mysqli_globals->rollback_on_cached_plink = FALSE; } /* }}} */ diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 902840159..d6f274b56 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -599,10 +599,20 @@ void php_mysqli_close(MY_MYSQL * mysql, int close_type, int resource_status TSRM #if defined(MYSQLI_USE_MYSQLND) mysqlnd_end_psession(mysql->mysql); #endif - zend_ptr_stack_push(&plist->free_links, mysql->mysql); + if (MyG(rollback_on_cached_plink) && +#if !defined(MYSQLI_USE_MYSQLND) + mysqli_commit_or_rollback_libmysql(mysql->mysql, FALSE, TRANS_COR_NO_OPT, NULL)) +#else + FAIL == mysqlnd_rollback(mysql->mysql, TRANS_COR_NO_OPT, NULL)) +#endif + { + mysqli_close(mysql->mysql, close_type); + } else { + zend_ptr_stack_push(&plist->free_links, mysql->mysql); + MyG(num_inactive_persistent)++; + } MyG(num_active_persistent)--; - MyG(num_inactive_persistent)++; } } mysql->persistent = FALSE; diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index 61e8e5c81..3d31b8183 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -373,6 +373,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_refresh, 0, 0, 1) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_no_options, 0, 0, 0) +ZEND_END_ARG_INFO() + /* {{{ mysqli_functions[] * @@ -425,6 +428,7 @@ const zend_function_entry mysqli_functions[] = { #endif PHP_FE(mysqli_get_client_info, arginfo_mysqli_only_link) PHP_FE(mysqli_get_client_version, arginfo_mysqli_only_link) + PHP_FE(mysqli_get_links_stats, arginfo_mysqli_no_options) PHP_FE(mysqli_get_host_info, arginfo_mysqli_only_link) PHP_FE(mysqli_get_proto_info, arginfo_mysqli_only_link) PHP_FE(mysqli_get_server_info, arginfo_mysqli_only_link) diff --git a/ext/mysqli/mysqli_fe.h b/ext/mysqli/mysqli_fe.h index d5ae8a6ff..9a9f85124 100644 --- a/ext/mysqli/mysqli_fe.h +++ b/ext/mysqli/mysqli_fe.h @@ -60,6 +60,7 @@ PHP_FUNCTION(mysqli_get_charset); PHP_FUNCTION(mysqli_get_client_info); PHP_FUNCTION(mysqli_get_client_version); PHP_FUNCTION(mysqli_get_host_info); +PHP_FUNCTION(mysqli_get_links_stats); PHP_FUNCTION(mysqli_get_proto_info); PHP_FUNCTION(mysqli_get_server_info); PHP_FUNCTION(mysqli_get_server_version); diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index db0352bae..312f2806c 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -1207,6 +1207,23 @@ PHP_FUNCTION(mysqli_release_savepoint) /* }}} */ +/* {{{ proto bool mysqli_get_links_stats() + Returns information about open and cached links */ +PHP_FUNCTION(mysqli_get_links_stats) +{ + if (ZEND_NUM_ARGS()) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "no parameters expected"); + return; + } + array_init(return_value); + add_assoc_long_ex(return_value, "total", sizeof("total"), MyG(num_links)); + add_assoc_long_ex(return_value, "active_plinks", sizeof("active_plinks"), MyG(num_active_persistent)); + add_assoc_long_ex(return_value, "cached_plinks", sizeof("cached_plinks"), MyG(num_inactive_persistent)); +} +/* }}} */ + + + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index e7c02f9c9..cc0c8fe63 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -334,6 +334,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqli) HashTable *report_ht; unsigned long multi_query; unsigned long embedded; + zend_bool rollback_on_cached_plink; ZEND_END_MODULE_GLOBALS(mysqli) diff --git a/ext/mysqli/tests/mysqli_class_mysqli_result_reflection.phpt b/ext/mysqli/tests/mysqli_class_mysqli_result_reflection.phpt index 988b82732..95400e43e 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_result_reflection.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_result_reflection.phpt @@ -233,7 +233,7 @@ isDestructor: no isInternal: yes isUserDefined: no returnsReference: no -Modifiers: 256 +Modifiers: 268435712 Number of Parameters: 2 Number of Required Parameters: 0 @@ -366,4 +366,4 @@ Default property 'field_count' Default property 'lengths' Default property 'num_rows' Default property 'type' -done!
\ No newline at end of file +done! diff --git a/ext/mysqli/tests/mysqli_pconn_max_links.phpt b/ext/mysqli/tests/mysqli_pconn_max_links.phpt index e87ef00b2..99e51e7c5 100644 --- a/ext/mysqli/tests/mysqli_pconn_max_links.phpt +++ b/ext/mysqli/tests/mysqli_pconn_max_links.phpt @@ -42,6 +42,7 @@ Persistent connections and mysqli.max_links --INI-- mysqli.allow_persistent=1 mysqli.max_persistent=2 +mysqli.rollback_on_cached_plink=1 --FILE-- <?php require_once("connect.inc"); @@ -58,10 +59,18 @@ mysqli.max_persistent=2 mysqli_errno($plink), mysqli_error($plink)); } + var_dump(mysqli_get_links_stats(1)); + + echo "Before pconnect:"; + var_dump(mysqli_get_links_stats()); + if (!$plink = my_mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) printf("[001] Cannot connect using the second DB user created during SKIPIF, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + echo "After pconnect:"; + var_dump(mysqli_get_links_stats()); + ob_start(); phpinfo(); $phpinfo = strip_tags(ob_get_contents()); @@ -110,11 +119,17 @@ mysqli.max_persistent=2 if (isset($running_threads[$pthread_id])) printf("[009] Persistent connection has not been killed\n"); + echo "Before second pconnect:"; + var_dump(mysqli_get_links_stats()); + // this fails and we have 0 (<= $num_plinks) connections if ($plink = @my_mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) printf("[010] Can connect using the old password, [%d] %s\n", mysqli_connect_errno($link), mysqli_connect_error($link)); + echo "After second pconnect:"; + var_dump(mysqli_get_links_stats()); + ob_start(); phpinfo(); $phpinfo = strip_tags(ob_get_contents()); @@ -123,7 +138,13 @@ mysqli.max_persistent=2 if (!preg_match('@Active Persistent Links\s+=>\s+(\d+)@ismU', $phpinfo, $matches)) printf("[010] Cannot get # of active persistent links from phpinfo()\n"); + var_dump(mysqli_get_links_stats()); + $num_plinks_kill = $matches[1]; + $sstats = mysqli_get_links_stats(); + if ($sstats['active_plinks'] != $num_plinks_kill) { + printf("[010.2] Num of active plinks differ %s %s\n", $sstats['active_plinks'], $num_plinks_kill); + } if ($num_plinks_kill > $num_plinks) printf("[011] Expecting Active Persistent Links < %d, got %d\n", $num_plinks, $num_plinks_kill); @@ -141,9 +162,11 @@ mysqli.max_persistent=2 mysqli_free_result($res); var_dump($row); - if ($plink2 = my_mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) + if ($plink2 = my_mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) { printf("[015] Can open more persistent connections than allowed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + var_dump(mysqli_get_links_stats()); + } ob_start(); phpinfo(); @@ -179,18 +202,71 @@ mysqli_query($link, 'DROP USER pcontest'); mysqli_close($link); ?> --EXPECTF-- -array(2) { - [%u|b%"id"]=> - %unicode|string%(1) "1" - [%u|b%"label"]=> - %unicode|string%(1) "a" +Warning: mysqli_get_links_stats(): no parameters expected in %s on line %d +NULL +Before pconnect:array(3) { + ["total"]=> + int(1) + ["active_plinks"]=> + int(0) + ["cached_plinks"]=> + int(0) +} +After pconnect:array(3) { + ["total"]=> + int(2) + ["active_plinks"]=> + int(1) + ["cached_plinks"]=> + int(0) } array(2) { - [%u|b%"id"]=> - %unicode|string%(1) "1" - [%u|b%"label"]=> - %unicode|string%(1) "a" + ["id"]=> + string(1) "1" + ["label"]=> + string(1) "a" +} +Before second pconnect:array(3) { + ["total"]=> + int(2) + ["active_plinks"]=> + int(1) + ["cached_plinks"]=> + int(0) } -Warning: %s: Too many open persistent links (%d) in %s on line %d +Warning: main(): MySQL server has gone away in %s on line %d + +Warning: main(): Error reading result set's header in %s line %d +After second pconnect:array(3) { + ["total"]=> + int(1) + ["active_plinks"]=> + int(0) + ["cached_plinks"]=> + int(0) +} +array(3) { + ["total"]=> + int(1) + ["active_plinks"]=> + int(0) + ["cached_plinks"]=> + int(0) +} +array(2) { + ["id"]=> + string(1) "1" + ["label"]=> + string(1) "a" +} +[015] Can open more persistent connections than allowed, [0] +array(3) { + ["total"]=> + int(3) + ["active_plinks"]=> + int(2) + ["cached_plinks"]=> + int(0) +} done!
\ No newline at end of file diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 3d6500138..60ce28dbf 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -561,6 +561,10 @@ enum mysqlnd_packet_type }; +/* + After adding new elements please update + `mysqlnd_command_to_text` in mysqlnd_wireprotocol.c +*/ enum php_mysqlnd_server_command { COM_SLEEP = 0, @@ -593,6 +597,8 @@ enum php_mysqlnd_server_command COM_SET_OPTION = 27, COM_STMT_FETCH = 28, COM_DAEMON, + COM_BINLOG_DUMP_GTID, + COM_RESET_CONNECTION, COM_END }; diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c index d0e44fa27..d96a57721 100644 --- a/ext/mysqlnd/mysqlnd_ps_codec.c +++ b/ext/mysqlnd/mysqlnd_ps_codec.c @@ -516,68 +516,70 @@ mysqlnd_stmt_copy_it(zval *** copies, zval * original, unsigned int param_count, /* }}} */ -/* {{{ mysqlnd_stmt_execute_store_params */ -static enum_func_status -mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar **p, size_t *buf_len TSRMLS_DC) +/* {{{ mysqlnd_stmt_free_copies */ +static void +mysqlnd_stmt_free_copies(MYSQLND_STMT_DATA * stmt, zval ** copies TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s->data; - unsigned int i = 0; - zend_uchar * provided_buffer = *buf; - size_t left = (*buf_len - (*p - *buf)); - size_t data_size = 0; - zval **copies = NULL;/* if there are different types */ - enum_func_status ret = FAIL; - int resend_types_next_time = 0; - size_t null_byte_offset; + if (copies) { + unsigned int i; + for (i = 0; i < stmt->param_count; i++) { + if (copies[i]) { + zval_ptr_dtor(&copies[i]); + } + } + mnd_efree(copies); + } +} +/* }}} */ - DBG_ENTER("mysqlnd_stmt_execute_store_params"); - { - unsigned int null_count = (stmt->param_count + 7) / 8; - /* give it some reserved space - 20 bytes */ - if (left < (null_count + 20)) { - unsigned int offset = *p - *buf; - zend_uchar *tmp_buf; - *buf_len = offset + null_count + 20; - tmp_buf = mnd_emalloc(*buf_len); - if (!tmp_buf) { - SET_OOM_ERROR(*stmt->error_info); - goto end; - } - memcpy(tmp_buf, *buf, offset); - if (*buf != provided_buffer) { - mnd_efree(*buf); - } - *buf = tmp_buf; +/* {{{ mysqlnd_stmt_execute_check_n_enlarge_buffer */ +static enum_func_status +mysqlnd_stmt_execute_check_n_enlarge_buffer(zend_uchar **buf, zend_uchar **p, size_t * buf_len, zend_uchar * const provided_buffer, size_t needed_bytes TSRMLS_DC) +{ + const size_t overalloc = 5; + size_t left = (*buf_len - (*p - *buf)); - /* Update our pos pointer */ - *p = *buf + offset; + if (left < (needed_bytes + overalloc)) { + size_t offset = *p - *buf; + zend_uchar *tmp_buf; + *buf_len = offset + needed_bytes + overalloc; + tmp_buf = mnd_emalloc(*buf_len); + if (!tmp_buf) { + return FAIL; } - /* put `null` bytes */ - null_byte_offset = *p - *buf; - memset(*p, 0, null_count); - *p += null_count; + memcpy(tmp_buf, *buf, offset); + if (*buf != provided_buffer) { + mnd_efree(*buf); + } + *buf = tmp_buf; + /* Update our pos pointer */ + *p = *buf + offset; } + return PASS; +} +/* }}} */ - left = (*buf_len - (*p - *buf)); -/* 1. Store type information */ - /* - check if need to send the types even if stmt->send_types_to_server is 0. This is because - if we send "i" (42) then the type will be int and the server will expect int. However, if next - time we try to send > LONG_MAX, the conversion to string will send a string and the server - won't expect it and interpret the value as 0. Thus we need to resend the types, if any such values - occur, and force resend for the next execution. - */ + +/* {{{ mysqlnd_stmt_execute_prepare_param_types */ +static enum_func_status +mysqlnd_stmt_execute_prepare_param_types(MYSQLND_STMT_DATA * stmt, zval *** copies_param, int * resend_types_next_time TSRMLS_DC) +{ + unsigned int i; + DBG_ENTER("mysqlnd_stmt_execute_prepare_param_types"); for (i = 0; i < stmt->param_count; i++) { short current_type = stmt->param_bind[i].type; + if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_NULL && (current_type == MYSQL_TYPE_LONG || current_type == MYSQL_TYPE_LONGLONG)) { + zval ** copies; /* always copy the var, because we do many conversions */ if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_LONG && - PASS != mysqlnd_stmt_copy_it(&copies, stmt->param_bind[i].zv, stmt->param_count, i TSRMLS_CC)) + PASS != mysqlnd_stmt_copy_it(copies_param, stmt->param_bind[i].zv, stmt->param_count, i TSRMLS_CC)) { SET_OOM_ERROR(*stmt->error_info); goto end; } + copies = *copies_param; /* if it doesn't fit in a long send it as a string. Check bug #52891 : Wrong data inserted with mysqli/mysqlnd when using bind_param, value > LONG_MAX @@ -602,7 +604,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar We do transformation here, which will be used later when sending types. The code later relies on this. */ if (Z_DVAL_P(tmp_data_copy) > LONG_MAX || Z_DVAL_P(tmp_data_copy) < LONG_MIN) { - stmt->send_types_to_server = resend_types_next_time = 1; + stmt->send_types_to_server = *resend_types_next_time = 1; convert_to_string_ex(&tmp_data); } else { convert_to_long_ex(&tmp_data); @@ -612,69 +614,63 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar } } } + DBG_RETURN(PASS); +end: + DBG_RETURN(FAIL); +} +/* }}} */ - int1store(*p, stmt->send_types_to_server); - (*p)++; - - if (stmt->send_types_to_server) { - /* 2 bytes per type, and leave 20 bytes for future use */ - if (left < ((stmt->param_count * 2) + 20)) { - unsigned int offset = *p - *buf; - zend_uchar *tmp_buf; - *buf_len = offset + stmt->param_count * 2 + 20; - tmp_buf = mnd_emalloc(*buf_len); - if (!tmp_buf) { - SET_OOM_ERROR(*stmt->error_info); - goto end; - } - memcpy(tmp_buf, *buf, offset); - if (*buf != provided_buffer) { - mnd_efree(*buf); - } - *buf = tmp_buf; - /* Update our pos pointer */ - *p = *buf + offset; - } - for (i = 0; i < stmt->param_count; i++) { - short current_type = stmt->param_bind[i].type; - /* our types are not unsigned */ +/* {{{ mysqlnd_stmt_execute_store_types */ +static void +mysqlnd_stmt_execute_store_types(MYSQLND_STMT_DATA * stmt, zval ** copies, zend_uchar ** p) +{ + unsigned int i; + for (i = 0; i < stmt->param_count; i++) { + short current_type = stmt->param_bind[i].type; + /* our types are not unsigned */ #if SIZEOF_LONG==8 - if (current_type == MYSQL_TYPE_LONG) { - current_type = MYSQL_TYPE_LONGLONG; - } + if (current_type == MYSQL_TYPE_LONG) { + current_type = MYSQL_TYPE_LONGLONG; + } #endif - if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_NULL && (current_type == MYSQL_TYPE_LONG || current_type == MYSQL_TYPE_LONGLONG)) { + if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_NULL && (current_type == MYSQL_TYPE_LONG || current_type == MYSQL_TYPE_LONGLONG)) { + /* + if it doesn't fit in a long send it as a string. + Check bug #52891 : Wrong data inserted with mysqli/mysqlnd when using bind_param, value > LONG_MAX + */ + if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_LONG) { + const zval *tmp_data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; /* - if it doesn't fit in a long send it as a string. - Check bug #52891 : Wrong data inserted with mysqli/mysqlnd when using bind_param, value > LONG_MAX + In case of IS_LONG we do nothing, it is ok, in case of string, we just need to set current_type. + The actual transformation has been performed several dozens line above. */ - if (Z_TYPE_P(stmt->param_bind[i].zv) != IS_LONG) { - zval *tmp_data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; + if (Z_TYPE_P(tmp_data) == IS_STRING) { + current_type = MYSQL_TYPE_VAR_STRING; /* - In case of IS_LONG we do nothing, it is ok, in case of string, we just need to set current_type. - The actual transformation has been performed several dozens line above. + don't change stmt->param_bind[i].type to MYSQL_TYPE_VAR_STRING + we force convert_to_long_ex in all cases, thus the type will be right in the next switch. + if the type is however not long, then we will do a goto in the next switch. + We want to preserve the original bind type given by the user. Thus, we do these hacks. */ - if (Z_TYPE_P(tmp_data) == IS_STRING) { - current_type = MYSQL_TYPE_VAR_STRING; - /* - don't change stmt->param_bind[i].type to MYSQL_TYPE_VAR_STRING - we force convert_to_long_ex in all cases, thus the type will be right in the next switch. - if the type is however not long, then we will do a goto in the next switch. - We want to preserve the original bind type given by the user. Thus, we do these hacks. - */ - } } } - int2store(*p, current_type); - *p+= 2; } + int2store(*p, current_type); + *p+= 2; } - stmt->send_types_to_server = resend_types_next_time; +} +/* }}} */ -/* 2. Store data */ - /* 2.1 Calculate how much space we need */ + +/* {{{ mysqlnd_stmt_execute_calculate_param_values_size */ +static enum_func_status +mysqlnd_stmt_execute_calculate_param_values_size(MYSQLND_STMT_DATA * stmt, zval *** copies_param, size_t * data_size TSRMLS_DC) +{ + unsigned int i; + DBG_ENTER("mysqlnd_stmt_execute_calculate_param_values_size"); for (i = 0; i < stmt->param_count; i++) { + unsigned short is_longlong = 0; unsigned int j; zval *the_var = stmt->param_bind[i].zv; @@ -684,22 +680,22 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar for (j = i + 1; j < stmt->param_count; j++) { if (stmt->param_bind[j].zv == the_var) { /* Double binding of the same zval, make a copy */ - if (!copies || !copies[i]) { - if (PASS != mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC)) { + if (!*copies_param || !(*copies_param)[i]) { + if (PASS != mysqlnd_stmt_copy_it(copies_param, the_var, stmt->param_count, i TSRMLS_CC)) { SET_OOM_ERROR(*stmt->error_info); goto end; } } - break; + break; } } switch (stmt->param_bind[i].type) { case MYSQL_TYPE_DOUBLE: - data_size += 8; + *data_size += 8; if (Z_TYPE_P(the_var) != IS_DOUBLE) { - if (!copies || !copies[i]) { - if (PASS != mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC)) { + if (!*copies_param || !(*copies_param)[i]) { + if (PASS != mysqlnd_stmt_copy_it(copies_param, the_var, stmt->param_count, i TSRMLS_CC)) { SET_OOM_ERROR(*stmt->error_info); goto end; } @@ -707,24 +703,17 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar } break; case MYSQL_TYPE_LONGLONG: - { - zval *tmp_data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; - if (Z_TYPE_P(tmp_data) == IS_STRING) { - goto use_string; - } - convert_to_long_ex(&tmp_data); - } - data_size += 8; - break; + is_longlong = 4; + /* fall-through */ case MYSQL_TYPE_LONG: { - zval *tmp_data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; + zval *tmp_data = (*copies_param && (*copies_param)[i])? (*copies_param)[i]: stmt->param_bind[i].zv; if (Z_TYPE_P(tmp_data) == IS_STRING) { goto use_string; } convert_to_long_ex(&tmp_data); } - data_size += 4; + *data_size += 4 + is_longlong; break; case MYSQL_TYPE_LONG_BLOB: if (!(stmt->param_bind[i].flags & MYSQLND_PARAM_BIND_BLOB_USED)) { @@ -733,58 +722,43 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar Empty string has length of 0, encoded in 1 byte. No real data will follows after it. */ - data_size++; + (*data_size)++; } break; case MYSQL_TYPE_VAR_STRING: use_string: - data_size += 8; /* max 8 bytes for size */ + *data_size += 8; /* max 8 bytes for size */ if (Z_TYPE_P(the_var) != IS_STRING) { - if (!copies || !copies[i]) { - if (PASS != mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC)) { + if (!*copies_param || !(*copies_param)[i]) { + if (PASS != mysqlnd_stmt_copy_it(copies_param, the_var, stmt->param_count, i TSRMLS_CC)) { SET_OOM_ERROR(*stmt->error_info); goto end; } } - the_var = copies[i]; + the_var = (*copies_param)[i]; } convert_to_string_ex(&the_var); - data_size += Z_STRLEN_P(the_var); + *data_size += Z_STRLEN_P(the_var); break; } } + DBG_RETURN(PASS); +end: + DBG_RETURN(FAIL); +} +/* }}} */ - /* 2.2 Enlarge the buffer, if needed */ - left = (*buf_len - (*p - *buf)); - if (left < data_size) { - unsigned int offset = *p - *buf; - zend_uchar *tmp_buf; - *buf_len = offset + data_size + 10; /* Allocate + 10 for safety */ - tmp_buf = mnd_emalloc(*buf_len); - if (!tmp_buf) { - SET_OOM_ERROR(*stmt->error_info); - goto end; - } - memcpy(tmp_buf, *buf, offset); - /* - When too many columns the buffer provided to the function might not be sufficient. - In this case new buffer has been allocated above. When we allocate a buffer and then - allocate a bigger one here, we should free the first one. - */ - if (*buf != provided_buffer) { - mnd_efree(*buf); - } - *buf = tmp_buf; - /* Update our pos pointer */ - *p = *buf + offset; - } - /* 2.3 Store the actual data */ +/* {{{ mysqlnd_stmt_execute_store_param_values */ +static void +mysqlnd_stmt_execute_store_param_values(MYSQLND_STMT_DATA * stmt, zval ** copies, zend_uchar * buf, zend_uchar ** p, size_t null_byte_offset) +{ + unsigned int i; for (i = 0; i < stmt->param_count; i++) { - zval *data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; + zval * data = (copies && copies[i])? copies[i]: stmt->param_bind[i].zv; /* Handle long data */ if (stmt->param_bind[i].zv && Z_TYPE_P(data) == IS_NULL) { - (*buf + null_byte_offset)[i/8] |= (zend_uchar) (1 << (i & 7)); + (buf + null_byte_offset)[i/8] |= (zend_uchar) (1 << (i & 7)); } else { switch (stmt->param_bind[i].type) { case MYSQL_TYPE_DOUBLE: @@ -819,7 +793,7 @@ use_string: case MYSQL_TYPE_VAR_STRING: send_string: { - unsigned int len = Z_STRLEN_P(data); + size_t len = Z_STRLEN_P(data); /* to is after p. The latter hasn't been moved */ *p = php_mysqlnd_net_store_length(*p, len); memcpy(*p, Z_STRVAL_P(data), len); @@ -828,22 +802,86 @@ send_string: break; default: /* Won't happen, but set to NULL */ - (*buf + null_byte_offset)[i/8] |= (zend_uchar) (1 << (i & 7)); + (buf + null_byte_offset)[i/8] |= (zend_uchar) (1 << (i & 7)); break; } } } - ret = PASS; -end: - if (copies) { - for (i = 0; i < stmt->param_count; i++) { - if (copies[i]) { - zval_ptr_dtor(&copies[i]); - } +} +/* }}} */ + + +/* {{{ mysqlnd_stmt_execute_store_params */ +static enum_func_status +mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar **p, size_t *buf_len TSRMLS_DC) +{ + MYSQLND_STMT_DATA * stmt = s->data; + unsigned int i = 0; + zend_uchar * provided_buffer = *buf; + size_t data_size = 0; + zval **copies = NULL;/* if there are different types */ + enum_func_status ret = FAIL; + int resend_types_next_time = 0; + size_t null_byte_offset; + + DBG_ENTER("mysqlnd_stmt_execute_store_params"); + + { + unsigned int null_count = (stmt->param_count + 7) / 8; + if (FAIL == mysqlnd_stmt_execute_check_n_enlarge_buffer(buf, p, buf_len, provided_buffer, null_count TSRMLS_CC)) { + SET_OOM_ERROR(*stmt->error_info); + goto end; } - mnd_efree(copies); + /* put `null` bytes */ + null_byte_offset = *p - *buf; + memset(*p, 0, null_count); + *p += null_count; + } + +/* 1. Store type information */ + /* + check if need to send the types even if stmt->send_types_to_server is 0. This is because + if we send "i" (42) then the type will be int and the server will expect int. However, if next + time we try to send > LONG_MAX, the conversion to string will send a string and the server + won't expect it and interpret the value as 0. Thus we need to resend the types, if any such values + occur, and force resend for the next execution. + */ + if (FAIL == mysqlnd_stmt_execute_prepare_param_types(stmt, &copies, &resend_types_next_time TSRMLS_CC)) { + goto end; + } + + int1store(*p, stmt->send_types_to_server); + (*p)++; + + if (stmt->send_types_to_server) { + if (FAIL == mysqlnd_stmt_execute_check_n_enlarge_buffer(buf, p, buf_len, provided_buffer, stmt->param_count * 2 TSRMLS_CC)) { + SET_OOM_ERROR(*stmt->error_info); + goto end; + } + mysqlnd_stmt_execute_store_types(stmt, copies, p); + } + + stmt->send_types_to_server = resend_types_next_time; + +/* 2. Store data */ + /* 2.1 Calculate how much space we need */ + if (FAIL == mysqlnd_stmt_execute_calculate_param_values_size(stmt, &copies, &data_size TSRMLS_CC)) { + goto end; + } + + /* 2.2 Enlarge the buffer, if needed */ + if (FAIL == mysqlnd_stmt_execute_check_n_enlarge_buffer(buf, p, buf_len, provided_buffer, data_size TSRMLS_CC)) { + SET_OOM_ERROR(*stmt->error_info); + goto end; } + /* 2.3 Store the actual data */ + mysqlnd_stmt_execute_store_param_values(stmt, copies, *buf, p, null_byte_offset); + + ret = PASS; +end: + mysqlnd_stmt_free_copies(stmt, copies TSRMLS_CC); + DBG_INF_FMT("ret=%s", ret == PASS? "PASS":"FAIL"); DBG_RETURN(ret); } diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 74019b55b..fbf8ea031 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -187,9 +187,11 @@ MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLND_RES * result TSRMLS_DC) if (set->data) { unsigned int copy_on_write_performed = 0; unsigned int copy_on_write_saved = 0; + zval **data = set->data; + set->data = NULL; /* prevent double free if following loop is interrupted */ for (row = set->row_count - 1; row >= 0; row--) { - zval **current_row = set->data + row * field_count; + zval **current_row = data + row * field_count; MYSQLND_MEMORY_POOL_CHUNK *current_buffer = set->row_buffers[row]; int64_t col; @@ -211,8 +213,7 @@ MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLND_RES * result TSRMLS_DC) MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_COPY_ON_WRITE_PERFORMED, copy_on_write_performed, STAT_COPY_ON_WRITE_SAVED, copy_on_write_saved); - mnd_efree(set->data); - set->data = NULL; + mnd_efree(data); } if (set->row_buffers) { diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index d78d29a2f..df9dde592 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -90,7 +90,8 @@ const char * const mysqlnd_command_to_text[COM_END] = "TIME", "DELAYED_INSERT", "CHANGE_USER", "BINLOG_DUMP", "TABLE_DUMP", "CONNECT_OUT", "REGISTER_SLAVE", "STMT_PREPARE", "STMT_EXECUTE", "STMT_SEND_LONG_DATA", "STMT_CLOSE", - "STMT_RESET", "SET_OPTION", "STMT_FETCH", "DAEMON" + "STMT_RESET", "SET_OPTION", "STMT_FETCH", "DAEMON", "BINLOG_DUMP_GTID", + "RESET_CONNECTION" }; /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h index 4bd33592b..be71d0650 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.h +++ b/ext/mysqlnd/mysqlnd_wireprotocol.h @@ -302,6 +302,7 @@ PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * c unsigned long php_mysqlnd_net_field_length(zend_uchar **packet); zend_uchar * php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length); +size_t php_mysqlnd_net_store_length_size(uint64_t length); PHPAPI const extern char * const mysqlnd_empty_string; diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index c3ca7a817..a890c94da 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -26,8 +26,6 @@ +----------------------------------------------------------------------+ */ -/* $Id$ */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -1251,6 +1249,9 @@ PHP_MINIT_FUNCTION(oci) REGISTER_LONG_CONSTANT("SQLT_BDOUBLE",SQLT_BDOUBLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQLT_BFLOAT",SQLT_BFLOAT, CONST_CS | CONST_PERSISTENT); #endif +#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 + REGISTER_LONG_CONSTANT("SQLT_BOL",SQLT_BOL, CONST_CS | CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("OCI_B_NTY",SQLT_NTY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQLT_NTY",SQLT_NTY, CONST_CS | CONST_PERSISTENT); @@ -1265,6 +1266,9 @@ PHP_MINIT_FUNCTION(oci) REGISTER_LONG_CONSTANT("OCI_B_BIN",SQLT_BIN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_B_INT",SQLT_INT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_B_NUM",SQLT_NUM, CONST_CS | CONST_PERSISTENT); +#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 + REGISTER_LONG_CONSTANT("OCI_B_BOL",SQLT_BOL, CONST_CS | CONST_PERSISTENT); +#endif /* for OCIFetchStatement */ REGISTER_LONG_CONSTANT("OCI_FETCHSTATEMENT_BY_COLUMN", PHP_OCI_FETCHSTATEMENT_BY_COLUMN, CONST_CS | CONST_PERSISTENT); diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 56882cf90..520809c81 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -928,19 +928,16 @@ int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC) } break; + case SQLT_CHR: + case SQLT_AFC: case SQLT_INT: case SQLT_NUM: - if (Z_TYPE_P(bind->zval) == IS_RESOURCE || Z_TYPE_P(bind->zval) == IS_OBJECT) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); - *(int *)result = 1; - } - break; - +#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 + case SQLT_BOL: +#endif case SQLT_LBI: case SQLT_BIN: case SQLT_LNG: - case SQLT_AFC: - case SQLT_CHR: if (Z_TYPE_P(bind->zval) == IS_RESOURCE || Z_TYPE_P(bind->zval) == IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); *(int *)result = 1; @@ -955,7 +952,7 @@ int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC) break; } - /* reset all bind stuff to a normal state..-. */ + /* reset all bind stuff to a normal state... */ bind->indicator = 0; return 0; @@ -1185,6 +1182,20 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, } break; +#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 + case SQLT_BOL: + if (Z_TYPE_P(var) == IS_RESOURCE || Z_TYPE_P(var) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + return 1; + } + convert_to_boolean(var); + bind_data = (int *)&Z_LVAL_P(var); + value_sz = sizeof(int); + + mode = OCI_DEFAULT; + break; +#endif + default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or unsupported datatype given: %d", (int)type); return 1; diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 8e55b9abd..553b273fe 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -45,7 +45,7 @@ libraries are available. <active>no</active> </lead> - <date>2013-10-22</date> + <date>2014-02-10</date> <time>12:00:00</time> <version> @@ -58,7 +58,8 @@ libraries are available. </stability> <license uri="http://www.php.net/license">PHP</license> <notes> - Build change: Fix source variable definition for C89 compatibility +Added oci_bind_by_name() support for PL/SQL BOOLEAN type +Build change: Fix source variable definition for C89 compatibility </notes> <contents> <dir name="/"> @@ -91,6 +92,7 @@ libraries are available. <file name="b47243_1.phpt" role="test" /> <file name="b47243_2.phpt" role="test" /> <file name="b47243_3.phpt" role="test" /> + <file name="bind_boolean_1.phpt" role="test" /> <file name="bind_char_1_11gR1.phpt" role="test" /> <file name="bind_char_1.phpt" role="test" /> <file name="bind_char_2_11gR1.phpt" role="test" /> @@ -268,6 +270,8 @@ libraries are available. <file name="error2.phpt" role="test" /> <file name="error3.phpt" role="test" /> <file name="error_bind.phpt" role="test" /> + <file name="error_bind_2.phpt" role="test" /> + <file name="error_bind_3.phpt" role="test" /> <file name="error_old.phpt" role="test" /> <file name="error_parse.phpt" role="test" /> <file name="error.phpt" role="test" /> @@ -429,6 +433,7 @@ libraries are available. <file name="config.m4" role="src" /> <file name="config.w32" role="src" /> <file name="CREDITS" role="doc" /> + <file name="LICENSE" role="doc" /> <file name="oci8.c" role="src" /> <file name="oci8_dtrace.d" role="src" /> <file name="oci8_collection.c" role="src" /> diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 63924eca0..17061066d 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -45,7 +45,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.7-dev" +#define PHP_OCI8_VERSION "2.0.7" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/tests/bind_boolean_1.phpt b/ext/oci8/tests/bind_boolean_1.phpt new file mode 100644 index 000000000..49ac03c88 --- /dev/null +++ b/ext/oci8/tests/bind_boolean_1.phpt @@ -0,0 +1,138 @@ +--TEST-- +Basic PL/SQL "BOOLEAN" (SQLT_BOL) bind test +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +require(dirname(__FILE__).'/connect.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Run Test + +echo "Test 1\n"; + +$sql = "begin + :output1 := true; + :output2 := false; + end;"; + +$s = oci_parse($c, $sql); +oci_bind_by_name($s, ':output1', $output1, -1, OCI_B_BOL); +oci_bind_by_name($s, ':output2', $output2, -1, OCI_B_BOL); +oci_execute($s); +var_dump($output1); +var_dump($output2); + +echo "Test 2\n"; + +$b = "abc"; // bind var type will change +$sql = "begin :b := true; end;"; +$s = oci_parse($c, $sql); +oci_bind_by_name($s, ':b', $b, -1, OCI_B_BOL); +oci_execute($s); +var_dump($b); + + +echo "Test 3\n"; + +$sql = + "begin + if (:input < 10) then + :output := true; + else + :output := false; + end if; +end;"; +$s = oci_parse($c, $sql); +oci_bind_by_name($s, ':output', $output, -1, OCI_B_BOL); +for ($input = 5; $input < 15; ++$input) { + oci_bind_by_name($s, ':input', $input); + oci_execute($s); + var_dump($output); +} + +echo "Test 4\n"; + +$sql = +"begin + if (mod(:userid,2) = 0) then + :b := true; + else + :b := false; + end if; +end;"; +$s = oci_parse($c, $sql); +oci_bind_by_name($s, ':b', $b, -1, OCI_B_BOL); +for ($userid = 1; $userid <= 10; ++$userid) { + oci_bind_by_name($s, ':userid', $userid, -1, SQLT_INT); + oci_execute($s); + var_dump($b); +} + +echo "Test 5\n"; + +$sql = +"declare + l boolean; +begin + l := :b1; + :b1 := :b2; + :b2 := l; +end;"; +$s = oci_parse($c, $sql); +$b1 = true; +$b2 = false; +var_dump($b1, $b2); +oci_bind_by_name($s, ':b1', $b1, -1, OCI_B_BOL); +oci_bind_by_name($s, ':b2', $b2, -1, OCI_B_BOL); +oci_execute($s); +var_dump($b1, $b2); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +bool(true) +bool(false) +Test 2 +bool(true) +Test 3 +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Test 4 +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +Test 5 +bool(true) +bool(false) +bool(false) +bool(true) +===DONE=== diff --git a/ext/oci8/tests/error_bind_2.phpt b/ext/oci8/tests/error_bind_2.phpt new file mode 100644 index 000000000..642716887 --- /dev/null +++ b/ext/oci8/tests/error_bind_2.phpt @@ -0,0 +1,63 @@ +--TEST-- +Test some more oci_bind_by_name error conditions +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => true); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table error_bind_2_tab", + "create table error_bind_2_tab(name varchar(10))" +); +oci8_test_sql_execute($c, $stmtarray); + +echo "Test 1 - SQLT_BOL\n"; + +unset($name); +$stmt = oci_parse($c, "insert into error_bind_2_tab values (:name)"); +oci_bind_by_name($stmt, ":name", $name, -1, SQLT_BOL); +$name=$c; +var_dump(oci_execute($stmt)); + +echo "Test 2 - SQLT_BOL\n"; + +unset($name); +$stmt = oci_parse($c, "insert into error_bind_2_tab values (:name)"); +$name=$c; +oci_bind_by_name($stmt, ":name", $name, -1, SQLT_BOL); + +// Clean up + +$stmtarray = array( + "drop table error_bind_2_tab", +); +oci8_test_sql_execute($c, $stmtarray); + +echo "Done\n"; + +?> +--EXPECTF-- +Test 1 - SQLT_BOL + +Warning: oci_execute(): Invalid variable used for bind in %s on line %d +bool(false) +Test 2 - SQLT_BOL + +Warning: oci_bind_by_name(): Invalid variable used for bind in %s on line %d +Done diff --git a/ext/oci8/tests/error_bind_3.phpt b/ext/oci8/tests/error_bind_3.phpt new file mode 100644 index 000000000..7522dfe60 --- /dev/null +++ b/ext/oci8/tests/error_bind_3.phpt @@ -0,0 +1,48 @@ +--TEST-- +Test some more oci_bind_by_name error conditions +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => true); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +$sql = "begin + :output1 := 99; + :output2 := 'abc'; + end;"; + +$s = oci_parse($c, $sql); +oci_bind_by_name($s, ':output1', $output1, -1, OCI_B_BOL); +oci_bind_by_name($s, ':output2', $output2, -1, OCI_B_BOL); +oci_execute($s); +var_dump($output1); +var_dump($output2); + +echo "Done\n"; + +?> +--EXPECTF-- +Warning: oci_execute(): ORA-06550: line %d, column %d: +PLS-00382: %s +ORA-06550: line %d, column %d: +PL/SQL: %s +ORA-06550: line %d, column %d: +PLS-00382: %s +ORA-06550: line %d, column %d: +PL/SQL: %s in %s on line %d +bool(false) +bool(false) +Done diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index fd4b22076..d57b3eafd 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -27,7 +27,9 @@ #endif #include "php.h" +#include "php_ini.h" #include "php_openssl.h" +#include "php_openssl_structs.h" /* PHP Includes */ #include "ext/standard/file.h" @@ -1071,6 +1073,13 @@ static const EVP_CIPHER * php_openssl_get_evp_cipher_from_algo(long algo) { /* { } /* }}} */ +/* {{{ INI Settings */ +PHP_INI_BEGIN() + PHP_INI_ENTRY("openssl.cafile", NULL, PHP_INI_ALL, NULL) + PHP_INI_ENTRY("openssl.capath", NULL, PHP_INI_ALL, NULL) +PHP_INI_END() +/* }}} */ + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(openssl) @@ -1203,7 +1212,9 @@ PHP_MINIT_FUNCTION(openssl) php_register_url_stream_wrapper("https", &php_stream_http_wrapper TSRMLS_CC); php_register_url_stream_wrapper("ftps", &php_stream_ftp_wrapper TSRMLS_CC); - + + REGISTER_INI_ENTRIES(); + return SUCCESS; } /* }}} */ @@ -1217,6 +1228,7 @@ PHP_MINFO_FUNCTION(openssl) php_info_print_table_row(2, "OpenSSL Library Version", SSLeay_version(SSLEAY_VERSION)); php_info_print_table_row(2, "OpenSSL Header Version", OPENSSL_VERSION_TEXT); php_info_print_table_end(); + DISPLAY_INI_ENTRIES(); } /* }}} */ @@ -1243,6 +1255,8 @@ PHP_MSHUTDOWN_FUNCTION(openssl) /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); + UNREGISTER_INI_ENTRIES(); + return SUCCESS; } /* }}} */ @@ -4999,9 +5013,9 @@ static zend_bool matches_wildcard_name(const char *subjectname, const char *cert return 0; } -static zend_bool matches_san_list(X509 *peer, const char *subject_name) +static zend_bool matches_san_list(X509 *peer, const char *subject_name TSRMLS_DC) { - int i; + int i, san_name_len; zend_bool is_match = 0; unsigned char *cert_name; @@ -5010,13 +5024,23 @@ static zend_bool matches_san_list(X509 *peer, const char *subject_name) for (i = 0; i < alt_name_count; i++) { GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i); + if (san->type != GEN_DNS) { + /* we only care about DNS names */ + continue; + } + + san_name_len = ASN1_STRING_length(san->d.dNSName); + ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); - if (GEN_DNS == san->type) { - ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); - is_match = matches_wildcard_name(subject_name, (char *) cert_name); - OPENSSL_free(cert_name); + /* prevent null byte poisoning */ + if (san_name_len != strlen(cert_name)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer SAN entry is malformed"); + } else { + is_match = strcasecmp(subject_name, cert_name) == 0; } + OPENSSL_free(cert_name); + if (is_match) { break; } @@ -5053,9 +5077,13 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre zval **val = NULL; char *cnmatch = NULL; int err; + php_openssl_netstream_data_t *sslsock; + + sslsock = (php_openssl_netstream_data_t*)stream->abstract; - /* verification is turned off */ - if (!(GET_VER_OPT("verify_peer") && zval_is_true(*val))) { + if (!(GET_VER_OPT("verify_peer") || sslsock->is_client) + || (GET_VER_OPT("verify_peer") && !zval_is_true(*val)) + ) { return SUCCESS; } @@ -5095,8 +5123,13 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre GET_VER_OPT_STRING("CN_match", cnmatch); + /* If no CN_match was specified assign the autodetected name when connecting as a client */ + if (cnmatch == NULL && sslsock->is_client) { + cnmatch = sslsock->url_name; + } + if (cnmatch) { - if (matches_san_list(peer, cnmatch)) { + if (matches_san_list(peer, cnmatch TSRMLS_CC)) { return SUCCESS; } else if (matches_common_name(peer, cnmatch TSRMLS_CC)) { return SUCCESS; @@ -5140,7 +5173,9 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ ERR_clear_error(); /* look at context options in the stream and set appropriate verification flags */ - if (GET_VER_OPT("verify_peer") && zval_is_true(*val)) { + if (GET_VER_OPT("verify_peer") && !zval_is_true(*val)) { + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); + } else { /* turn on verification callback */ SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback); @@ -5149,19 +5184,35 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ GET_VER_OPT_STRING("cafile", cafile); GET_VER_OPT_STRING("capath", capath); + if (!cafile) { + zend_bool exists = 1; + cafile = zend_ini_string_ex("openssl.cafile", sizeof("openssl.cafile"), 0, &exists); + } + + if (!capath) { + zend_bool exists = 1; + capath = zend_ini_string_ex("openssl.capath", sizeof("openssl.capath"), 0, &exists); + } + if (cafile || capath) { if (!SSL_CTX_load_verify_locations(ctx, cafile, capath)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set verify locations `%s' `%s'", cafile, capath); return NULL; } + } else { + php_openssl_netstream_data_t *sslsock; + sslsock = (php_openssl_netstream_data_t*)stream->abstract; + if (sslsock->is_client && !SSL_CTX_set_default_verify_paths(ctx)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Unable to set default verify locations and no CA settings specified"); + return NULL; + } } if (GET_VER_OPT("verify_depth")) { convert_to_long_ex(val); SSL_CTX_set_verify_depth(ctx, Z_LVAL_PP(val)); } - } else { - SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); } /* callback for the passphrase (for localcert) */ @@ -5227,6 +5278,7 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ } } } + if (ok) { SSL *ssl = SSL_new(ctx); @@ -5655,3 +5707,4 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */ + diff --git a/ext/openssl/php_openssl_structs.h b/ext/openssl/php_openssl_structs.h new file mode 100644 index 000000000..13f8f320f --- /dev/null +++ b/ext/openssl/php_openssl_structs.h @@ -0,0 +1,42 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Wez Furlong <wez@thebrainroom.com> | + | Daniel Lowrey <rdlowrey@gmail.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include "php_network.h" +#include <openssl/ssl.h> + +/* This implementation is very closely tied to the that of the native + * sockets implemented in the core. + * Don't try this technique in other extensions! + * */ + +typedef struct _php_openssl_netstream_data_t { + php_netstream_data_t s; + SSL *ssl_handle; + SSL_CTX *ctx; + struct timeval connect_timeout; + int enable_on_connect; + int is_client; + int ssl_active; + php_stream_xport_crypt_method_t method; + char *url_name; + unsigned state_set:1; + unsigned _spare:31; +} php_openssl_netstream_data_t; diff --git a/ext/openssl/tests/bug46127.phpt b/ext/openssl/tests/bug46127.phpt index a3bfd3a01..1de4eacd0 100644 --- a/ext/openssl/tests/bug46127.phpt +++ b/ext/openssl/tests/bug46127.phpt @@ -45,7 +45,10 @@ if ($pid == 0) { // child // client or failed sleep(1); -$sock = fsockopen('ssl://127.0.0.1', $port, $errno, $errstr); +$ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false +]]); +$sock = stream_socket_client("ssl://127.0.0.1:{$port}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx); if (!$sock) exit; echo fgets($sock); diff --git a/ext/openssl/tests/bug48182.phpt b/ext/openssl/tests/bug48182.phpt index 146c4c922..b78ce5707 100644 --- a/ext/openssl/tests/bug48182.phpt +++ b/ext/openssl/tests/bug48182.phpt @@ -13,8 +13,7 @@ function ssl_server($port) { $host = 'ssl://127.0.0.1'.':'.$port; $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; $data = "Sending bug48182\n"; - - $pem = dirname(__FILE__) . '/bug46127.pem'; + $pem = dirname(__FILE__) . '/bug54992.pem'; $ssl_params = array( 'verify_peer' => false, 'allow_self_signed' => true, 'local_cert' => $pem); $ssl = array('ssl' => $ssl_params); @@ -47,8 +46,11 @@ function ssl_async_client($port) { $host = 'ssl://127.0.0.1'.':'.$port; $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; $data = "Sending data over to SSL server in async mode with contents like Hello World\n"; - - $socket = stream_socket_client($host, $errno, $errstr, 10, $flags); + $context = stream_context_create(array('ssl' => array( + 'cafile' => dirname(__FILE__) . '/bug54992-ca.pem', + 'CN_match' => 'bug54992.local' + ))); + $socket = stream_socket_client($host, $errno, $errstr, 10, $flags, $context); stream_set_blocking($socket, 0); while ($socket && $data) { diff --git a/ext/openssl/tests/openssl_peer_fingerprint.phpt b/ext/openssl/tests/openssl_peer_fingerprint.phpt index 2960dffae..2e4c192c0 100644 --- a/ext/openssl/tests/openssl_peer_fingerprint.phpt +++ b/ext/openssl/tests/openssl_peer_fingerprint.phpt @@ -24,6 +24,7 @@ if ($pid == -1) { 'verify_peer' => true, 'cafile' => __DIR__ . '/bug54992-ca.pem', 'capture_peer_cert' => true, + 'CN_match' => 'bug54992.local', 'peer_fingerprint' => '81cafc260aa8d82956ebc6212a362ece', ) ) @@ -38,6 +39,7 @@ if ($pid == -1) { 'verify_peer' => true, 'cafile' => __DIR__ . '/bug54992-ca.pem', 'capture_peer_cert' => true, + 'CN_match' => 'bug54992.local', 'peer_fingerprint' => array( 'sha256' => '78ea579f2c3b439359dec5dac9d445108772927427c4780037e87df3799a0aa0', ), @@ -59,4 +61,4 @@ Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) -resource(9) of type (stream) +resource(%d) of type (stream) diff --git a/ext/openssl/tests/peer_verification.phpt b/ext/openssl/tests/peer_verification.phpt new file mode 100644 index 000000000..7c3347fd6 --- /dev/null +++ b/ext/openssl/tests/peer_verification.phpt @@ -0,0 +1,56 @@ +--TEST-- +Peer verification enabled for client streams +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip"); +if (!function_exists('pcntl_fork')) die("skip no fork"); +--FILE-- +<?php +$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; +$ctx = stream_context_create(['ssl' => [ + 'local_cert' => __DIR__ . '/bug54992.pem', + 'allow_self_signed' => true +]]); +$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} else if ($pid) { + // Expected to fail -- no CA File present + var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT)); + + // Expected to fail -- no CA File present + $ctx = stream_context_create(['ssl' => ['verify_peer' => true]]); + var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx)); + + // Should succeed with peer verification disabled in context + $ctx = stream_context_create(['ssl' => ['verify_peer' => false]]); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx)); + + // Should succeed with CA file specified in context + $ctx = stream_context_create(['ssl' => [ + 'cafile' => __DIR__ . '/bug54992-ca.pem', + 'CN_match' => 'bug54992.local', + ]]); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx)); + + // Should succeed with globally available CA file specified via php.ini + $cafile = __DIR__ . '/bug54992-ca.pem'; + ini_set('openssl.cafile', $cafile); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx)); + +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 3); + @stream_socket_accept($server, 3); + @stream_socket_accept($server, 3); + @stream_socket_accept($server, 3); + @stream_socket_accept($server, 3); +} +--EXPECTF-- +bool(false) +bool(false) +resource(%d) of type (stream) +resource(%d) of type (stream) +resource(%d) of type (stream) diff --git a/ext/openssl/tests/sni_001.phpt b/ext/openssl/tests/sni_001.phpt index 3d7798cf8..2f76a9f91 100644 --- a/ext/openssl/tests/sni_001.phpt +++ b/ext/openssl/tests/sni_001.phpt @@ -24,6 +24,7 @@ function context() { return stream_context_create(array( 'ssl' => array( 'capture_peer_cert' => true, + 'verify_peer' => false ), )); } diff --git a/ext/openssl/tests/streams_crypto_method.phpt b/ext/openssl/tests/streams_crypto_method.phpt index 97a6e9ee8..981f56b39 100644 --- a/ext/openssl/tests/streams_crypto_method.phpt +++ b/ext/openssl/tests/streams_crypto_method.phpt @@ -10,6 +10,7 @@ if (!extension_loaded('pcntl')) die('skip, pcntl required'); function client($port, $method) { $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'crypto_method', $method); + stream_context_set_option($ctx, 'ssl', 'verify_peer', false); $fp = @fopen('https://127.0.0.1:' . $port . '/', 'r', false, $ctx); if ($fp) { diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 631d4756e..523062e04 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -23,8 +23,8 @@ #include "ext/standard/url.h" #include "streams/php_streams_int.h" #include "ext/standard/php_smart_str.h" -#include "php_network.h" #include "php_openssl.h" +#include "php_openssl_structs.h" #include <openssl/ssl.h> #include <openssl/x509.h> #include <openssl/err.h> @@ -41,25 +41,6 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC); int php_openssl_get_x509_list_id(void); -/* This implementation is very closely tied to the that of the native - * sockets implemented in the core. - * Don't try this technique in other extensions! - * */ - -typedef struct _php_openssl_netstream_data_t { - php_netstream_data_t s; - SSL *ssl_handle; - SSL_CTX *ctx; - struct timeval connect_timeout; - int enable_on_connect; - int is_client; - int ssl_active; - php_stream_xport_crypt_method_t method; - char *sni; - unsigned state_set:1; - unsigned _spare:31; -} php_openssl_netstream_data_t; - php_stream_ops php_openssl_socket_ops; /* it doesn't matter that we do some hash traversal here, since it is done only @@ -285,11 +266,12 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle TSRMLS_ } } - if (sslsock->sni) { - pefree(sslsock->sni, php_stream_is_persistent(stream)); + if (sslsock->url_name) { + pefree(sslsock->url_name, php_stream_is_persistent(stream)); } + pefree(sslsock, php_stream_is_persistent(stream)); - + return 0; } @@ -425,7 +407,8 @@ static inline int php_openssl_setup_crypto(php_stream *stream, if (stream->context && SUCCESS == php_stream_context_get_option( stream->context, "ssl", "no_ticket", &val) && - zval_is_true(*val)) { + zend_is_true(*val) + ) { SSL_CTX_set_options(sslsock->ctx, SSL_OP_NO_TICKET); } } @@ -437,7 +420,8 @@ static inline int php_openssl_setup_crypto(php_stream *stream, if (stream->context && SUCCESS == php_stream_context_get_option( stream->context, "ssl", "disable_compression", &val) && - zval_is_true(*val)) { + zend_is_true(*val) + ) { SSL_CTX_set_options(sslsock->ctx, SSL_OP_NO_COMPRESSION); } } @@ -467,6 +451,7 @@ static inline int php_openssl_setup_crypto(php_stream *stream, return 0; } + static inline int php_openssl_enable_crypto(php_stream *stream, php_openssl_netstream_data_t *sslsock, php_stream_xport_crypto_param *cparam @@ -480,10 +465,22 @@ static inline int php_openssl_enable_crypto(php_stream *stream, int blocked = sslsock->s.is_blocked, has_timeout = 0; -#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT) - if (sslsock->is_client && sslsock->sni) { - SSL_set_tlsext_host_name(sslsock->ssl_handle, sslsock->sni); +#if OPENSSL_VERSION_NUMBER >= 0x00908070L && !defined(OPENSSL_NO_TLSEXT) + + zval **val; + + if (sslsock->is_client + && (php_stream_context_get_option(stream->context, "ssl", "SNI_enabled", &val) == FAILURE + || zend_is_true(*val)) + ) { + if (php_stream_context_get_option(stream->context, "ssl", "SNI_server_name", &val) == SUCCESS) { + convert_to_string_ex(val); + SSL_set_tlsext_host_name(sslsock->ssl_handle, Z_STRVAL_PP(val)); + } else if (sslsock->url_name) { + SSL_set_tlsext_host_name(sslsock->ssl_handle, sslsock->url_name); + } } + #endif if (!sslsock->state_set) { @@ -581,7 +578,7 @@ static inline int php_openssl_enable_crypto(php_stream *stream, if (SUCCESS == php_stream_context_get_option( stream->context, "ssl", "capture_peer_cert", &val) && - zval_is_true(*val)) { + zend_is_true(*val)) { MAKE_STD_ZVAL(zcert); ZVAL_RESOURCE(zcert, zend_list_insert(peer_cert, php_openssl_get_x509_list_id() TSRMLS_CC)); @@ -595,7 +592,7 @@ static inline int php_openssl_enable_crypto(php_stream *stream, if (SUCCESS == php_stream_context_get_option( stream->context, "ssl", "capture_peer_cert_chain", &val) && - zval_is_true(*val)) { + zend_is_true(*val)) { zval *arr; STACK_OF(X509) *chain; @@ -920,21 +917,9 @@ static int get_crypto_method(php_stream_context *ctx) { return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; } -static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { +static char * get_url_name(const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; - if (ctx) { - zval **val = NULL; - - if (php_stream_context_get_option(ctx, "ssl", "SNI_enabled", &val) == SUCCESS && !zend_is_true(*val)) { - return NULL; - } - if (php_stream_context_get_option(ctx, "ssl", "SNI_server_name", &val) == SUCCESS) { - convert_to_string_ex(val); - return pestrdup(Z_STRVAL_PP(val), is_persistent); - } - } - if (!resourcename) { return NULL; } @@ -946,7 +931,7 @@ static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t if (url->host) { const char * host = url->host; - char * sni = NULL; + char * url_name = NULL; size_t len = strlen(host); /* skip trailing dots */ @@ -955,11 +940,11 @@ static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t } if (len) { - sni = pestrndup(host, len, is_persistent); + url_name = pestrndup(host, len, is_persistent); } php_url_free(url); - return sni; + return url_name; } php_url_free(url); @@ -1001,8 +986,6 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, return NULL; } - sslsock->sni = get_sni(context, resourcename, resourcenamelen, !!persistent_id TSRMLS_CC); - if (strncmp(proto, "ssl", protolen) == 0) { sslsock->enable_on_connect = 1; @@ -1042,7 +1025,9 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, return NULL; #endif } - + + sslsock->url_name = get_url_name(resourcename, resourcenamelen, !!persistent_id TSRMLS_CC); + return stream; } diff --git a/ext/pcre/pcrelib/AUTHORS b/ext/pcre/pcrelib/AUTHORS index ba4753d85..97d8c71dd 100644 --- a/ext/pcre/pcrelib/AUTHORS +++ b/ext/pcre/pcrelib/AUTHORS @@ -8,7 +8,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2012 University of Cambridge +Copyright (c) 1997-2013 University of Cambridge All rights reserved @@ -19,7 +19,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2012 Zoltan Herczeg +Copyright(c) 2010-2013 Zoltan Herczeg All rights reserved. @@ -30,7 +30,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2012 Zoltan Herczeg +Copyright(c) 2009-2013 Zoltan Herczeg All rights reserved. diff --git a/ext/pcre/pcrelib/ChangeLog b/ext/pcre/pcrelib/ChangeLog index ed164fed0..1f1e86003 100644 --- a/ext/pcre/pcrelib/ChangeLog +++ b/ext/pcre/pcrelib/ChangeLog @@ -1,6 +1,381 @@ ChangeLog for PCRE ------------------ +Version 8.34 15-December-2013 +----------------------------- + +1. Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT + executable memory. Patch inspired by Carsten Klein. + +2. ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although + this macro is never tested and has no effect, because the work to support + coverage involves only compiling and linking options and special targets in + the Makefile. The comment in config.h implied that defining the macro would + enable coverage support, which is totally false. There was also support for + setting this macro in the CMake files (my fault, I just copied it from + configure). SUPPORT_GCOV has now been removed. + +3. Make a small performance improvement in strlen16() and strlen32() in + pcretest. + +4. Change 36 for 8.33 left some unreachable statements in pcre_exec.c, + detected by the Solaris compiler (gcc doesn't seem to be able to diagnose + these cases). There was also one in pcretest.c. + +5. Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c. + +6. In UTF mode, the code for checking whether a group could match an empty + string (which is used for indefinitely repeated groups to allow for + breaking an infinite loop) was broken when the group contained a repeated + negated single-character class with a character that occupied more than one + data item and had a minimum repetition of zero (for example, [^\x{100}]* in + UTF-8 mode). The effect was undefined: the group might or might not be + deemed as matching an empty string, or the program might have crashed. + +7. The code for checking whether a group could match an empty string was not + recognizing that \h, \H, \v, \V, and \R must match a character. + +8. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match + an empty string. If it can, pcretest shows this in its information output. + +9. Fixed two related bugs that applied to Unicode extended grapheme clusters + that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when + matched by pcre_exec() without using JIT: + + (a) If the rest of the pattern did not match after a maximal run of + grapheme clusters, the code for backing up to try with fewer of them + did not always back up over a full grapheme when characters that do not + have the modifier quality were involved, e.g. Hangul syllables. + + (b) If the match point in a subject started with modifier character, and + there was no match, the code could incorrectly back up beyond the match + point, and potentially beyond the first character in the subject, + leading to a segfault or an incorrect match result. + +10. A conditional group with an assertion condition could lead to PCRE + recording an incorrect first data item for a match if no other first data + item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a + first data item, and therefore matched "ca" after "c" instead of at the + start. + +11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a + bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. + +12. The source of pcregrep now includes z/OS-specific code so that it can be + compiled for z/OS as part of the special z/OS distribution. + +13. Added the -T and -TM options to pcretest. + +14. The code in pcre_compile.c for creating the table of named capturing groups + has been refactored. Instead of creating the table dynamically during the + actual compiling pass, the information is remembered during the pre-compile + pass (on the stack unless there are more than 20 named groups, in which + case malloc() is used) and the whole table is created before the actual + compile happens. This has simplified the code (it is now nearly 150 lines + shorter) and prepared the way for better handling of references to groups + with duplicate names. + +15. A back reference to a named subpattern when there is more than one of the + same name now checks them in the order in which they appear in the pattern. + The first one that is set is used for the reference. Previously only the + first one was inspected. This change makes PCRE more compatible with Perl. + +16. Unicode character properties were updated from Unicode 6.3.0. + +17. The compile-time code for auto-possessification has been refactored, based + on a patch by Zoltan Herczeg. It now happens after instead of during + compilation. The code is cleaner, and more cases are handled. The option + PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O + options in pcretest are provided to set it. It can also be set by + (*NO_AUTO_POSSESS) at the start of a pattern. + +18. The character VT has been added to the default ("C" locale) set of + characters that match \s and are generally treated as white space, + following this same change in Perl 5.18. There is now no difference between + "Perl space" and "POSIX space". Whether VT is treated as white space in + other locales depends on the locale. + +19. The code for checking named groups as conditions, either for being set or + for being recursed, has been refactored (this is related to 14 and 15 + above). Processing unduplicated named groups should now be as fast at + numerical groups, and processing duplicated groups should be faster than + before. + +20. Two patches to the CMake build system, by Alexander Barkov: + + (1) Replace the "source" command by "." in CMakeLists.txt because + "source" is a bash-ism. + + (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in; + without these the CMake build does not work on Solaris. + +21. Perl has changed its handling of \8 and \9. If there is no previously + encountered capturing group of those numbers, they are treated as the + literal characters 8 and 9 instead of a binary zero followed by the + literals. PCRE now does the same. + +22. Following Perl, added \o{} to specify codepoints in octal, making it + possible to specify values greater than 0777 and also making them + unambiguous. + +23. Perl now gives an error for missing closing braces after \x{... instead of + treating the string as literal. PCRE now does the same. + +24. RunTest used to grumble if an inappropriate test was selected explicitly, + but just skip it when running all tests. This make it awkward to run ranges + of tests when one of them was inappropriate. Now it just skips any + inappropriate tests, as it always did when running all tests. + +25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained + character types such as \d or \w, too many callouts were inserted, and the + data that they returned was rubbish. + +26. In UCP mode, \s was not matching two of the characters that Perl matches, + namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they + were matched by \h. The code has now been refactored so that the lists of + the horizontal and vertical whitespace characters used for \h and \v (which + are defined only in one place) are now also used for \s. + +27. Add JIT support for the 64 bit TileGX architecture. + Patch by Jiong Wang (Tilera Corporation). + +28. Possessive quantifiers for classes (both explicit and automatically + generated) now use special opcodes instead of wrapping in ONCE brackets. + +29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier + (because it's meaningless), this was not happening when PCRE_CASELESS was + set. Not wrong, but inefficient. + +30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode + properties for \w, \d, etc) is present in a test regex. Otherwise if the + test contains no characters greater than 255, Perl doesn't realise it + should be using Unicode semantics. + +31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and + [:punct:] when PCRE_UCP is set so as to include the same characters as Perl + does in Unicode mode. + +32. Added the "forbid" facility to pcretest so that putting tests into the + wrong test files can sometimes be quickly detected. + +33. There is now a limit (default 250) on the depth of nesting of parentheses. + This limit is imposed to control the amount of system stack used at compile + time. It can be changed at build time by --with-parens-nest-limit=xxx or + the equivalent in CMake. + +34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time + errors. Perl warns for these when in warning mode, but PCRE has no facility + for giving warnings. + +35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does. + However, this was not working for (?!) because it is optimized to (*FAIL), + for which PCRE does not allow quantifiers. The optimization is now disabled + when a quantifier follows (?!). I can't see any use for this, but it makes + things uniform. + +36. Perl no longer allows group names to start with digits, so I have made this + change also in PCRE. It simplifies the code a bit. + +37. In extended mode, Perl ignores spaces before a + that indicates a + possessive quantifier. PCRE allowed a space before the quantifier, but not + before the possessive +. It now does. + +38. The use of \K (reset reported match start) within a repeated possessive + group such as (a\Kb)*+ was not working. + +40. Document that the same character tables must be used at compile time and + run time, and that the facility to pass tables to pcre_exec() and + pcre_dfa_exec() is for use only with saved/restored patterns. + +41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new + features for Builds with MSVC: + + 1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW + builds). The .rc files can be used to set FileDescription and many other + attributes. + + 2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files. + This allows higher-level build scripts which want .pdb files to avoid + hard-coding the exact files needed." + +42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to + mean "start of word" and "end of word", respectively, as a transition aid. + +43. A minimizing repeat of a class containing codepoints greater than 255 in + non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was + compiled to use the heap for recursion. + +44. Got rid of some compiler warnings for unused variables when UTF but not UCP + is configured. + + +Version 8.33 28-May-2013 +------------------------ + +1. Added 'U' to some constants that are compared to unsigned integers, to + avoid compiler signed/unsigned warnings. Added (int) casts to unsigned + variables that are added to signed variables, to ensure the result is + signed and can be negated. + +2. Applied patch by Daniel Richard G for quashing MSVC warnings to the + CMake config files. + +3. Revise the creation of config.h.generic so that all boolean macros are + #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes + overriding via -D on the command line possible. + +4. Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar + to unsigned int is reported to make a quite noticeable speed difference in + a specific Windows environment. Testing on Linux did also appear to show + some benefit (and it is clearly not harmful). Also fixed the definition of + Xop which should be unsigned. + +5. Related to (4), changing the definition of the intermediate variable cc + in repeated character loops from pcre_uchar to pcre_uint32 also gave speed + improvements. + +6. Fix forward search in JIT when link size is 3 or greater. Also removed some + unnecessary spaces. + +7. Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12 + and later. + +8. Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only. + +9. Optimizing fast_forward_start_bits in JIT. + +10. Adding support for callouts in JIT, and fixing some issues revealed + during this work. Namely: + + (a) Unoptimized capturing brackets incorrectly reset on backtrack. + + (b) Minimum length was not checked before the matching is started. + +11. The value of capture_last that is passed to callouts was incorrect in some + cases when there was a capture on one path that was subsequently abandoned + after a backtrack. Also, the capture_last value is now reset after a + recursion, since all captures are also reset in this case. + +12. The interpreter no longer returns the "too many substrings" error in the + case when an overflowing capture is in a branch that is subsequently + abandoned after a backtrack. + +13. In the pathological case when an offset vector of size 2 is used, pcretest + now prints out the matched string after a yield of 0 or 1. + +14. Inlining subpatterns in recursions, when certain conditions are fulfilled. + Only supported by the JIT compiler at the moment. + +15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez. + +16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the + offset of the starting point of the matching process, provided the offsets + vector is large enough. + +17. The \A escape now records a lookbehind value of 1, though its execution + does not actually inspect the previous character. This is to ensure that, + in partial multi-segment matching, at least one character from the old + segment is retained when a new segment is processed. Otherwise, if there + are no lookbehinds in the pattern, \A might match incorrectly at the start + of a new segment. + +18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations. + +19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this + gives some modest performance improvement in 8-bit mode. + +20. Added the PCRE-specific property \p{Xuc} for matching characters that can + be expressed in certain programming languages using Universal Character + Names. + +21. Unicode validation has been updated in the light of Unicode Corrigendum #9, + which points out that "non characters" are not "characters that may not + appear in Unicode strings" but rather "characters that are reserved for + internal use and have only local meaning". + +22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and + there was a conditional group that depended on an assertion, if the + assertion was false, the callout that immediately followed the alternation + in the condition was skipped when pcre_exec() was used for matching. + +23. Allow an explicit callout to be inserted before an assertion that is the + condition for a conditional group, for compatibility with automatic + callouts, which always insert a callout at this point. + +24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also + confines (*SKIP) and (*PRUNE) in the same way, and this has now been done. + +25. (*PRUNE) is now supported by the JIT compiler. + +26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa. + +27. Fix the case where there are two or more SKIPs with arguments that may be + ignored. + +28. (*SKIP) is now supported by the JIT compiler. + +29. (*THEN) is now supported by the JIT compiler. + +30. Update RunTest with additional test selector options. + +31. The way PCRE handles backtracking verbs has been changed in two ways. + + (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override + SKIP. Now, PCRE acts on whichever backtracking verb is reached first by + backtracking. In some cases this makes it more Perl-compatible, but Perl's + rather obscure rules do not always do the same thing. + + (2) Previously, backtracking verbs were confined within assertions. This is + no longer the case for positive assertions, except for (*ACCEPT). Again, + this sometimes improves Perl compatibility, and sometimes does not. + +32. A number of tests that were in test 2 because Perl did things differently + have been moved to test 1, because either Perl or PCRE has changed, and + these tests are now compatible. + +32. Backtracking control verbs are now handled in the same way in JIT and + interpreter. + +33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that + contained a forward subroutine reference caused a compile error. + +34. Auto-detect and optimize limited repetitions in JIT. + +35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular, + blocking (*UTF) etc. + +36. In the interpreter, maximizing pattern repetitions for characters and + character types now use tail recursion, which reduces stack usage. + +37. The value of the max lookbehind was not correctly preserved if a compiled + and saved regex was reloaded on a host of different endianness. + +38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension + of the compiled pattern block, expand the flags field from 16 to 32 bits + because it was almost full. + +39. Try madvise first before posix_madvise. + +40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines + with a pattern such as ^$. It has taken 4 years for anybody to notice! The + original change locked out all matches of empty strings. This has been + changed so that one match of an empty string per line is recognized. + Subsequent searches on the same line (for colouring or for --only-matching, + for example) do not recognize empty strings. + +41. Applied a user patch to fix a number of spelling mistakes in comments. + +42. Data lines longer than 65536 caused pcretest to crash. + +43. Clarified the data type for length and startoffset arguments for pcre_exec + and pcre_dfa_exec in the function-specific man pages, where they were + explicitly stated to be in bytes, never having been updated. I also added + some clarification to the pcreapi man page. + +44. A call to pcre_dfa_exec() with an output vector size less than 2 caused + a segmentation fault. + + Version 8.32 30-November-2012 ----------------------------- @@ -1508,7 +1883,8 @@ Version 7.9 11-Apr-09 7. A pattern that could match an empty string could cause pcregrep to loop; it doesn't make sense to accept an empty string match in pcregrep, so I have locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this - seems to be how GNU grep behaves. + seems to be how GNU grep behaves. [But see later change 40 for release + 8.33.] 8. The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at start or after a newline", because the conditional assertion was not being diff --git a/ext/pcre/pcrelib/HACKING b/ext/pcre/pcrelib/HACKING index a90ddf879..691b7a14e 100644 --- a/ext/pcre/pcrelib/HACKING +++ b/ext/pcre/pcrelib/HACKING @@ -54,12 +54,12 @@ Support for 16-bit and 32-bit data strings From release 8.30, PCRE supports 16-bit as well as 8-bit data strings; and from release 8.32, PCRE supports 32-bit data strings. The library can be compiled -in any combination of 8-bit, 16-bit or 32-bit modes, creating different -libraries. In the description that follows, the word "short" is -used for a 16-bit data quantity, and the word "unit" is used for a quantity -that is a byte in 8-bit mode, a short in 16-bit mode and a 32-bit unsigned -integer in 32-bit mode. However, so as not to over-complicate the text, the -names of PCRE functions are given in 8-bit form only. +in any combination of 8-bit, 16-bit or 32-bit modes, creating up to three +different libraries. In the description that follows, the word "short" is used +for a 16-bit data quantity, and the word "unit" is used for a quantity that is +a byte in 8-bit mode, a short in 16-bit mode and a 32-bit word in 32-bit mode. +However, so as not to over-complicate the text, the names of PCRE functions are +given in 8-bit form only. Computing the memory requirement: how it was @@ -94,6 +94,11 @@ runs more slowly than before (30% or more, depending on the pattern) because it is doing a full analysis of the pattern. My hope was that this would not be a big issue, and in the event, nobody has commented on it. +At release 8.34, a limit on the nesting depth of parentheses was re-introduced +(default 250, settable at build time) so as to put a limit on the amount of +system stack used by pcre_compile(). This is a safety feature for environments +with small stacks where the patterns are provided by users. + Traditional matching function ----------------------------- @@ -120,29 +125,30 @@ facilities are available, and those that are do not always work in quite the same way. See the user documentation for details. The algorithm that is used for pcre_dfa_exec() is not a traditional FSM, -because it may have a number of states active at one time. More work would be -needed at compile time to produce a traditional FSM where only one state is -ever active at once. I believe some other regex matchers work this way. +because it may have a number of states active at one time. More work would be +needed at compile time to produce a traditional FSM where only one state is +ever active at once. I believe some other regex matchers work this way. JIT +support is not available for this kind of matching. Changeable options ------------------ -The /i, /m, or /s options (PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL) may -change in the middle of patterns. From PCRE 8.13, their processing is handled -entirely at compile time by generating different opcodes for the different -settings. The runtime functions do not need to keep track of an options state -any more. +The /i, /m, or /s options (PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and some +others) may change in the middle of patterns. From PCRE 8.13, their processing +is handled entirely at compile time by generating different opcodes for the +different settings. The runtime functions do not need to keep track of an +options state any more. Format of compiled patterns --------------------------- -The compiled form of a pattern is a vector of units (bytes in 8-bit mode, or -shorts in 16-bit mode, 32-bit unsigned integers in 32-bit mode), containing -items of variable length. The first unit in an item contains an opcode, and -the length of the item is either implicit in the opcode or contained in the -data that follows it. +The compiled form of a pattern is a vector of unsigned units (bytes in 8-bit +mode, shorts in 16-bit mode, 32-bit words in 32-bit mode), containing items of +variable length. The first unit in an item contains an opcode, and the length +of the item is either implicit in the opcode or contained in the data that +follows it. In many cases listed below, LINK_SIZE data values are specified for offsets within the compiled pattern. LINK_SIZE always specifies a number of bytes. The @@ -151,8 +157,10 @@ default value for LINK_SIZE is 2, but PCRE can be compiled to use 3-byte or LINK_SIZE values are available only in 8-bit mode.) Specifing a LINK_SIZE larger than 2 is necessary only when patterns whose compiled length is greater than 64K are going to be processed. In this description, we assume the "normal" -compilation options. Data values that are counts (e.g. for quantifiers) are -always just two bytes long (one short in 16-bit mode). +compilation options. Data values that are counts (e.g. quantifiers) are two +bytes long in 8-bit mode (most significant byte first), or one unit in 16-bit +and 32-bit modes. + Opcodes with no following data ------------------------------ @@ -162,7 +170,7 @@ These items are all just one unit long OP_END end of pattern OP_ANY match any one character other than newline OP_ALLANY match any one character, including newline - OP_ANYBYTE match any single byte, even in UTF-8 mode + OP_ANYBYTE match any single unit, even in UTF-8/16 mode OP_SOD match start of data: \A OP_SOM, start of match (subject + offset): \G OP_SET_SOM, set start of match (\K) @@ -180,28 +188,33 @@ These items are all just one unit long OP_VSPACE \v OP_NOT_WORDCHAR \W OP_WORDCHAR \w - OP_EODN match end of data or \n at end: \Z + OP_EODN match end of data or newline at end: \Z OP_EOD match end of data: \z OP_DOLL $ (end of data, or before final newline) OP_DOLLM $ multiline mode (end of data or before newline) - OP_EXTUNI match an extended Unicode character + OP_EXTUNI match an extended Unicode grapheme cluster OP_ANYNL match any Unicode newline sequence + OP_ASSERT_ACCEPT ) OP_ACCEPT ) These are Perl 5.10's "backtracking control OP_COMMIT ) verbs". If OP_ACCEPT is inside capturing OP_FAIL ) parentheses, it may be preceded by one or more - OP_PRUNE ) OP_CLOSE, followed by a 2-byte number, - OP_SKIP ) indicating which parentheses must be closed. + OP_PRUNE ) OP_CLOSE, each followed by a count that + OP_SKIP ) indicates which parentheses must be closed. + OP_THEN ) + +OP_ASSERT_ACCEPT is used when (*ACCEPT) is encountered within an assertion. +This ends the assertion, not the entire pattern match. -Backtracking control verbs with (optional) data ------------------------------------------------ +Backtracking control verbs with optional data +--------------------------------------------- (*THEN) without an argument generates the opcode OP_THEN and no following data. OP_MARK is followed by the mark name, preceded by a one-unit length, and followed by a binary zero. For (*PRUNE), (*SKIP), and (*THEN) with arguments, the opcodes OP_PRUNE_ARG, OP_SKIP_ARG, and OP_THEN_ARG are used, with the name -following in the same format. +following in the same format as OP_MARK. Matching literal characters @@ -212,6 +225,10 @@ casefully. For caseless matching, OP_CHARI is used. In UTF-8 or UTF-16 modes, the character may be more than one unit long. In UTF-32 mode, characters are always exactly one unit long. +If there is only one character in a character class, OP_CHAR or OP_CHARI is +used for a positive class, and OP_NOT or OP_NOTI for a negative one (that is, +for something like [^a]). + Repeating single characters --------------------------- @@ -232,10 +249,9 @@ following opcodes, which come in caseful and caseless versions: Each opcode is followed by the character that is to be repeated. In ASCII mode, these are two-unit items; in UTF-8 or UTF-16 modes, the length is variable; in -UTF-32 mode these are one-unit items. -Those with "MIN" in their names are the minimizing versions. Those with "POS" -in their names are possessive versions. Other repeats make use of these -opcodes: +UTF-32 mode these are one-unit items. Those with "MIN" in their names are the +minimizing versions. Those with "POS" in their names are possessive versions. +Other repeats make use of these opcodes: Caseful Caseless OP_UPTO OP_UPTOI @@ -243,10 +259,15 @@ opcodes: OP_POSUPTO OP_POSUPTOI OP_EXACT OP_EXACTI -Each of these is followed by a two-byte (one short) count (most significant -byte first in 8-bit mode) and then the repeated character. OP_UPTO matches from -0 to the given number. A repeat with a non-zero minimum and a fixed maximum is -coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or OPT_POSUPTO). +Each of these is followed by a count and then the repeated character. OP_UPTO +matches from 0 to the given number. A repeat with a non-zero minimum and a +fixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or +OPT_POSUPTO). + +Another set of matching repeating opcodes (called OP_NOTSTAR, OP_NOTSTARI, +etc.) are used for repeated, negated, single-character classes such as [^a]*. +The normal single-character opcodes (OP_STAR, etc.) are used for repeated +positive single-character classes. Repeating character types @@ -277,7 +298,10 @@ Match by Unicode property OP_PROP and OP_NOTPROP are used for positive and negative matches of a character by testing its Unicode property (the \p and \P escape sequences). Each is followed by two units that encode the desired property as a type and a -value. +value. The types are a set of #defines of the form PT_xxx, and the values are +enumerations of the form ucp_xx, defined in the ucp.h source file. The value is +relevant only for PT_GC (General Category), PT_PC (Particular Category), and +PT_SC (Script). Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by three units: OP_PROP or OP_NOTPROP, and then the desired property type and @@ -287,67 +311,88 @@ value. Character classes ----------------- -If there is only one character in the class, OP_CHAR or OP_CHARI is used for a +If there is only one character in a class, OP_CHAR or OP_CHARI is used for a positive class, and OP_NOT or OP_NOTI for a negative one (that is, for something like [^a]). -Another set of 13 repeating opcodes (called OP_NOTSTAR etc.) are used for -repeated, negated, single-character classes. The normal single-character -opcodes (OP_STAR, etc.) are used for repeated positive single-character -classes. +A set of repeating opcodes (called OP_NOTSTAR etc.) are used for repeated, +negated, single-character classes. The normal single-character opcodes +(OP_STAR, etc.) are used for repeated positive single-character classes. -When there is more than one character in a class and all the characters are +When there is more than one character in a class, and all the code points are less than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a -negative one. In either case, the opcode is followed by a 32-byte (16-short) -bit map containing a 1 bit for every character that is acceptable. The bits are -counted from the least significant end of each unit. In caseless mode, bits for -both cases are set. +negative one. In either case, the opcode is followed by a 32-byte (16-short, +8-word) bit map containing a 1 bit for every character that is acceptable. The +bits are counted from the least significant end of each unit. In caseless mode, +bits for both cases are set. + +The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8/16/32 +mode, subject characters with values greater than 255 can be handled correctly. +For OP_CLASS they do not match, whereas for OP_NCLASS they do. + +For classes containing characters with values greater than 255 or that contain +\p or \P, OP_XCLASS is used. It optionally uses a bit map if any code points +are less than 256, followed by a list of pairs (for a range) and single +characters. In caseless mode, both cases are explicitly listed. -The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8/16/32 mode, -subject characters with values greater than 255 can be handled correctly. For -OP_CLASS they do not match, whereas for OP_NCLASS they do. +OP_XCLASS is followed by a unit containing flag bits: XCL_NOT indicates that +this is a negative class, and XCL_MAP indicates that a bit map is present. +There follows the bit map, if XCL_MAP is set, and then a sequence of items +coded as follows: -For classes containing characters with values greater than 255, OP_XCLASS is -used. It optionally uses a bit map (if any characters lie within it), followed -by a list of pairs (for a range) and single characters. In caseless mode, both -cases are explicitly listed. There is a flag character than indicates whether -it is a positive or a negative class. + XCL_END marks the end of the list + XCL_SINGLE one character follows + XCL_RANGE two characters follow + XCL_PROP a Unicode property (type, value) follows + XCL_NOTPROP a Unicode property (type, value) follows + +If a range starts with a code point less than 256 and ends with one greater +than 256, an XCL_RANGE item is used, without setting any bits in the bit map. +This means that if no other items in the class set bits in the map, a map is +not needed. Back references --------------- -OP_REF (caseful) or OP_REFI (caseless) is followed by two bytes (one short) -containing the reference number. +OP_REF (caseful) or OP_REFI (caseless) is followed by a count containing the +reference number if the reference is to a unique capturing group (either by +number or by name). When named groups are used, there may be more than one +group with the same name. In this case, a reference by name generates OP_DNREF +or OP_DNREFI. These are followed by two counts: the index (not the byte offset) +in the group name table of the first entry for the requred name, followed by +the number of groups with the same name. Repeating character classes and back references ----------------------------------------------- Single-character classes are handled specially (see above). This section -applies to OP_CLASS and OP_REF[I]. In both cases, the repeat information -follows the base item. The matching code looks at the following opcode to see -if it is one of +applies to other classes and also to back references. In both cases, the repeat +information follows the base item. The matching code looks at the following +opcode to see if it is one of OP_CRSTAR OP_CRMINSTAR + OP_CRPOSSTAR OP_CRPLUS OP_CRMINPLUS + OP_CRPOSPLUS OP_CRQUERY OP_CRMINQUERY + OP_CRPOSQUERY OP_CRRANGE OP_CRMINRANGE + OP_CRPOSRANGE -All but the last two are just single-unit items. The others are followed by -four bytes (two shorts) of data, comprising the minimum and maximum repeat -counts. There are no special possessive opcodes for these repeats; a possessive -repeat is compiled into an atomic group. +All but the last three are single-unit items, with no data. The others are +followed by the minimum and maximum repeat counts. Brackets and alternation ------------------------ -A pair of non-capturing (round) brackets is wrapped round each expression at +A pair of non-capturing round brackets is wrapped round each expression at compile time, so alternation always happens in the context of brackets. [Note for North Americans: "bracket" to some English speakers, including @@ -364,20 +409,20 @@ A bracket opcode is followed by LINK_SIZE bytes which give the offset to the next alternative OP_ALT or, if there aren't any branches, to the matching OP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to the next one, or to the OP_KET opcode. For capturing brackets, the bracket -number immediately follows the offset, always as a 2-byte (one short) item. +number is a count that immediately follows the offset. -OP_KET is used for subpatterns that do not repeat indefinitely, and -OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or -maximally respectively (see below for possessive repetitions). All three are -followed by LINK_SIZE bytes giving (as a positive number) the offset back to -the matching bracket opcode. +OP_KET is used for subpatterns that do not repeat indefinitely, and OP_KETRMIN +and OP_KETRMAX are used for indefinite repetitions, minimally or maximally +respectively (see below for possessive repetitions). All three are followed by +LINK_SIZE bytes giving (as a positive number) the offset back to the matching +bracket opcode. If a subpattern is quantified such that it is permitted to match zero times, it is preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are single-unit opcodes that tell the matcher that skipping the following subpattern entirely is a valid branch. In the case of the first two, not skipping the pattern is also valid (greedy and non-greedy). The third is used -when a pattern has the quantifier {0,0}. It cannot be entirely discarded, +when a pattern has the quantifier {0,0}. It cannot be entirely discarded, because it may be called as a subroutine from elsewhere in the regex. A subpattern with an indefinite maximum repetition is replicated in the @@ -397,6 +442,7 @@ final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher that it needs to check for matching an empty string when it hits OP_KETRMIN or OP_KETRMAX, and if so, to break the loop. + Possessive brackets ------------------- @@ -407,26 +453,34 @@ of OP_SCBRA. The end of such a group is marked by OP_KETRPOS. If the minimum repetition is zero, the group is preceded by OP_BRAPOSZERO. -Assertions ----------- +Once-only (atomic) groups +------------------------- -Forward assertions are just like other subpatterns, but starting with one of -the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes -OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion -is OP_REVERSE, followed by a two byte (one short) count of the number of -characters to move back the pointer in the subject string. In ASCII mode, the -count is a number of units, but in UTF-8/16 mode each character may occupy more -than one unit; in UTF-32 mode each character occupies exactly one unit. -A separate count is present in each alternative of a lookbehind -assertion, allowing them to have different fixed lengths. +These are just like other subpatterns, but they start with the opcode +OP_ONCE or OP_ONCE_NC. The former is used when there are no capturing brackets +within the atomic group; the latter when there are. The distinction is needed +for when there is a backtrack to before the group - any captures within the +group must be reset, so it is necessary to retain backtracking points inside +the group even after it is complete in order to do this. When there are no +captures in an atomic group, all the backtracking can be discarded when it is +complete. This is more efficient, and also uses less stack. +The check for matching an empty string in an unbounded repeat is handled +entirely at runtime, so there are just these two opcodes for atomic groups. -Once-only (atomic) subpatterns ------------------------------- -These are also just like other subpatterns, but they start with the opcode -OP_ONCE. The check for matching an empty string in an unbounded repeat is -handled entirely at runtime, so there is just this one opcode. +Assertions +---------- + +Forward assertions are also just like other subpatterns, but starting with one +of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes +OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion +is OP_REVERSE, followed by a count of the number of characters to move back the +pointer in the subject string. In ASCII mode, the count is a number of units, +but in UTF-8/16 mode each character may occupy more than one unit; in UTF-32 +mode each character occupies exactly one unit. A separate count is present in +each alternative of a lookbehind assertion, allowing them to have different +fixed lengths. Conditional subpatterns @@ -435,28 +489,29 @@ Conditional subpatterns These are like other subpatterns, but they start with the opcode OP_COND, or OP_SCOND for one that might match an empty string in an unbounded repeat. If the condition is a back reference, this is stored at the start of the -subpattern using the opcode OP_CREF followed by two bytes (one short) -containing the reference number. OP_NCREF is used instead if the reference was -generated by name (so that the runtime code knows to check for duplicate -names). +subpattern using the opcode OP_CREF followed by a count containing the +reference number, provided that the reference is to a unique capturing group. +If the reference was by name and there is more than one group with that name, +OP_DNCREF is used instead. It is followed by two counts: the index in the group +names table, and the number of groups with the same name. If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of group x" (coded as "(?(Rx)"), the group number is stored at the start of the -subpattern using the opcode OP_RREF or OP_NRREF (cf OP_NCREF), and a value of -zero for "the whole pattern". For a DEFINE condition, just the single unit -OP_DEF is used (it has no associated data). Otherwise, a conditional subpattern -always starts with one of the assertions. +subpattern using the opcode OP_RREF (with a value of zero for "the whole +pattern") or OP_DNRREF (with data as for OP_DNCREF). For a DEFINE condition, +just the single unit OP_DEF is used (it has no associated data). Otherwise, a +conditional subpattern always starts with one of the assertions. Recursion --------- Recursion either matches the current regex, or some subexpression. The opcode -OP_RECURSE is followed by an value which is the offset to the starting bracket -from the start of the whole pattern. From release 6.5, OP_RECURSE is -automatically wrapped inside OP_ONCE brackets (because otherwise some patterns -broke it). OP_RECURSE is also used for "subroutine" calls, even though they -are not strictly a recursion. +OP_RECURSE is followed by aLINK_SIZE value that is the offset to the starting +bracket from the start of the whole pattern. From release 6.5, OP_RECURSE is +automatically wrapped inside OP_ONCE brackets, because otherwise some patterns +broke it. OP_RECURSE is also used for "subroutine" calls, even though they are +not strictly a recursion. Callout @@ -464,10 +519,10 @@ Callout OP_CALLOUT is followed by one unit of data that holds a callout number in the range 0 to 254 for manual callouts, or 255 for an automatic callout. In both -cases there follows a two-byte (one short) value giving the offset in the -pattern to the start of the following item, and another two-byte (one short) -item giving the length of the next item. - +cases there follows a count giving the offset in the pattern string to the +start of the following item, and another count giving the length of this item. +These values make is possible for pcretest to output useful tracing information +using automatic callouts. Philip Hazel -February 2012 +November 2013 diff --git a/ext/pcre/pcrelib/LICENCE b/ext/pcre/pcrelib/LICENCE index 5ce31a828..3aff6a62c 100644 --- a/ext/pcre/pcrelib/LICENCE +++ b/ext/pcre/pcrelib/LICENCE @@ -24,7 +24,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2012 University of Cambridge +Copyright (c) 1997-2013 University of Cambridge All rights reserved. @@ -35,7 +35,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2012 Zoltan Herczeg +Copyright(c) 2010-2013 Zoltan Herczeg All rights reserved. @@ -46,7 +46,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2012 Zoltan Herczeg +Copyright(c) 2009-2013 Zoltan Herczeg All rights reserved. diff --git a/ext/pcre/pcrelib/NEWS b/ext/pcre/pcrelib/NEWS index 082139f22..5f52f1534 100644 --- a/ext/pcre/pcrelib/NEWS +++ b/ext/pcre/pcrelib/NEWS @@ -1,6 +1,77 @@ News about PCRE releases ------------------------ +Release 8.34 15-December-2013 +----------------------------- + +As well as fixing the inevitable bugs, performance has been improved by +refactoring and extending the amount of "auto-possessification" that PCRE does. +Other notable changes: + +. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match + an empty string. If it can, pcretest shows this in its information output. + +. A back reference to a named subpattern when there is more than one of the + same name now checks them in the order in which they appear in the pattern. + The first one that is set is used for the reference. Previously only the + first one was inspected. This change makes PCRE more compatible with Perl. + +. Unicode character properties were updated from Unicode 6.3.0. + +. The character VT has been added to the set of characters that match \s and + are generally treated as white space, following this same change in Perl + 5.18. There is now no difference between "Perl space" and "POSIX space". + +. Perl has changed its handling of \8 and \9. If there is no previously + encountered capturing group of those numbers, they are treated as the + literal characters 8 and 9 instead of a binary zero followed by the + literals. PCRE now does the same. + +. Following Perl, added \o{} to specify codepoints in octal, making it + possible to specify values greater than 0777 and also making them + unambiguous. + +. In UCP mode, \s was not matching two of the characters that Perl matches, + namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they + were matched by \h. + +. Add JIT support for the 64 bit TileGX architecture. + +. Upgraded the handling of the POSIX classes [:graph:], [:print:], and + [:punct:] when PCRE_UCP is set so as to include the same characters as Perl + does in Unicode mode. + +. Perl no longer allows group names to start with digits, so I have made this + change also in PCRE. + +. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to + mean "start of word" and "end of word", respectively, as a transition aid. + + +Release 8.33 28-May-2013 +-------------------------- + +A number of bugs are fixed, and some performance improvements have been made. +There are also some new features, of which these are the most important: + +. The behaviour of the backtracking verbs has been rationalized and + documented in more detail. + +. JIT now supports callouts and all of the backtracking verbs. + +. Unicode validation has been updated in the light of Unicode Corrigendum #9, + which points out that "non characters" are not "characters that may not + appear in Unicode strings" but rather "characters that are reserved for + internal use and have only local meaning". + +. (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the + creator of a pattern can specify lower (but not higher) limits for the + matching process. + +. The PCRE_NEVER_UTF option is available to prevent pattern-writers from using + the (*UTF) feature, as this could be a security issue. + + Release 8.32 30-November-2012 ----------------------------- diff --git a/ext/pcre/pcrelib/README b/ext/pcre/pcrelib/README index a2c3d9b31..51197df72 100644 --- a/ext/pcre/pcrelib/README +++ b/ext/pcre/pcrelib/README @@ -9,8 +9,10 @@ from: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip There is a mailing list for discussion about the development of PCRE at +pcre-dev@exim.org. You can access the archives and subscribe or manage your +subscription here: - pcre-dev@exim.org + https://lists.exim.org/mailman/listinfo/pcre-dev Please read the NEWS file if you are upgrading from a previous release. The contents of this README file are: @@ -25,6 +27,8 @@ The contents of this README file are: Shared libraries Cross-compiling using autotools Using HP's ANSI C++ compiler (aCC) + Compiling in Tru64 using native compilers + Using Sun's compilers for Solaris Using PCRE from MySQL Making new tarballs Testing PCRE @@ -35,10 +39,10 @@ The contents of this README file are: The PCRE APIs ------------- -PCRE is written in C, and it has its own API. There are three sets of functions, -one for the 8-bit library, which processes strings of bytes, one for the -16-bit library, which processes strings of 16-bit values, and one for the 32-bit -library, which processes strings of 32-bit values. The distribution also +PCRE is written in C, and it has its own API. There are three sets of +functions, one for the 8-bit library, which processes strings of bytes, one for +the 16-bit library, which processes strings of 16-bit values, and one for the +32-bit library, which processes strings of 32-bit values. The distribution also includes a set of C++ wrapper functions (see the pcrecpp man page for details), courtesy of Google Inc., which can be used to call the 8-bit PCRE library from C++. @@ -110,6 +114,11 @@ contributions provided support for compiling PCRE on various flavours of Windows (I myself do not use Windows). Nowadays there is more Windows support in the standard distribution, so these contibutions have been archived. +A PCRE user maintains downloadable Windows binaries of the pcregrep and +pcretest programs here: + + http://www.rexegg.com/pcregrep-pcretest.html + Building PCRE on non-Unix-like systems -------------------------------------- @@ -260,9 +269,17 @@ library. They are also documented in the pcrebuild man page. on the "configure" command. -. PCRE has a counter that can be set to limit the amount of resources it uses. - If the limit is exceeded during a match, the match fails. The default is ten - million. You can change the default by setting, for example, +. PCRE has a counter that limits the depth of nesting of parentheses in a + pattern. This limits the amount of system stack that a pattern uses when it + is compiled. The default is 250, but you can change it by setting, for + example, + + --with-parens-nest-limit=500 + +. PCRE has a counter that can be set to limit the amount of resources it uses + when matching a pattern. If the limit is exceeded during a match, the match + fails. The default is ten million. You can change the default by setting, for + example, --with-match-limit=500000 @@ -342,7 +359,8 @@ library. They are also documented in the pcrebuild man page. report is generated by running "make coverage". If ccache is installed on your system, it must be disabled when building PCRE for coverage reporting. You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. + running "make" to build PCRE. There is more information about coverage + reporting in the "pcrebuild" documentation. . The pcregrep program currently supports only 8-bit data files, and so requires the 8-bit PCRE library. It is possible to compile pcregrep to use @@ -575,6 +593,27 @@ running the "configure" script: CXXLDFLAGS="-lstd_v2 -lCsup_v2" +Compiling in Tru64 using native compilers +----------------------------------------- + +The following error may occur when compiling with native compilers in the Tru64 +operating system: + + CXX libpcrecpp_la-pcrecpp.lo +cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error + directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to + override default - see section 7.1.2 of the C++ Using Guide" +#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default +- see section 7.1.2 of the C++ Using Guide" + +This may be followed by other errors, complaining that 'namespace "std" has no +member'. The solution to this is to add the line + +#define __USE_STD_IOSTREAM 1 + +to the config.h file. + + Using Sun's compilers for Solaris --------------------------------- @@ -624,27 +663,40 @@ NON-AUTOTOOLS-BUILD. The RunTest script runs the pcretest test program (which is documented in its own man page) on each of the relevant testinput files in the testdata directory, and compares the output with the contents of the corresponding -testoutput files. Some tests are relevant only when certain build-time options -were selected. For example, the tests for UTF-8/16/32 support are run only if ---enable-utf was used. RunTest outputs a comment when it skips a test. +testoutput files. RunTest uses a file called testtry to hold the main output +from pcretest. Other files whose names begin with "test" are used as working +files in some tests. + +Some tests are relevant only when certain build-time options were selected. For +example, the tests for UTF-8/16/32 support are run only if --enable-utf was +used. RunTest outputs a comment when it skips a test. Many of the tests that are not skipped are run up to three times. The second run forces pcre_study() to be called for all patterns except for a few in some tests that are marked "never study" (see the pcretest program for how this is done). If JIT support is available, the non-DFA tests are run a third time, this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. +This testing can be suppressed by putting "nojit" on the RunTest command line. The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit libraries that are enabled. If you want to run just one set of tests, call RunTest with either the -8, -16 or -32 option. -RunTest uses a file called testtry to hold the main output from pcretest. -Other files whose names begin with "test" are used as working files in some -tests. To run pcretest on just one or more specific test files, give their -numbers as arguments to RunTest, for example: +If valgrind is installed, you can run the tests under it by putting "valgrind" +on the RunTest command line. To run pcretest on just one or more specific test +files, give their numbers as arguments to RunTest, for example: RunTest 2 7 11 +You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the +end), or a number preceded by ~ to exclude a test. For example: + + Runtest 3-15 ~10 + +This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests +except test 13. Whatever order the arguments are in, the tests are always run +in numerical order. + You can also call RunTest with the single argument "list" to cause it to output a list of tests. @@ -704,21 +756,24 @@ test is run only when JIT support is not available. They test some JIT-specific features such as information output from pcretest about JIT compilation. The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit mode. -These are tests that generate different output in the two modes. They are for -general cases, UTF-8/16/32 support, and Unicode property support, respectively. +the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit +mode. These are tests that generate different output in the two modes. They are +for general cases, UTF-8/16/32 support, and Unicode property support, +respectively. The twentieth test is run only in 16/32-bit mode. It tests some specific 16/32-bit features of the DFA matching engine. -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when the -link size is set to 2 for the 16-bit library. They test reloading pre-compiled patterns. +The twenty-first and twenty-second tests are run only in 16/32-bit mode, when +the link size is set to 2 for the 16-bit library. They test reloading +pre-compiled patterns. + +The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are +for general cases, and UTF-16 support, respectively. -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are for -general cases, and UTF-16 support, respectively. +The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are +for general cases, and UTF-32 support, respectively. -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are for -general cases, and UTF-32 support, respectively. Character tables ---------------- @@ -784,11 +839,11 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. (A) Source files of the PCRE library functions and their headers: dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified + when --enable-rebuild-chartables is specified pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c + coding; used, unless --enable-rebuild-chartables is + specified, by copying to pcre[16]_chartables.c pcreposix.c ) pcre[16|32]_byte_order.c ) @@ -932,4 +987,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. Philip Hazel Email local part: ph10 Email domain: cam.ac.uk -Last updated: 27 October 2012 +Last updated: 05 November 2013 diff --git a/ext/pcre/pcrelib/config.h b/ext/pcre/pcrelib/config.h index bd18f535a..a3b1b5dd3 100644 --- a/ext/pcre/pcrelib/config.h +++ b/ext/pcre/pcrelib/config.h @@ -302,6 +302,8 @@ them both to 0; an emulation function will be used. */ */ /* #undef NO_RECURSE */ +#define PARENS_NEST_LIMIT 250 + /* Name of package */ #define PACKAGE "pcre" @@ -430,7 +432,7 @@ them both to 0; an emulation function will be used. */ /* Version number of package */ #ifndef VERSION -#define VERSION "8.32" +#define VERSION "8.34" #endif /* Define to empty if `const' does not conform to ANSI C. */ diff --git a/ext/pcre/pcrelib/doc/pcre.txt b/ext/pcre/pcrelib/doc/pcre.txt index 2a2a82c7f..9d69515c3 100644 --- a/ext/pcre/pcrelib/doc/pcre.txt +++ b/ext/pcre/pcrelib/doc/pcre.txt @@ -8,13 +8,13 @@ pcretest commands. ----------------------------------------------------------------------------- -PCRE(3) PCRE(3) +PCRE(3) Library Functions Manual PCRE(3) + NAME PCRE - Perl-compatible regular expressions - INTRODUCTION The PCRE library is a set of functions that implement regular expres- @@ -33,110 +33,113 @@ INTRODUCTION possible was done by Zoltan Herczeg. Starting with release 8.32 it is possible to compile a third separate - PCRE library, which supports 32-bit character strings (including UTF-32 - strings). The build process allows any set of the 8-, 16- and 32-bit - libraries. The work to make this possible was done by Christian Persch. - - The three libraries contain identical sets of functions, except that - the names in the 16-bit library start with pcre16_ instead of pcre_, - and the names in the 32-bit library start with pcre32_ instead of - pcre_. To avoid over-complication and reduce the documentation mainte- + PCRE library that supports 32-bit character strings (including UTF-32 + strings). The build process allows any combination of the 8-, 16- and + 32-bit libraries. The work to make this possible was done by Christian + Persch. + + The three libraries contain identical sets of functions, except that + the names in the 16-bit library start with pcre16_ instead of pcre_, + and the names in the 32-bit library start with pcre32_ instead of + pcre_. To avoid over-complication and reduce the documentation mainte- nance load, most of the documentation describes the 8-bit library, with - the differences for the 16-bit and 32-bit libraries described sepa- - rately in the pcre16 and pcre32 pages. References to functions or - structures of the form pcre[16|32]_xxx should be read as meaning - "pcre_xxx when using the 8-bit library, pcre16_xxx when using the + the differences for the 16-bit and 32-bit libraries described sepa- + rately in the pcre16 and pcre32 pages. References to functions or + structures of the form pcre[16|32]_xxx should be read as meaning + "pcre_xxx when using the 8-bit library, pcre16_xxx when using the 16-bit library, or pcre32_xxx when using the 32-bit library". - The current implementation of PCRE corresponds approximately with Perl - 5.12, including support for UTF-8/16/32 encoded strings and Unicode - general category properties. However, UTF-8/16/32 and Unicode support + The current implementation of PCRE corresponds approximately with Perl + 5.12, including support for UTF-8/16/32 encoded strings and Unicode + general category properties. However, UTF-8/16/32 and Unicode support has to be explicitly enabled; it is not the default. The Unicode tables - correspond to Unicode release 6.2.0. + correspond to Unicode release 6.3.0. - In addition to the Perl-compatible matching function, PCRE contains an - alternative function that matches the same compiled patterns in a dif- + In addition to the Perl-compatible matching function, PCRE contains an + alternative function that matches the same compiled patterns in a dif- ferent way. In certain circumstances, the alternative function has some - advantages. For a discussion of the two matching algorithms, see the + advantages. For a discussion of the two matching algorithms, see the pcrematching page. - PCRE is written in C and released as a C library. A number of people - have written wrappers and interfaces of various kinds. In particular, - Google Inc. have provided a comprehensive C++ wrapper for the 8-bit - library. This is now included as part of the PCRE distribution. The - pcrecpp page has details of this interface. Other people's contribu- - tions can be found in the Contrib directory at the primary FTP site, + PCRE is written in C and released as a C library. A number of people + have written wrappers and interfaces of various kinds. In particular, + Google Inc. have provided a comprehensive C++ wrapper for the 8-bit + library. This is now included as part of the PCRE distribution. The + pcrecpp page has details of this interface. Other people's contribu- + tions can be found in the Contrib directory at the primary FTP site, which is: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre - Details of exactly which Perl regular expression features are and are + Details of exactly which Perl regular expression features are and are not supported by PCRE are given in separate documents. See the pcrepat- - tern and pcrecompat pages. There is a syntax summary in the pcresyntax + tern and pcrecompat pages. There is a syntax summary in the pcresyntax page. - Some features of PCRE can be included, excluded, or changed when the - library is built. The pcre_config() function makes it possible for a - client to discover which features are available. The features them- - selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README and + Some features of PCRE can be included, excluded, or changed when the + library is built. The pcre_config() function makes it possible for a + client to discover which features are available. The features them- + selves are described in the pcrebuild page. Documentation about build- + ing PCRE for various operating systems can be found in the README and NON-AUTOTOOLS_BUILD files in the source distribution. - The libraries contains a number of undocumented internal functions and - data tables that are used by more than one of the exported external - functions, but which are not intended for use by external callers. - Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which - hopefully will not provoke any name clashes. In some environments, it - is possible to control which external symbols are exported when a - shared library is built, and in these cases the undocumented symbols + The libraries contains a number of undocumented internal functions and + data tables that are used by more than one of the exported external + functions, but which are not intended for use by external callers. + Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which + hopefully will not provoke any name clashes. In some environments, it + is possible to control which external symbols are exported when a + shared library is built, and in these cases the undocumented symbols are not exported. SECURITY CONSIDERATIONS - If you are using PCRE in a non-UTF application that permits users to - supply arbitrary patterns for compilation, you should be aware of a + If you are using PCRE in a non-UTF application that permits users to + supply arbitrary patterns for compilation, you should be aware of a feature that allows users to turn on UTF support from within a pattern, - provided that PCRE was built with UTF support. For example, an 8-bit - pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, - which interprets patterns and subjects as strings of UTF-8 characters - instead of individual 8-bit characters. This causes both the pattern + provided that PCRE was built with UTF support. For example, an 8-bit + pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, + which interprets patterns and subjects as strings of UTF-8 characters + instead of individual 8-bit characters. This causes both the pattern and any data against which it is matched to be checked for UTF-8 valid- - ity. If the data string is very long, such a check might use suffi- - ciently many resources as to cause your application to lose perfor- + ity. If the data string is very long, such a check might use suffi- + ciently many resources as to cause your application to lose perfor- mance. - The best way of guarding against this possibility is to use the - pcre_fullinfo() function to check the compiled pattern's options for - UTF. + One way of guarding against this possibility is to use the + pcre_fullinfo() function to check the compiled pattern's options for + UTF. Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF + option at compile time. This causes an compile time error if a pattern + contains a UTF-setting sequence. - If your application is one that supports UTF, be aware that validity - checking can take time. If the same data string is to be matched many + If your application is one that supports UTF, be aware that validity + checking can take time. If the same data string is to be matched many times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to save redundant checks. - Another way that performance can be hit is by running a pattern that - has a very large search tree against a string that will never match. - Nested unlimited repeats in a pattern are a common example. PCRE pro- + Another way that performance can be hit is by running a pattern that + has a very large search tree against a string that will never match. + Nested unlimited repeats in a pattern are a common example. PCRE pro- vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea- ture in the pcreapi page. USER DOCUMENTATION - The user documentation for PCRE comprises a number of different sec- - tions. In the "man" format, each of these is a separate "man page". In - the HTML format, each is a separate page, linked from the index page. - In the plain text format, all the sections, except the pcredemo sec- + The user documentation for PCRE comprises a number of different sec- + tions. In the "man" format, each of these is a separate "man page". In + the HTML format, each is a separate page, linked from the index page. + In the plain text format, all the sections, except the pcredemo sec- tion, are concatenated, for ease of searching. The sections are as fol- lows: pcre this document + pcre-config show PCRE installation configuration information pcre16 details of the 16-bit library pcre32 details of the 32-bit library - pcre-config show PCRE installation configuration information pcreapi details of PCRE's native C API - pcrebuild options for building PCRE + pcrebuild building PCRE pcrecallout details of the callout feature pcrecompat discussion of Perl compatibility pcrecpp details of the C++ wrapper for the 8-bit library @@ -157,7 +160,7 @@ USER DOCUMENTATION pcretest description of the pcretest testing command pcreunicode discussion of Unicode and UTF-8/16/32 support - In addition, in the "man" and HTML formats, there is a short page for + In addition, in the "man" and HTML formats, there is a short page for each C library function, listing its arguments and results. @@ -167,19 +170,20 @@ AUTHOR University Computing Service Cambridge CB2 3QH, England. - Putting an actual email address here seems to have been a spam magnet, - so I've taken it away. If you want to email me, use my two initials, + Putting an actual email address here seems to have been a spam magnet, + so I've taken it away. If you want to email me, use my two initials, followed by the two digits 10, at the domain cam.ac.uk. REVISION - Last updated: 11 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 13 May 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRE(3) PCRE(3) +PCRE(3) Library Functions Manual PCRE(3) + NAME @@ -389,8 +393,10 @@ STRUCTURE TYPES SUBJECT STRING OFFSETS - The offsets within subject strings that are returned by the matching - functions are in 16-bit units rather than bytes. + The lengths and starting offsets of subject strings must be specified + in 16-bit data units, and the offsets within subject strings that are + returned by the matching functions are in also 16-bit units rather than + bytes. NAMED SUBPATTERNS @@ -503,12 +509,13 @@ AUTHOR REVISION - Last updated: 08 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRE(3) PCRE(3) +PCRE(3) Library Functions Manual PCRE(3) + NAME @@ -525,7 +532,6 @@ PCRE 32-BIT API BASIC FUNCTIONS pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, int *errorcodeptr, - const char **errptr, int *erroffset, const unsigned char *tableptr); pcre32_extra *pcre32_study(const pcre32 *code, int options, @@ -718,8 +724,10 @@ STRUCTURE TYPES SUBJECT STRING OFFSETS - The offsets within subject strings that are returned by the matching - functions are in 32-bit units rather than bytes. + The lengths and starting offsets of subject strings must be specified + in 32-bit data units, and the offsets within subject strings that are + returned by the matching functions are in also 32-bit units rather than + bytes. NAMED SUBPATTERNS @@ -829,33 +837,46 @@ AUTHOR REVISION - Last updated: 08 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREBUILD(3) PCREBUILD(3) +PCREBUILD(3) Library Functions Manual PCREBUILD(3) + NAME PCRE - Perl-compatible regular expressions +BUILDING PCRE + + PCRE is distributed with a configure script that can be used to build + the library in Unix-like environments using the applications known as + Autotools. Also in the distribution are files to support building + using CMake instead of configure. The text file README contains general + information about building with Autotools (some of which is repeated + below), and also has some comments about building on various operating + systems. There is a lot more information about building PCRE without + using Autotools (including information about using CMake and building + "by hand") in the text file called NON-AUTOTOOLS-BUILD. You should + consult this file as well as the README file if you are building in a + non-Unix-like environment. + PCRE BUILD-TIME OPTIONS - This document describes the optional features of PCRE that can be - selected when the library is compiled. It assumes use of the configure - script, where the optional features are selected or deselected by pro- - viding options to configure before running the make command. However, - the same options can be selected in both Unix-like and non-Unix-like - environments using the GUI facility of cmake-gui if you are using CMake - instead of configure to build PCRE. + The rest of this document describes the optional features of PCRE that + can be selected when the library is compiled. It assumes use of the + configure script, where the optional features are selected or dese- + lected by providing options to configure before running the make com- + mand. However, the same options can be selected in both Unix-like and + non-Unix-like environments using the GUI facility of cmake-gui if you + are using CMake instead of configure to build PCRE. - There is a lot more information about building PCRE without using con- - figure (including information about using CMake or building "by hand") - in the file called NON-AUTOTOOLS-BUILD, which is part of the PCRE dis- - tribution. You should consult this file as well as the README file if - you are building in a non-Unix-like environment. + If you are not using Autotools or CMake, option selection can be done + by editing the config.h file, or by passing parameter settings to the + compiler, as described in NON-AUTOTOOLS-BUILD. The complete list of options for configure (which includes the standard ones such as the selection of the installation directory) can be @@ -882,10 +903,10 @@ BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES --enable-pcre16 - to the configure command. You can also build a separate library, called - libpcre32, in which strings are contained in vectors of 32-bit data - units and interpreted either as single-unit characters or UTF-32 - strings, by adding + to the configure command. You can also build yet another separate + library, called libpcre32, in which strings are contained in vectors of + 32-bit data units and interpreted either as single-unit characters or + UTF-32 strings, by adding --enable-pcre32 @@ -901,9 +922,9 @@ BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES BUILDING SHARED AND STATIC LIBRARIES - The PCRE building process uses libtool to build both shared and static - Unix libraries by default. You can suppress one of these by adding one - of + The Autotools PCRE building process uses libtool to build both shared + and static libraries by default. You can suppress one of these by + adding one of --disable-shared --disable-static @@ -1319,18 +1340,18 @@ AUTHOR REVISION - Last updated: 30 October 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREMATCHING(3) PCREMATCHING(3) +PCREMATCHING(3) Library Functions Manual PCREMATCHING(3) + NAME PCRE - Perl-compatible regular expressions - PCRE MATCHING ALGORITHMS This document describes the two different algorithms that are available @@ -1436,72 +1457,81 @@ THE ALTERNATIVE MATCHING ALGORITHM at the fifth character of the subject. The algorithm does not automati- cally move on to find matches that start at later positions. + PCRE's "auto-possessification" optimization usually applies to charac- + ter repeats at the end of a pattern (as well as internally). For exam- + ple, the pattern "a\d+" is compiled as if it were "a\d++" because there + is no point even considering the possibility of backtracking into the + repeated digits. For DFA matching, this means that only one possible + match is found. If you really do want multiple matches in such cases, + either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS + option when compiling. + There are a number of features of PCRE regular expressions that are not supported by the alternative matching algorithm. They are as follows: - 1. Because the algorithm finds all possible matches, the greedy or - ungreedy nature of repetition quantifiers is not relevant. Greedy and + 1. Because the algorithm finds all possible matches, the greedy or + ungreedy nature of repetition quantifiers is not relevant. Greedy and ungreedy quantifiers are treated in exactly the same way. However, pos- - sessive quantifiers can make a difference when what follows could also + sessive quantifiers can make a difference when what follows could also match what is quantified, for example in a pattern like this: ^a++\w! - This pattern matches "aaab!" but not "aaa!", which would be matched by - a non-possessive quantifier. Similarly, if an atomic group is present, - it is matched as if it were a standalone pattern at the current point, - and the longest match is then "locked in" for the rest of the overall + This pattern matches "aaab!" but not "aaa!", which would be matched by + a non-possessive quantifier. Similarly, if an atomic group is present, + it is matched as if it were a standalone pattern at the current point, + and the longest match is then "locked in" for the rest of the overall pattern. 2. When dealing with multiple paths through the tree simultaneously, it - is not straightforward to keep track of captured substrings for the - different matching possibilities, and PCRE's implementation of this + is not straightforward to keep track of captured substrings for the + different matching possibilities, and PCRE's implementation of this algorithm does not attempt to do this. This means that no captured sub- strings are available. - 3. Because no substrings are captured, back references within the pat- + 3. Because no substrings are captured, back references within the pat- tern are not supported, and cause errors if encountered. - 4. For the same reason, conditional expressions that use a backrefer- - ence as the condition or test for a specific group recursion are not + 4. For the same reason, conditional expressions that use a backrefer- + ence as the condition or test for a specific group recursion are not supported. - 5. Because many paths through the tree may be active, the \K escape + 5. Because many paths through the tree may be active, the \K escape sequence, which resets the start of the match when encountered (but may - be on some paths and not on others), is not supported. It causes an + be on some paths and not on others), is not supported. It causes an error if encountered. - 6. Callouts are supported, but the value of the capture_top field is + 6. Callouts are supported, but the value of the capture_top field is always 1, and the value of the capture_last field is always -1. - 7. The \C escape sequence, which (in the standard algorithm) always - matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is - not supported in these modes, because the alternative algorithm moves + 7. The \C escape sequence, which (in the standard algorithm) always + matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is + not supported in these modes, because the alternative algorithm moves through the subject string one character (not data unit) at a time, for all active paths through the tree. - 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) - are not supported. (*FAIL) is supported, and behaves like a failing + 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) + are not supported. (*FAIL) is supported, and behaves like a failing negative assertion. ADVANTAGES OF THE ALTERNATIVE ALGORITHM - Using the alternative matching algorithm provides the following advan- + Using the alternative matching algorithm provides the following advan- tages: 1. All possible matches (at a single point in the subject) are automat- - ically found, and in particular, the longest match is found. To find + ically found, and in particular, the longest match is found. To find more than one match using the standard algorithm, you have to do kludgy things with callouts. - 2. Because the alternative algorithm scans the subject string just + 2. Because the alternative algorithm scans the subject string just once, and never needs to backtrack (except for lookbehinds), it is pos- - sible to pass very long subject strings to the matching function in + sible to pass very long subject strings to the matching function in several pieces, checking for partial matching each time. Although it is - possible to do multi-segment matching using the standard algorithm by - retaining partially matched substrings, it is more complicated. The - pcrepartial documentation gives details of partial matching and dis- + possible to do multi-segment matching using the standard algorithm by + retaining partially matched substrings, it is more complicated. The + pcrepartial documentation gives details of partial matching and dis- cusses multi-segment matching. @@ -1509,8 +1539,8 @@ DISADVANTAGES OF THE ALTERNATIVE ALGORITHM The alternative algorithm suffers from a number of disadvantages: - 1. It is substantially slower than the standard algorithm. This is - partly because it has to search for all possible matches, but is also + 1. It is substantially slower than the standard algorithm. This is + partly because it has to search for all possible matches, but is also because it is less susceptible to optimization. 2. Capturing parentheses and back references are not supported. @@ -1528,12 +1558,13 @@ AUTHOR REVISION - Last updated: 08 January 2012 + Last updated: 12 November 2013 Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------ -PCREAPI(3) PCREAPI(3) +PCREAPI(3) Library Functions Manual PCREAPI(3) + NAME @@ -1663,68 +1694,67 @@ PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES ues. References to bytes and UTF-8 in this document should be read as refer- - ences to 16-bit data quantities and UTF-16 when using the 16-bit - library, or 32-bit data quantities and UTF-32 when using the 32-bit - library, unless specified otherwise. More details of the specific dif- - ferences for the 16-bit and 32-bit libraries are given in the pcre16 - and pcre32 pages. + ences to 16-bit data units and UTF-16 when using the 16-bit library, or + 32-bit data units and UTF-32 when using the 32-bit library, unless + specified otherwise. More details of the specific differences for the + 16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages. PCRE API OVERVIEW PCRE has its own native API, which is described in this document. There - are also some wrapper functions (for the 8-bit library only) that cor- - respond to the POSIX regular expression API, but they do not give - access to all the functionality. They are described in the pcreposix - documentation. Both of these APIs define a set of C function calls. A + are also some wrapper functions (for the 8-bit library only) that cor- + respond to the POSIX regular expression API, but they do not give + access to all the functionality. They are described in the pcreposix + documentation. Both of these APIs define a set of C function calls. A C++ wrapper (again for the 8-bit library only) is also distributed with PCRE. It is documented in the pcrecpp page. - The native API C function prototypes are defined in the header file - pcre.h, and on Unix-like systems the (8-bit) library itself is called - libpcre. It can normally be accessed by adding -lpcre to the command - for linking an application that uses PCRE. The header file defines the + The native API C function prototypes are defined in the header file + pcre.h, and on Unix-like systems the (8-bit) library itself is called + libpcre. It can normally be accessed by adding -lpcre to the command + for linking an application that uses PCRE. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release - numbers for the library. Applications can use these to include support + numbers for the library. Applications can use these to include support for different releases of PCRE. In a Windows environment, if you want to statically link an application - program against a non-dll pcre.a file, you must define PCRE_STATIC - before including pcre.h or pcrecpp.h, because otherwise the pcre_mal- + program against a non-dll pcre.a file, you must define PCRE_STATIC + before including pcre.h or pcrecpp.h, because otherwise the pcre_mal- loc() and pcre_free() exported functions will be declared __declspec(dllimport), with unwanted results. - The functions pcre_compile(), pcre_compile2(), pcre_study(), and - pcre_exec() are used for compiling and matching regular expressions in - a Perl-compatible manner. A sample program that demonstrates the sim- - plest way of using them is provided in the file called pcredemo.c in + The functions pcre_compile(), pcre_compile2(), pcre_study(), and + pcre_exec() are used for compiling and matching regular expressions in + a Perl-compatible manner. A sample program that demonstrates the sim- + plest way of using them is provided in the file called pcredemo.c in the PCRE source distribution. A listing of this program is given in the - pcredemo documentation, and the pcresample documentation describes how + pcredemo documentation, and the pcresample documentation describes how to compile and run it. - Just-in-time compiler support is an optional feature of PCRE that can + Just-in-time compiler support is an optional feature of PCRE that can be built in appropriate hardware environments. It greatly speeds up the - matching performance of many patterns. Simple programs can easily - request that it be used if available, by setting an option that is - ignored when it is not relevant. More complicated programs might need - to make use of the functions pcre_jit_stack_alloc(), - pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control + matching performance of many patterns. Simple programs can easily + request that it be used if available, by setting an option that is + ignored when it is not relevant. More complicated programs might need + to make use of the functions pcre_jit_stack_alloc(), + pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control the JIT code's memory usage. - From release 8.32 there is also a direct interface for JIT execution, - which gives improved performance. The JIT-specific functions are dis- + From release 8.32 there is also a direct interface for JIT execution, + which gives improved performance. The JIT-specific functions are dis- cussed in the pcrejit documentation. A second matching function, pcre_dfa_exec(), which is not Perl-compati- - ble, is also provided. This uses a different algorithm for the match- - ing. The alternative algorithm finds all possible matches (at a given - point in the subject), and scans the subject just once (unless there - are lookbehind assertions). However, this algorithm does not return - captured substrings. A description of the two matching algorithms and - their advantages and disadvantages is given in the pcrematching docu- + ble, is also provided. This uses a different algorithm for the match- + ing. The alternative algorithm finds all possible matches (at a given + point in the subject), and scans the subject just once (unless there + are lookbehind assertions). However, this algorithm does not return + captured substrings. A description of the two matching algorithms and + their advantages and disadvantages is given in the pcrematching docu- mentation. - In addition to the main compiling and matching functions, there are + In addition to the main compiling and matching functions, there are convenience functions for extracting captured substrings from a subject string that is matched by pcre_exec(). They are: @@ -1739,105 +1769,105 @@ PCRE API OVERVIEW pcre_free_substring() and pcre_free_substring_list() are also provided, to free the memory used for extracted strings. - The function pcre_maketables() is used to build a set of character - tables in the current locale for passing to pcre_compile(), - pcre_exec(), or pcre_dfa_exec(). This is an optional facility that is - provided for specialist use. Most commonly, no special tables are - passed, in which case internal tables that are generated when PCRE is + The function pcre_maketables() is used to build a set of character + tables in the current locale for passing to pcre_compile(), + pcre_exec(), or pcre_dfa_exec(). This is an optional facility that is + provided for specialist use. Most commonly, no special tables are + passed, in which case internal tables that are generated when PCRE is built are used. - The function pcre_fullinfo() is used to find out information about a - compiled pattern. The function pcre_version() returns a pointer to a + The function pcre_fullinfo() is used to find out information about a + compiled pattern. The function pcre_version() returns a pointer to a string containing the version of PCRE and its date of release. - The function pcre_refcount() maintains a reference count in a data - block containing a compiled pattern. This is provided for the benefit + The function pcre_refcount() maintains a reference count in a data + block containing a compiled pattern. This is provided for the benefit of object-oriented applications. - The global variables pcre_malloc and pcre_free initially contain the - entry points of the standard malloc() and free() functions, respec- + The global variables pcre_malloc and pcre_free initially contain the + entry points of the standard malloc() and free() functions, respec- tively. PCRE calls the memory management functions via these variables, - so a calling program can replace them if it wishes to intercept the + so a calling program can replace them if it wishes to intercept the calls. This should be done before calling any PCRE functions. - The global variables pcre_stack_malloc and pcre_stack_free are also - indirections to memory management functions. These special functions - are used only when PCRE is compiled to use the heap for remembering + The global variables pcre_stack_malloc and pcre_stack_free are also + indirections to memory management functions. These special functions + are used only when PCRE is compiled to use the heap for remembering data, instead of recursive function calls, when running the pcre_exec() - function. See the pcrebuild documentation for details of how to do - this. It is a non-standard way of building PCRE, for use in environ- - ments that have limited stacks. Because of the greater use of memory - management, it runs more slowly. Separate functions are provided so - that special-purpose external code can be used for this case. When - used, these functions are always called in a stack-like manner (last - obtained, first freed), and always for memory blocks of the same size. - There is a discussion about PCRE's stack usage in the pcrestack docu- + function. See the pcrebuild documentation for details of how to do + this. It is a non-standard way of building PCRE, for use in environ- + ments that have limited stacks. Because of the greater use of memory + management, it runs more slowly. Separate functions are provided so + that special-purpose external code can be used for this case. When + used, these functions are always called in a stack-like manner (last + obtained, first freed), and always for memory blocks of the same size. + There is a discussion about PCRE's stack usage in the pcrestack docu- mentation. The global variable pcre_callout initially contains NULL. It can be set - by the caller to a "callout" function, which PCRE will then call at - specified points during a matching operation. Details are given in the + by the caller to a "callout" function, which PCRE will then call at + specified points during a matching operation. Details are given in the pcrecallout documentation. NEWLINES - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- + PCRE supports five different conventions for indicating line breaks in + strings: a single CR (carriage return) character, a single LF (line- feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The Unicode newline sequences - are the three just mentioned, plus the single characters VT (vertical + ceding, or any Unicode newline sequence. The Unicode newline sequences + are the three just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS (paragraph separator, U+2029). - Each of the first three conventions is used by at least one operating - system as its standard newline sequence. When PCRE is built, a default - can be specified. The default default is LF, which is the Unix stan- - dard. When PCRE is run, the default can be overridden, either when a + Each of the first three conventions is used by at least one operating + system as its standard newline sequence. When PCRE is built, a default + can be specified. The default default is LF, which is the Unix stan- + dard. When PCRE is run, the default can be overridden, either when a pattern is compiled, or when it is matched. At compile time, the newline convention can be specified by the options - argument of pcre_compile(), or it can be specified by special text at + argument of pcre_compile(), or it can be specified by special text at the start of the pattern itself; this overrides any other settings. See the pcrepattern page for details of the special character sequences. In the PCRE documentation the word "newline" is used to mean "the char- - acter or pair of characters that indicate a line break". The choice of - newline convention affects the handling of the dot, circumflex, and + acter or pair of characters that indicate a line break". The choice of + newline convention affects the handling of the dot, circumflex, and dollar metacharacters, the handling of #-comments in /x mode, and, when - CRLF is a recognized line ending sequence, the match position advance- + CRLF is a recognized line ending sequence, the match position advance- ment for a non-anchored pattern. There is more detail about this in the section on pcre_exec() options below. - The choice of newline convention does not affect the interpretation of - the \n or \r escape sequences, nor does it affect what \R matches, + The choice of newline convention does not affect the interpretation of + the \n or \r escape sequences, nor does it affect what \R matches, which is controlled in a similar way, but by separate options. MULTITHREADING - The PCRE functions can be used in multi-threading applications, with + The PCRE functions can be used in multi-threading applications, with the proviso that the memory management functions pointed to by pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the callout function pointed to by pcre_callout, are shared by all threads. - The compiled form of a regular expression is not altered during match- + The compiled form of a regular expression is not altered during match- ing, so the same compiled pattern can safely be used by several threads at once. - If the just-in-time optimization feature is being used, it needs sepa- - rate memory stack areas for each thread. See the pcrejit documentation + If the just-in-time optimization feature is being used, it needs sepa- + rate memory stack areas for each thread. See the pcrejit documentation for more details. SAVING PRECOMPILED PATTERNS FOR LATER USE The compiled form of a regular expression can be saved and re-used at a - later time, possibly by a different program, and even on a host other - than the one on which it was compiled. Details are given in the - pcreprecompile documentation, which includes a description of the - pcre_pattern_to_host_byte_order() function. However, compiling a regu- - lar expression with one version of PCRE for use with a different ver- + later time, possibly by a different program, and even on a host other + than the one on which it was compiled. Details are given in the + pcreprecompile documentation, which includes a description of the + pcre_pattern_to_host_byte_order() function. However, compiling a regu- + lar expression with one version of PCRE for use with a different ver- sion is not guaranteed to work and may cause crashes. @@ -1845,45 +1875,45 @@ CHECKING BUILD-TIME OPTIONS int pcre_config(int what, void *where); - The function pcre_config() makes it possible for a PCRE client to dis- + The function pcre_config() makes it possible for a PCRE client to dis- cover which optional features have been compiled into the PCRE library. - The pcrebuild documentation has more details about these optional fea- + The pcrebuild documentation has more details about these optional fea- tures. - The first argument for pcre_config() is an integer, specifying which + The first argument for pcre_config() is an integer, specifying which information is required; the second argument is a pointer to a variable - into which the information is placed. The returned value is zero on - success, or the negative error code PCRE_ERROR_BADOPTION if the value - in the first argument is not recognized. The following information is + into which the information is placed. The returned value is zero on + success, or the negative error code PCRE_ERROR_BADOPTION if the value + in the first argument is not recognized. The following information is available: PCRE_CONFIG_UTF8 - The output is an integer that is set to one if UTF-8 support is avail- - able; otherwise it is set to zero. This value should normally be given + The output is an integer that is set to one if UTF-8 support is avail- + able; otherwise it is set to zero. This value should normally be given to the 8-bit version of this function, pcre_config(). If it is given to - the 16-bit or 32-bit version of this function, the result is + the 16-bit or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. PCRE_CONFIG_UTF16 The output is an integer that is set to one if UTF-16 support is avail- - able; otherwise it is set to zero. This value should normally be given + able; otherwise it is set to zero. This value should normally be given to the 16-bit version of this function, pcre16_config(). If it is given - to the 8-bit or 32-bit version of this function, the result is + to the 8-bit or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. PCRE_CONFIG_UTF32 The output is an integer that is set to one if UTF-32 support is avail- - able; otherwise it is set to zero. This value should normally be given + able; otherwise it is set to zero. This value should normally be given to the 32-bit version of this function, pcre32_config(). If it is given - to the 8-bit or 16-bit version of this function, the result is + to the 8-bit or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. PCRE_CONFIG_UNICODE_PROPERTIES - The output is an integer that is set to one if support for Unicode + The output is an integer that is set to one if support for Unicode character properties is available; otherwise it is set to zero. PCRE_CONFIG_JIT @@ -1893,49 +1923,56 @@ CHECKING BUILD-TIME OPTIONS PCRE_CONFIG_JITTARGET - The output is a pointer to a zero-terminated "const char *" string. If + The output is a pointer to a zero-terminated "const char *" string. If JIT support is available, the string contains the name of the architec- - ture for which the JIT compiler is configured, for example "x86 32bit - (little endian + unaligned)". If JIT support is not available, the + ture for which the JIT compiler is configured, for example "x86 32bit + (little endian + unaligned)". If JIT support is not available, the result is NULL. PCRE_CONFIG_NEWLINE - The output is an integer whose value specifies the default character - sequence that is recognized as meaning "newline". The values that are + The output is an integer whose value specifies the default character + sequence that is recognized as meaning "newline". The values that are supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 - for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, - ANYCRLF, and ANY yield the same values. However, the value for LF is - normally 21, though some EBCDIC environments use 37. The corresponding - values for CRLF are 3349 and 3365. The default should normally corre- + for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, + ANYCRLF, and ANY yield the same values. However, the value for LF is + normally 21, though some EBCDIC environments use 37. The corresponding + values for CRLF are 3349 and 3365. The default should normally corre- spond to the standard sequence for your operating system. PCRE_CONFIG_BSR The output is an integer whose value indicates what character sequences - the \R escape sequence matches by default. A value of 0 means that \R - matches any Unicode line ending sequence; a value of 1 means that \R + the \R escape sequence matches by default. A value of 0 means that \R + matches any Unicode line ending sequence; a value of 1 means that \R matches only CR, LF, or CRLF. The default can be overridden when a pat- tern is compiled or matched. PCRE_CONFIG_LINK_SIZE - The output is an integer that contains the number of bytes used for + The output is an integer that contains the number of bytes used for internal linkage in compiled regular expressions. For the 8-bit library, the value can be 2, 3, or 4. For the 16-bit library, the value - is either 2 or 4 and is still a number of bytes. For the 32-bit + is either 2 or 4 and is still a number of bytes. For the 32-bit library, the value is either 2 or 4 and is still a number of bytes. The default value of 2 is sufficient for all but the most massive patterns, - since it allows the compiled pattern to be up to 64K in size. Larger - values allow larger regular expressions to be compiled, at the expense + since it allows the compiled pattern to be up to 64K in size. Larger + values allow larger regular expressions to be compiled, at the expense of slower matching. PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - The output is an integer that contains the threshold above which the - POSIX interface uses malloc() for output vectors. Further details are + The output is an integer that contains the threshold above which the + POSIX interface uses malloc() for output vectors. Further details are given in the pcreposix documentation. + PCRE_CONFIG_PARENS_LIMIT + + The output is a long integer that gives the maximum depth of nesting of + parentheses (of any kind) in a pattern. This limit is imposed to cap + the amount of system stack used when a pattern is compiled. It is spec- + ified when PCRE is built; the default is 250. + PCRE_CONFIG_MATCH_LIMIT The output is a long integer that gives the default limit for the num- @@ -2008,15 +2045,17 @@ COMPILING A PATTERN sets the variable pointed to by errptr to point to a textual error mes- sage. This is a static string that is part of the library. You must not try to free it. Normally, the offset from the start of the pattern to - the byte that was being processed when the error was discovered is + the data unit that was being processed when the error was discovered is placed in the variable pointed to by erroffset, which must not be NULL (if it is, an immediate error is given). However, for an invalid UTF-8 - string, the offset is that of the first byte of the failing character. + or UTF-16 string, the offset is that of the first data unit of the + failing character. - Some errors are not detected until the whole pattern has been scanned; - in these cases, the offset passed back is the length of the pattern. - Note that the offset is in bytes, not characters, even in UTF-8 mode. - It may sometimes point into the middle of a UTF-8 character. + Some errors are not detected until the whole pattern has been scanned; + in these cases, the offset passed back is the length of the pattern. + Note that the offset is in data units, not characters, even in a UTF + mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char- + acter. If pcre_compile2() is used instead of pcre_compile(), and the error- codeptr argument is not NULL, a non-zero error code number is returned @@ -2027,9 +2066,9 @@ COMPILING A PATTERN character tables that are built when PCRE is compiled, using the default C locale. Otherwise, tableptr must be an address that is the result of a call to pcre_maketables(). This value is stored with the - compiled pattern, and used again by pcre_exec(), unless another table - pointer is passed to it. For more discussion, see the section on locale - support below. + compiled pattern, and used again by pcre_exec() and pcre_dfa_exec() + when the pattern is matched. For more discussion, see the section on + locale support below. This code fragment shows a typical straightforward call to pcre_com- pile(): @@ -2113,13 +2152,23 @@ COMPILING A PATTERN PCRE_EXTENDED - If this bit is set, white space data characters in the pattern are - totally ignored except when escaped or inside a character class. White - space does not include the VT character (code 11). In addition, charac- - ters between an unescaped # outside a character class and the next new- - line, inclusive, are also ignored. This is equivalent to Perl's /x - option, and it can be changed within a pattern by a (?x) option set- - ting. + If this bit is set, most white space characters in the pattern are + totally ignored except when escaped or inside a character class. How- + ever, white space is not allowed within sequences such as (?> that + introduce various parenthesized subpatterns, nor within a numerical + quantifier such as {1,3}. However, ignorable white space is permitted + between an item and a following quantifier and between a quantifier and + a following + that indicates possessiveness. + + White space did not used to include the VT character (code 11), because + Perl did not treat this character as white space. However, Perl changed + at release 5.18, so PCRE followed at release 8.34, and VT is now + treated as white space. + + PCRE_EXTENDED also causes characters between an unescaped # outside a + character class and the next newline, inclusive, to be ignored. + PCRE_EXTENDED is equivalent to Perl's /x option, and it can be changed + within a pattern by a (?x) option setting. Which characters are interpreted as newlines is controlled by the options passed to pcre_compile() or by a special sequence at the start @@ -2186,21 +2235,33 @@ COMPILING A PATTERN PCRE_MULTILINE - By default, PCRE treats the subject string as consisting of a single - line of characters (even if it actually contains newlines). The "start - of line" metacharacter (^) matches only at the start of the string, - while the "end of line" metacharacter ($) matches only at the end of - the string, or before a terminating newline (unless PCRE_DOLLAR_ENDONLY - is set). This is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end of line" - constructs match immediately following or immediately before internal - newlines in the subject string, respectively, as well as at the very - start and end. This is equivalent to Perl's /m option, and it can be + By default, for the purposes of matching "start of line" and "end of + line", PCRE treats the subject string as consisting of a single line of + characters, even if it actually contains newlines. The "start of line" + metacharacter (^) matches only at the start of the string, and the "end + of line" metacharacter ($) matches only at the end of the string, or + before a terminating newline (except when PCRE_DOLLAR_ENDONLY is set). + Note, however, that unless PCRE_DOTALL is set, the "any character" + metacharacter (.) does not match at a newline. This behaviour (for ^, + $, and dot) is the same as Perl. + + When PCRE_MULTILINE it is set, the "start of line" and "end of line" + constructs match immediately following or immediately before internal + newlines in the subject string, respectively, as well as at the very + start and end. This is equivalent to Perl's /m option, and it can be changed within a pattern by a (?m) option setting. If there are no new- - lines in a subject string, or no occurrences of ^ or $ in a pattern, + lines in a subject string, or no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. + PCRE_NEVER_UTF + + This option locks out interpretation of the pattern as UTF-8 (or UTF-16 + or UTF-32 in the 16-bit and 32-bit libraries). In particular, it pre- + vents the creator of the pattern from switching to UTF interpretation + by starting the pattern with (*UTF). This may be useful in applications + that process patterns from external sources. The combination of + PCRE_UTF8 and PCRE_NEVER_UTF also causes an error. + PCRE_NEWLINE_CR PCRE_NEWLINE_LF PCRE_NEWLINE_CRLF @@ -2255,63 +2316,74 @@ COMPILING A PATTERN be used for capturing (and they acquire numbers in the usual way). There is no equivalent of this option in Perl. - NO_START_OPTIMIZE + PCRE_NO_AUTO_POSSESS + + If this option is set, it disables "auto-possessification". This is an + optimization that, for example, turns a+b into a++b in order to avoid + backtracks into a+ that can never be successful. However, if callouts + are in use, auto-possessification means that some of them are never + taken. You can set this option if you want the matching functions to do + a full unoptimized search and run all the callouts, but it is mainly + provided for testing purposes. + + PCRE_NO_START_OPTIMIZE This is an option that acts at matching time; that is, it is really an option for pcre_exec() or pcre_dfa_exec(). If it is set at compile time, it is remembered with the compiled pattern and assumed at match- - ing time. For details see the discussion of PCRE_NO_START_OPTIMIZE - below. + ing time. This is necessary if you want to use JIT execution, because + the JIT compiler needs to know whether or not this option is set. For + details see the discussion of PCRE_NO_START_OPTIMIZE below. PCRE_UCP - This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, - \w, and some of the POSIX character classes. By default, only ASCII - characters are recognized, but if PCRE_UCP is set, Unicode properties - are used instead to classify characters. More details are given in the - section on generic character types in the pcrepattern page. If you set - PCRE_UCP, matching one of the items it affects takes much longer. The - option is available only if PCRE has been compiled with Unicode prop- + This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, + \w, and some of the POSIX character classes. By default, only ASCII + characters are recognized, but if PCRE_UCP is set, Unicode properties + are used instead to classify characters. More details are given in the + section on generic character types in the pcrepattern page. If you set + PCRE_UCP, matching one of the items it affects takes much longer. The + option is available only if PCRE has been compiled with Unicode prop- erty support. PCRE_UNGREEDY - This option inverts the "greediness" of the quantifiers so that they - are not greedy by default, but become greedy if followed by "?". It is - not compatible with Perl. It can also be set by a (?U) option setting + This option inverts the "greediness" of the quantifiers so that they + are not greedy by default, but become greedy if followed by "?". It is + not compatible with Perl. It can also be set by a (?U) option setting within the pattern. PCRE_UTF8 - This option causes PCRE to regard both the pattern and the subject as + This option causes PCRE to regard both the pattern and the subject as strings of UTF-8 characters instead of single-byte strings. However, it - is available only when PCRE is built to include UTF support. If not, - the use of this option provokes an error. Details of how this option + is available only when PCRE is built to include UTF support. If not, + the use of this option provokes an error. Details of how this option changes the behaviour of PCRE are given in the pcreunicode page. PCRE_NO_UTF8_CHECK When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is - automatically checked. There is a discussion about the validity of - UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is - found, pcre_compile() returns an error. If you already know that your - pattern is valid, and you want to skip this check for performance rea- - sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the + automatically checked. There is a discussion about the validity of + UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is + found, pcre_compile() returns an error. If you already know that your + pattern is valid, and you want to skip this check for performance rea- + sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the effect of passing an invalid UTF-8 string as a pattern is undefined. It - may cause your program to crash. Note that this option can also be - passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity - checking of subject strings only. If the same string is being matched - many times, the option can be safely set for the second and subsequent + may cause your program to crash or loop. Note that this option can also + be passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity + checking of subject strings only. If the same string is being matched + many times, the option can be safely set for the second and subsequent matchings to improve performance. COMPILATION ERROR CODES - The following table lists the error codes than may be returned by - pcre_compile2(), along with the error messages that may be returned by - both compiling functions. Note that error messages are always 8-bit - ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, - some error codes have fallen out of use. To avoid confusion, they have + The following table lists the error codes than may be returned by + pcre_compile2(), along with the error messages that may be returned by + both compiling functions. Note that error messages are always 8-bit + ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, + some error codes have fallen out of use. To avoid confusion, they have not been re-used. 0 no error @@ -2348,7 +2420,7 @@ COMPILATION ERROR CODES 31 POSIX collating elements are not supported 32 this version of PCRE is compiled without UTF support 33 [this code is not in use] - 34 character value in \x{...} sequence is too large + 34 character value in \x{} or \o{} is too large 35 invalid condition (?(0) 36 \C not allowed in lookbehind assertion 37 PCRE does not support \L, \l, \N{name}, \U, or \u @@ -2376,7 +2448,7 @@ COMPILATION ERROR CODES name/number or by a plain number 58 a numbered reference must not be zero 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized + 60 (*VERB) not recognized or malformed 61 number is too big 62 subpattern name expected 63 digit expected after (?+ @@ -2396,74 +2468,80 @@ COMPILATION ERROR CODES 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) 76 character value in \u.... sequence is too large 77 invalid UTF-32 string (specifically UTF-32) - - The numbers 32 and 10000 in errors 48 and 49 are defaults; different + 78 setting UTF is disabled by the application + 79 non-hex character in \x{} (closing brace missing?) + 80 non-octal character in \o{} (closing brace missing?) + 81 missing opening brace after \o + 82 parentheses are too deeply nested + 83 invalid range in character class + + The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may be used if the limits were changed when PCRE was built. STUDYING A PATTERN - pcre_extra *pcre_study(const pcre *code, int options + pcre_extra *pcre_study(const pcre *code, int options, const char **errptr); - If a compiled pattern is going to be used several times, it is worth + If a compiled pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for - matching. The function pcre_study() takes a pointer to a compiled pat- + matching. The function pcre_study() takes a pointer to a compiled pat- tern as its first argument. If studying the pattern produces additional - information that will help speed up matching, pcre_study() returns a - pointer to a pcre_extra block, in which the study_data field points to + information that will help speed up matching, pcre_study() returns a + pointer to a pcre_extra block, in which the study_data field points to the results of the study. The returned value from pcre_study() can be passed directly to - pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- - tains other fields that can be set by the caller before the block is + pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- + tains other fields that can be set by the caller before the block is passed; these are described below in the section on matching a pattern. - If studying the pattern does not produce any useful information, - pcre_study() returns NULL by default. In that circumstance, if the + If studying the pattern does not produce any useful information, + pcre_study() returns NULL by default. In that circumstance, if the calling program wants to pass any of the other fields to pcre_exec() or - pcre_dfa_exec(), it must set up its own pcre_extra block. However, if - pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it + pcre_dfa_exec(), it must set up its own pcre_extra block. However, if + pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it returns a pcre_extra block even if studying did not find any additional - information. It may still return NULL, however, if an error occurs in + information. It may still return NULL, however, if an error occurs in pcre_study(). - The second argument of pcre_study() contains option bits. There are + The second argument of pcre_study() contains option bits. There are three further options in addition to PCRE_STUDY_EXTRA_NEEDED: PCRE_STUDY_JIT_COMPILE PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - If any of these are set, and the just-in-time compiler is available, - the pattern is further compiled into machine code that executes much - faster than the pcre_exec() interpretive matching function. If the - just-in-time compiler is not available, these options are ignored. All + If any of these are set, and the just-in-time compiler is available, + the pattern is further compiled into machine code that executes much + faster than the pcre_exec() interpretive matching function. If the + just-in-time compiler is not available, these options are ignored. All undefined bits in the options argument must be zero. - JIT compilation is a heavyweight optimization. It can take some time - for patterns to be analyzed, and for one-off matches and simple pat- - terns the benefit of faster execution might be offset by a much slower + JIT compilation is a heavyweight optimization. It can take some time + for patterns to be analyzed, and for one-off matches and simple pat- + terns the benefit of faster execution might be offset by a much slower study time. Not all patterns can be optimized by the JIT compiler. For - those that cannot be handled, matching automatically falls back to the - pcre_exec() interpreter. For more details, see the pcrejit documenta- + those that cannot be handled, matching automatically falls back to the + pcre_exec() interpreter. For more details, see the pcrejit documenta- tion. - The third argument for pcre_study() is a pointer for an error message. - If studying succeeds (even if no data is returned), the variable it - points to is set to NULL. Otherwise it is set to point to a textual + The third argument for pcre_study() is a pointer for an error message. + If studying succeeds (even if no data is returned), the variable it + points to is set to NULL. Otherwise it is set to point to a textual error message. This is a static string that is part of the library. You - must not try to free it. You should test the error pointer for NULL + must not try to free it. You should test the error pointer for NULL after calling pcre_study(), to be sure that it has run successfully. - When you are finished with a pattern, you can free the memory used for + When you are finished with a pattern, you can free the memory used for the study data by calling pcre_free_study(). This function was added to - the API for release 8.20. For earlier versions, the memory could be - freed with pcre_free(), just like the pattern itself. This will still - work in cases where JIT optimization is not used, but it is advisable + the API for release 8.20. For earlier versions, the memory could be + freed with pcre_free(), just like the pattern itself. This will still + work in cases where JIT optimization is not used, but it is advisable to change to the new function when convenient. - This is a typical way in which pcre_study() is used (except that in a + This is a typical way in which pcre_study() is used (except that in a real application there should be tests for errors): int rc; @@ -2483,41 +2561,50 @@ STUDYING A PATTERN Studying a pattern does two things: first, a lower bound for the length of subject string that is needed to match the pattern is computed. This does not mean that there are any strings of that length that match, but - it does guarantee that no shorter strings match. The value is used to + it does guarantee that no shorter strings match. The value is used to avoid wasting time by trying to match strings that are shorter than the - lower bound. You can find out the value in a calling program via the + lower bound. You can find out the value in a calling program via the pcre_fullinfo() function. Studying a pattern is also useful for non-anchored patterns that do not - have a single fixed starting character. A bitmap of possible starting - bytes is created. This speeds up finding a position in the subject at + have a single fixed starting character. A bitmap of possible starting + bytes is created. This speeds up finding a position in the subject at which to start matching. (In 16-bit mode, the bitmap is used for 16-bit - values less than 256. In 32-bit mode, the bitmap is used for 32-bit + values less than 256. In 32-bit mode, the bitmap is used for 32-bit values less than 256.) - These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), - and the information is also used by the JIT compiler. The optimiza- - tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option when - calling pcre_exec() or pcre_dfa_exec(), but if this is done, JIT execu- - tion is also disabled. You might want to do this if your pattern con- - tains callouts or (*MARK) and you want to make use of these facilities - in cases where matching fails. See the discussion of - PCRE_NO_START_OPTIMIZE below. + These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), + and the information is also used by the JIT compiler. The optimiza- + tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option. + You might want to do this if your pattern contains callouts or (*MARK) + and you want to make use of these facilities in cases where matching + fails. + + PCRE_NO_START_OPTIMIZE can be specified at either compile time or exe- + cution time. However, if PCRE_NO_START_OPTIMIZE is passed to + pcre_exec(), (that is, after any JIT compilation has happened) JIT exe- + cution is disabled. For JIT execution to work with PCRE_NO_START_OPTI- + MIZE, the option must be set at compile time. + + There is a longer discussion of PCRE_NO_START_OPTIMIZE below. LOCALE SUPPORT - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character value. When running in UTF-8 mode, this applies only to - characters with codes less than 128. By default, higher-valued codes - never match escapes such as \w or \d, but they can be tested with \p if - PCRE is built with Unicode character property support. Alternatively, - the PCRE_UCP option can be set at compile time; this causes \w and - friends to use Unicode property support instead of built-in tables. The - use of locales with Unicode is discouraged. If you are handling charac- - ters with codes greater than 128, you should either use UTF-8 and Uni- - code, or use locales, but not try to mix the two. + PCRE handles caseless matching, and determines whether characters are + letters, digits, or whatever, by reference to a set of tables, indexed + by character code point. When running in UTF-8 mode, or in the 16- or + 32-bit libraries, this applies only to characters with code points less + than 256. By default, higher-valued code points never match escapes + such as \w or \d. However, if PCRE is built with Unicode property sup- + port, all characters can be tested with \p and \P, or, alternatively, + the PCRE_UCP option can be set when a pattern is compiled; this causes + \w and friends to use Unicode property support instead of the built-in + tables. + + The use of locales with Unicode is discouraged. If you are handling + characters with code points greater than 128, you should either use + Unicode support, or use locales, but not try to mix the two. PCRE contains an internal set of tables that are used when the final argument of pcre_compile() is NULL. These are sufficient for many @@ -2533,10 +2620,10 @@ LOCALE SUPPORT External tables are built by calling the pcre_maketables() function, which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() or pcre_exec() as often as necessary. For - example, to build and use tables that are appropriate for the French - locale (where accented characters with values greater than 128 are - treated as letters), the following code could be used: + passed to pcre_compile() as often as necessary. For example, to build + and use tables that are appropriate for the French locale (where + accented characters with values greater than 128 are treated as let- + ters), the following code could be used: setlocale(LC_CTYPE, "fr_FR"); tables = pcre_maketables(); @@ -2552,15 +2639,19 @@ LOCALE SUPPORT The pointer that is passed to pcre_compile() is saved with the compiled pattern, and the same tables are used via this pointer by pcre_study() - and normally also by pcre_exec(). Thus, by default, for any single pat- + and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat- tern, compilation, studying and matching all happen in the same locale, - but different patterns can be compiled in different locales. + but different patterns can be processed in different locales. It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec(). Although not intended for this - purpose, this facility could be used to match a pattern in a different - locale from the one in which it was compiled. Passing table pointers at - run time is discussed below in the section on matching a pattern. + the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus- + sion below in the section on matching a pattern). This facility is pro- + vided for use with pre-compiled patterns that have been saved and + reloaded. Character tables are not saved with patterns, so if a non- + standard table was used at compile time, it must be provided again when + the reloaded pattern is matched. Attempting to use this facility to + match a pattern in a different locale from the one in which it was com- + piled is likely to lead to anomalous (usually incorrect) results. INFORMATION ABOUT A PATTERN @@ -2585,6 +2676,7 @@ INFORMATION ABOUT A PATTERN PCRE_ERROR_BADENDIANNESS the pattern was compiled with different endianness PCRE_ERROR_BADOPTION the value of what was invalid + PCRE_ERROR_UNSET the requested field is not set The "magic number" is placed at the start of each compiled pattern as an simple check against passing an arbitrary memory pointer. The endi- @@ -2700,23 +2792,41 @@ INFORMATION ABOUT A PATTERN /^a\dz\d/ the returned value is -1. Since for the 32-bit library using the non-UTF-32 mode, this function - is unable to return the full 32-bit range of the character, this value - is deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and + is unable to return the full 32-bit range of characters, this value is + deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should be used. + PCRE_INFO_MATCH_EMPTY + + Return 1 if the pattern can match an empty string, otherwise 0. The + fourth argument should point to an int variable. + + PCRE_INFO_MATCHLIMIT + + If the pattern set a match limit by including an item of the form + (*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth + argument should point to an unsigned 32-bit integer. If no such value + has been set, the call to pcre_fullinfo() returns the error + PCRE_ERROR_UNSET. + PCRE_INFO_MAXLOOKBEHIND - Return the number of characters (NB not bytes) in the longest lookbe- - hind assertion in the pattern. Note that the simple assertions \b and - \B require a one-character lookbehind. This information is useful when - doing multi-segment matching using the partial matching facilities. + Return the number of characters (NB not data units) in the longest + lookbehind assertion in the pattern. This information is useful when + doing multi-segment matching using the partial matching facilities. + Note that the simple assertions \b and \B require a one-character look- + behind. \A also registers a one-character lookbehind, though it does + not actually inspect the previous character. This is to ensure that at + least one character from the old segment is retained when a new segment + is processed. Otherwise, if there are no lookbehinds in the pattern, \A + might match incorrectly at the start of a new segment. PCRE_INFO_MINLENGTH If the pattern was studied and a minimum length for matching subject strings was computed, its value is returned. Otherwise the returned - value is -1. The value is a number of characters, which in UTF-8 mode - may be different from the number of bytes. The fourth argument should + value is -1. The value is a number of characters, which in UTF mode may + be different from the number of data units. The fourth argument should point to an int variable. A non-negative value is a lower bound to the length of any matching string. There may not be any strings of that length that do actually match, but every string that does match is at @@ -2744,30 +2854,31 @@ INFORMATION ABOUT A PATTERN the 8-bit library, where the first two bytes of each entry are the num- ber of the capturing parenthesis, most significant byte first. In the 16-bit library, the pointer points to 16-bit data units, the first of - which contains the parenthesis number. In the 32-bit library, the + which contains the parenthesis number. In the 32-bit library, the pointer points to 32-bit data units, the first of which contains the parenthesis number. The rest of the entry is the corresponding name, zero terminated. - The names are in alphabetical order. Duplicate names may appear if (?| - is used to create multiple groups with the same number, as described in - the section on duplicate subpattern numbers in the pcrepattern page. - Duplicate names for subpatterns with different numbers are permitted - only if PCRE_DUPNAMES is set. In all cases of duplicate names, they - appear in the table in the order in which they were found in the pat- - tern. In the absence of (?| this is the order of increasing number; - when (?| is used this is not necessarily the case because later subpat- - terns may have lower numbers. - - As a simple example of the name/number table, consider the following + The names are in alphabetical order. If (?| is used to create multiple + groups with the same number, as described in the section on duplicate + subpattern numbers in the pcrepattern page, the groups may be given the + same name, but there is only one entry in the table. Different names + for groups of the same number are not permitted. Duplicate names for + subpatterns with different numbers are permitted, but only if PCRE_DUP- + NAMES is set. They appear in the table in the order in which they were + found in the pattern. In the absence of (?| this is the order of + increasing number; when (?| is used this is not necessarily the case + because later subpatterns may have lower numbers. + + As a simple example of the name/number table, consider the following pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white space - including newlines - is ignored): (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) ) - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, + There are four named subpatterns, so the table has four entries, and + each entry in the table is eight bytes long. The table is as follows, with non-printing bytes shows in hexadecimal, and undefined bytes shown as ??: @@ -2776,31 +2887,31 @@ INFORMATION ABOUT A PATTERN 00 04 m o n t h 00 00 02 y e a r 00 ?? - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of the entries is likely + When writing code to extract data from named subpatterns using the + name-to-number map, remember that the length of the entries is likely to be different for each compiled pattern. PCRE_INFO_OKPARTIAL - Return 1 if the pattern can be used for partial matching with - pcre_exec(), otherwise 0. The fourth argument should point to an int - variable. From release 8.00, this always returns 1, because the - restrictions that previously applied to partial matching have been - lifted. The pcrepartial documentation gives details of partial match- + Return 1 if the pattern can be used for partial matching with + pcre_exec(), otherwise 0. The fourth argument should point to an int + variable. From release 8.00, this always returns 1, because the + restrictions that previously applied to partial matching have been + lifted. The pcrepartial documentation gives details of partial match- ing. PCRE_INFO_OPTIONS - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These + Return a copy of the options with which the pattern was compiled. The + fourth argument should point to an unsigned long int variable. These option bits are those specified in the call to pcre_compile(), modified by any top-level option settings at the start of the pattern itself. In - other words, they are the options that will be in force when matching - starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with - the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, + other words, they are the options that will be in force when matching + starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with + the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. - A pattern is automatically anchored by PCRE if all of its top-level + A pattern is automatically anchored by PCRE if all of its top-level alternatives begin with one of the following: ^ unless PCRE_MULTILINE is set @@ -2812,42 +2923,50 @@ INFORMATION ABOUT A PATTERN For such patterns, the PCRE_ANCHORED bit is set in the options returned by pcre_fullinfo(). + PCRE_INFO_RECURSIONLIMIT + + If the pattern set a recursion limit by including an item of the form + (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth + argument should point to an unsigned 32-bit integer. If no such value + has been set, the call to pcre_fullinfo() returns the error + PCRE_ERROR_UNSET. + PCRE_INFO_SIZE - Return the size of the compiled pattern in bytes (for both libraries). - The fourth argument should point to a size_t variable. This value does - not include the size of the pcre structure that is returned by - pcre_compile(). The value that is passed as the argument to pcre_mal- - loc() when pcre_compile() is getting memory in which to place the com- - piled data is the value returned by this option plus the size of the - pcre structure. Studying a compiled pattern, with or without JIT, does - not alter the value returned by this option. + Return the size of the compiled pattern in bytes (for all three + libraries). The fourth argument should point to a size_t variable. This + value does not include the size of the pcre structure that is returned + by pcre_compile(). The value that is passed as the argument to + pcre_malloc() when pcre_compile() is getting memory in which to place + the compiled data is the value returned by this option plus the size of + the pcre structure. Studying a compiled pattern, with or without JIT, + does not alter the value returned by this option. PCRE_INFO_STUDYSIZE - Return the size in bytes of the data block pointed to by the study_data - field in a pcre_extra block. If pcre_extra is NULL, or there is no - study data, zero is returned. The fourth argument should point to a - size_t variable. The study_data field is set by pcre_study() to record - information that will speed up matching (see the section entitled - "Studying a pattern" above). The format of the study_data block is pri- - vate, but its length is made available via this option so that it can - be saved and restored (see the pcreprecompile documentation for - details). + Return the size in bytes (for all three libraries) of the data block + pointed to by the study_data field in a pcre_extra block. If pcre_extra + is NULL, or there is no study data, zero is returned. The fourth argu- + ment should point to a size_t variable. The study_data field is set by + pcre_study() to record information that will speed up matching (see the + section entitled "Studying a pattern" above). The format of the + study_data block is private, but its length is made available via this + option so that it can be saved and restored (see the pcreprecompile + documentation for details). PCRE_INFO_FIRSTCHARACTERFLAGS Return information about the first data unit of any matched string, for - a non-anchored pattern. The fourth argument should point to an int + a non-anchored pattern. The fourth argument should point to an int variable. - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), 1 is returned, and the character + If there is a fixed first value, for example, the letter "c" from a + pattern such as (cat|cow|coyote), 1 is returned, and the character value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and if either - (a) the pattern was compiled with the PCRE_MULTILINE option, and every + (a) the pattern was compiled with the PCRE_MULTILINE option, and every branch starts with "^", or (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not @@ -2859,45 +2978,33 @@ INFORMATION ABOUT A PATTERN PCRE_INFO_FIRSTCHARACTER - Return the fixed first character value, if PCRE_INFO_FIRSTCHARACTER- - FLAGS returned 1; otherwise returns 0. The fourth argument should point - to an uint_t variable. + Return the fixed first character value in the situation where + PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; otherwise return 0. The fourth + argument should point to an uint_t variable. - In the 8-bit library, the value is always less than 256. In the 16-bit - library the value can be up to 0xffff. In the 32-bit library in UTF-32 - mode the value can be up to 0x10ffff, and up to 0xffffffff when not + In the 8-bit library, the value is always less than 256. In the 16-bit + library the value can be up to 0xffff. In the 32-bit library in UTF-32 + mode the value can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. - If there is no fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise - -2 is returned. For anchored patterns, -2 is returned. - PCRE_INFO_REQUIREDCHARFLAGS - Returns 1 if there is a rightmost literal data unit that must exist in + Returns 1 if there is a rightmost literal data unit that must exist in any matched string, other than at its start. The fourth argument should - point to an int variable. If there is no such value, 0 is returned. If + point to an int variable. If there is no such value, 0 is returned. If returning 1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. For anchored patterns, a last literal value is recorded only if it fol- - lows something of variable length. For example, for the pattern - /^a\d+z\d+/ the returned value 1 (with "z" returned from + lows something of variable length. For example, for the pattern + /^a\d+z\d+/ the returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for /^a\dz\d/ the returned value is 0. PCRE_INFO_REQUIREDCHAR - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an uint32_t variable. If + Return the value of the rightmost literal data unit that must exist in + any matched string, other than at its start, if such a value has been + recorded. The fourth argument should point to an uint32_t variable. If there is no such value, 0 is returned. @@ -2905,21 +3012,21 @@ REFERENCE COUNTS int pcre_refcount(pcre *code, int adjust); - The pcre_refcount() function is used to maintain a reference count in + The pcre_refcount() function is used to maintain a reference count in the data block that contains a compiled pattern. It is provided for the - benefit of applications that operate in an object-oriented manner, + benefit of applications that operate in an object-oriented manner, where different parts of the application may be using the same compiled pattern, but you want to free the block when they are all done. When a pattern is compiled, the reference count field is initialized to - zero. It is changed only by calling this function, whose action is to - add the adjust value (which may be positive or negative) to it. The + zero. It is changed only by calling this function, whose action is to + add the adjust value (which may be positive or negative) to it. The yield of the function is the new value. However, the value of the count - is constrained to lie between 0 and 65535, inclusive. If the new value + is constrained to lie between 0 and 65535, inclusive. If the new value is outside these limits, it is forced to the appropriate limit value. - Except when it is zero, the reference count is not correctly preserved - if a pattern is compiled on one host and then transferred to a host + Except when it is zero, the reference count is not correctly preserved + if a pattern is compiled on one host and then transferred to a host whose byte-order is different. (This seems a highly unlikely scenario.) @@ -2929,22 +3036,22 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize); - The function pcre_exec() is called to match a subject string against a - compiled pattern, which is passed in the code argument. If the pattern - was studied, the result of the study should be passed in the extra - argument. You can call pcre_exec() with the same code and extra argu- - ments as many times as you like, in order to match different subject + The function pcre_exec() is called to match a subject string against a + compiled pattern, which is passed in the code argument. If the pattern + was studied, the result of the study should be passed in the extra + argument. You can call pcre_exec() with the same code and extra argu- + ments as many times as you like, in order to match different subject strings with the same pattern. - This function is the main matching facility of the library, and it - operates in a Perl-like manner. For specialist use there is also an - alternative matching function, which is described below in the section + This function is the main matching facility of the library, and it + operates in a Perl-like manner. For specialist use there is also an + alternative matching function, which is described below in the section about the pcre_dfa_exec() function. - In most applications, the pattern will have been compiled (and option- - ally studied) in the same process that calls pcre_exec(). However, it + In most applications, the pattern will have been compiled (and option- + ally studied) in the same process that calls pcre_exec(). However, it is possible to save compiled patterns and study data, and then use them - later in different processes, possibly even on different hosts. For a + later in different processes, possibly even on different hosts. For a discussion about this, see the pcreprecompile documentation. Here is an example of a simple call to pcre_exec(): @@ -2963,10 +3070,10 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION Extra data for pcre_exec() - If the extra argument is not NULL, it must point to a pcre_extra data - block. The pcre_study() function returns such a block (when it doesn't - return NULL), but you can also create one for yourself, and pass addi- - tional information in it. The pcre_extra block contains the following + If the extra argument is not NULL, it must point to a pcre_extra data + block. The pcre_study() function returns such a block (when it doesn't + return NULL), but you can also create one for yourself, and pass addi- + tional information in it. The pcre_extra block contains the following fields (not necessarily in this order): unsigned long int flags; @@ -2978,13 +3085,13 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION const unsigned char *tables; unsigned char **mark; - In the 16-bit version of this structure, the mark field has type + In the 16-bit version of this structure, the mark field has type "PCRE_UCHAR16 **". - In the 32-bit version of this structure, the mark field has type + In the 32-bit version of this structure, the mark field has type "PCRE_UCHAR32 **". - The flags field is used to specify which of the other fields are set. + The flags field is used to specify which of the other fields are set. The flag bits are: PCRE_EXTRA_CALLOUT_DATA @@ -2995,39 +3102,48 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_EXTRA_STUDY_DATA PCRE_EXTRA_TABLES - Other flag bits should be set to zero. The study_data field and some- - times the executable_jit field are set in the pcre_extra block that is - returned by pcre_study(), together with the appropriate flag bits. You - should not set these yourself, but you may add to the block by setting + Other flag bits should be set to zero. The study_data field and some- + times the executable_jit field are set in the pcre_extra block that is + returned by pcre_study(), together with the appropriate flag bits. You + should not set these yourself, but you may add to the block by setting other fields and their corresponding flag bits. The match_limit field provides a means of preventing PCRE from using up - a vast amount of resources when running patterns that are not going to - match, but which have a very large number of possibilities in their - search trees. The classic example is a pattern that uses nested unlim- + a vast amount of resources when running patterns that are not going to + match, but which have a very large number of possibilities in their + search trees. The classic example is a pattern that uses nested unlim- ited repeats. - Internally, pcre_exec() uses a function called match(), which it calls - repeatedly (sometimes recursively). The limit set by match_limit is - imposed on the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking that can + Internally, pcre_exec() uses a function called match(), which it calls + repeatedly (sometimes recursively). The limit set by match_limit is + imposed on the number of times this function is called during a match, + which has the effect of limiting the amount of backtracking that can take place. For patterns that are not anchored, the count restarts from zero for each position in the subject string. When pcre_exec() is called with a pattern that was successfully studied - with a JIT option, the way that the matching is executed is entirely + with a JIT option, the way that the matching is executed is entirely different. However, there is still the possibility of runaway matching that goes on for a very long time, and so the match_limit value is also used in this case (but in a different way) to limit how long the match- ing can continue. - The default value for the limit can be set when PCRE is built; the - default default is 10 million, which handles all but the most extreme - cases. You can override the default by suppling pcre_exec() with a - pcre_extra block in which match_limit is set, and - PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is + The default value for the limit can be set when PCRE is built; the + default default is 10 million, which handles all but the most extreme + cases. You can override the default by suppling pcre_exec() with a + pcre_extra block in which match_limit is set, and + PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. + A value for the match limit may also be supplied by an item at the + start of a pattern of the form + + (*LIMIT_MATCH=d) + + where d is a decimal number. However, such a setting is ignored unless + d is less than the limit set by the caller of pcre_exec() or, if no + such limit is set, less than the default. + The match_limit_recursion field is similar to match_limit, but instead of limiting the total number of times that match() is called, it limits the depth of recursion. The recursion depth is a smaller number than @@ -3047,60 +3163,73 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. - The callout_data field is used in conjunction with the "callout" fea- + A value for the recursion limit may also be supplied by an item at the + start of a pattern of the form + + (*LIMIT_RECURSION=d) + + where d is a decimal number. However, such a setting is ignored unless + d is less than the limit set by the caller of pcre_exec() or, if no + such limit is set, less than the default. + + The callout_data field is used in conjunction with the "callout" fea- ture, and is described in the pcrecallout documentation. - The tables field is used to pass a character tables pointer to - pcre_exec(); this overrides the value that is stored with the compiled - pattern. A non-NULL value is stored with the compiled pattern only if - custom tables were supplied to pcre_compile() via its tableptr argu- - ment. If NULL is passed to pcre_exec() using this mechanism, it forces - PCRE's internal tables to be used. This facility is helpful when re- - using patterns that have been saved after compiling with an external - set of tables, because the external tables might be at a different - address when pcre_exec() is called. See the pcreprecompile documenta- - tion for a discussion of saving compiled patterns for later use. - - If PCRE_EXTRA_MARK is set in the flags field, the mark field must be - set to point to a suitable variable. If the pattern contains any back- - tracking control verbs such as (*MARK:NAME), and the execution ends up - with a name to pass back, a pointer to the name string (zero termi- - nated) is placed in the variable pointed to by the mark field. The - names are within the compiled pattern; if you wish to retain such a - name you must copy it before freeing the memory of a compiled pattern. - If there is no name to pass back, the variable pointed to by the mark - field is set to NULL. For details of the backtracking control verbs, + The tables field is provided for use with patterns that have been pre- + compiled using custom character tables, saved to disc or elsewhere, and + then reloaded, because the tables that were used to compile a pattern + are not saved with it. See the pcreprecompile documentation for a dis- + cussion of saving compiled patterns for later use. If NULL is passed + using this mechanism, it forces PCRE's internal tables to be used. + + Warning: The tables that pcre_exec() uses must be the same as those + that were used when the pattern was compiled. If this is not the case, + the behaviour of pcre_exec() is undefined. Therefore, when a pattern is + compiled and matched in the same process, this field should never be + set. In this (the most common) case, the correct table pointer is auto- + matically passed with the compiled pattern from pcre_compile() to + pcre_exec(). + + If PCRE_EXTRA_MARK is set in the flags field, the mark field must be + set to point to a suitable variable. If the pattern contains any back- + tracking control verbs such as (*MARK:NAME), and the execution ends up + with a name to pass back, a pointer to the name string (zero termi- + nated) is placed in the variable pointed to by the mark field. The + names are within the compiled pattern; if you wish to retain such a + name you must copy it before freeing the memory of a compiled pattern. + If there is no name to pass back, the variable pointed to by the mark + field is set to NULL. For details of the backtracking control verbs, see the section entitled "Backtracking control" in the pcrepattern doc- umentation. Option bits for pcre_exec() - The unused bits of the options argument for pcre_exec() must be zero. - The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, - PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and + The unused bits of the options argument for pcre_exec() must be zero. + The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, + PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, + PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. - If the pattern was successfully studied with one of the just-in-time + If the pattern was successfully studied with one of the just-in-time (JIT) compile options, the only supported options for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an - unsupported option is used, JIT execution is disabled and the normal + PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, + PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an + unsupported option is used, JIT execution is disabled and the normal interpretive code in pcre_exec() is run. PCRE_ANCHORED - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made + The PCRE_ANCHORED option limits pcre_exec() to matching at the first + matching position. If a pattern was compiled with PCRE_ANCHORED, or + turned out to be anchored by virtue of its contents, it cannot be made unachored at matching time. PCRE_BSR_ANYCRLF PCRE_BSR_UNICODE These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. These options override the + sequence matches. The choice is either to match only CR, LF, or CRLF, + or to match any Unicode newline sequence. These options override the choice that was made or defaulted when the pattern was compiled. PCRE_NEWLINE_CR @@ -3109,109 +3238,110 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_NEWLINE_ANYCRLF PCRE_NEWLINE_ANY - These options override the newline definition that was chosen or - defaulted when the pattern was compiled. For details, see the descrip- - tion of pcre_compile() above. During matching, the newline choice - affects the behaviour of the dot, circumflex, and dollar metacharac- - ters. It may also alter the way the match position is advanced after a + These options override the newline definition that was chosen or + defaulted when the pattern was compiled. For details, see the descrip- + tion of pcre_compile() above. During matching, the newline choice + affects the behaviour of the dot, circumflex, and dollar metacharac- + ters. It may also alter the way the match position is advanced after a match failure for an unanchored pattern. - When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is - set, and a match attempt for an unanchored pattern fails when the cur- - rent position is at a CRLF sequence, and the pattern contains no - explicit matches for CR or LF characters, the match position is + When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is + set, and a match attempt for an unanchored pattern fails when the cur- + rent position is at a CRLF sequence, and the pattern contains no + explicit matches for CR or LF characters, the match position is advanced by two characters instead of one, in other words, to after the CRLF. The above rule is a compromise that makes the most common cases work as - expected. For example, if the pattern is .+A (and the PCRE_DOTALL + expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not set), it does not match the string "\r\nA" because, after - failing at the start, it skips both the CR and the LF before retrying. - However, the pattern [\r\n]A does match that string, because it con- + failing at the start, it skips both the CR and the LF before retrying. + However, the pattern [\r\n]A does match that string, because it con- tains an explicit CR or LF reference, and so advances only by one char- acter after the first failure. An explicit match for CR of LF is either a literal appearance of one of - those characters, or one of the \r or \n escape sequences. Implicit - matches such as [^X] do not count, nor does \s (which includes CR and + those characters, or one of the \r or \n escape sequences. Implicit + matches such as [^X] do not count, nor does \s (which includes CR and LF in the characters that it matches). - Notwithstanding the above, anomalous effects may still occur when CRLF + Notwithstanding the above, anomalous effects may still occur when CRLF is a valid newline sequence and explicit \r or \n escapes appear in the pattern. PCRE_NOTBOL This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the behav- + the beginning of a line, so the circumflex metacharacter should not + match before it. Setting this without PCRE_MULTILINE (at compile time) + causes circumflex never to match. This option affects only the behav- iour of the circumflex metacharacter. It does not affect \A. PCRE_NOTEOL This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- + of a line, so the dollar metacharacter should not match it nor (except + in multiline mode) a newline immediately before it. Setting this with- out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does + option affects only the behaviour of the dollar metacharacter. It does not affect \Z or \z. PCRE_NOTEMPTY An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For + set. If there are alternatives in the pattern, they are tried. If all + the alternatives match the empty string, the entire match fails. For example, if the pattern a?b? - is applied to a string not beginning with "a" or "b", it matches an - empty string at the start of the subject. With PCRE_NOTEMPTY set, this + is applied to a string not beginning with "a" or "b", it matches an + empty string at the start of the subject. With PCRE_NOTEMPTY set, this match is not valid, so PCRE searches further into the string for occur- rences of "a" or "b". PCRE_NOTEMPTY_ATSTART - This is like PCRE_NOTEMPTY, except that an empty string match that is - not at the start of the subject is permitted. If the pattern is + This is like PCRE_NOTEMPTY, except that an empty string match that is + not at the start of the subject is permitted. If the pattern is anchored, such a match can occur only if the pattern contains \K. - Perl has no direct equivalent of PCRE_NOTEMPTY or - PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern - match of the empty string within its split() function, and when using - the /g modifier. It is possible to emulate Perl's behaviour after + Perl has no direct equivalent of PCRE_NOTEMPTY or + PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern + match of the empty string within its split() function, and when using + the /g modifier. It is possible to emulate Perl's behaviour after matching a null string by first trying the match again at the same off- - set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that + set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that fails, by advancing the starting offset (see below) and trying an ordi- - nary match again. There is some code that demonstrates how to do this - in the pcredemo sample program. In the most general case, you have to - check to see if the newline convention recognizes CRLF as a newline, - and if so, and the current character is CR followed by LF, advance the + nary match again. There is some code that demonstrates how to do this + in the pcredemo sample program. In the most general case, you have to + check to see if the newline convention recognizes CRLF as a newline, + and if so, and the current character is CR followed by LF, advance the starting offset by two characters instead of one. PCRE_NO_START_OPTIMIZE - There are a number of optimizations that pcre_exec() uses at the start - of a match, in order to speed up the process. For example, if it is + There are a number of optimizations that pcre_exec() uses at the start + of a match, in order to speed up the process. For example, if it is known that an unanchored match must start with a specific character, it - searches the subject for that character, and fails immediately if it - cannot find it, without actually running the main matching function. + searches the subject for that character, and fails immediately if it + cannot find it, without actually running the main matching function. This means that a special item such as (*COMMIT) at the start of a pat- - tern is not considered until after a suitable starting point for the - match has been found. When callouts or (*MARK) items are in use, these - "start-up" optimizations can cause them to be skipped if the pattern is - never actually used. The start-up optimizations are in effect a pre- - scan of the subject that takes place before the pattern is run. - - The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, - possibly causing performance to suffer, but ensuring that in cases - where the result is "no match", the callouts do occur, and that items + tern is not considered until after a suitable starting point for the + match has been found. Also, when callouts or (*MARK) items are in use, + these "start-up" optimizations can cause them to be skipped if the pat- + tern is never actually used. The start-up optimizations are in effect a + pre-scan of the subject that takes place before the pattern is run. + + The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, + possibly causing performance to suffer, but ensuring that in cases + where the result is "no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) are considered at every possible starting - position in the subject string. If PCRE_NO_START_OPTIMIZE is set at - compile time, it cannot be unset at matching time. The use of - PCRE_NO_START_OPTIMIZE disables JIT execution; when it is set, matching - is always done using interpretively. + position in the subject string. If PCRE_NO_START_OPTIMIZE is set at + compile time, it cannot be unset at matching time. The use of + PCRE_NO_START_OPTIMIZE at matching time (that is, passing it to + pcre_exec()) disables JIT execution; in this situation, matching is + always done using interpretively. Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. Consider the pattern @@ -3267,7 +3397,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION points to the start of a character (or the end of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a subject or an invalid value of startoffset is undefined. Your program - may crash. + may crash or loop. PCRE_PARTIAL_HARD PCRE_PARTIAL_SOFT @@ -3297,149 +3427,156 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The string to be matched by pcre_exec() The subject string is passed to pcre_exec() as a pointer in subject, a - length in bytes in length, and a starting byte offset in startoffset. - If this is negative or greater than the length of the subject, + length in length, and a starting offset in startoffset. The units for + length and startoffset are bytes for the 8-bit library, 16-bit data + items for the 16-bit library, and 32-bit data items for the 32-bit + library. + + If startoffset is negative or greater than the length of the subject, pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is zero, the search for a match starts at the beginning of the subject, - and this is by far the most common case. In UTF-8 mode, the byte offset - must point to the start of a UTF-8 character (or the end of the sub- - ject). Unlike the pattern string, the subject may contain binary zero - bytes. - - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins + and this is by far the most common case. In UTF-8 or UTF-16 mode, the + offset must point to the start of a character, or the end of the sub- + ject (in UTF-32 mode, one data unit equals one character, so all off- + sets are valid). Unlike the pattern string, the subject may contain + binary zeroes. + + A non-zero starting offset is useful when searching for another match + in the same subject by calling pcre_exec() again after a previous suc- + cess. Setting startoffset differs from just passing over a shortened + string and setting PCRE_NOTBOL in the case of a pattern that begins with any kind of lookbehind. For example, consider the pattern \Biss\B - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, + which finds occurrences of "iss" in the middle of words. (\B matches + only if the current position in the subject is not a word boundary.) + When applied to the string "Mississipi" the first call to pcre_exec() + finds the first occurrence. If pcre_exec() is called again with just + the remainder of the subject, namely "issipi", it does not match, because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire + to be a word boundary. However, if pcre_exec() is passed the entire string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to + rence of "iss" because it is able to look behind the starting point to discover that it is preceded by a letter. - Finding all the matches in a subject is tricky when the pattern can + Finding all the matches in a subject is tricky when the pattern can match an empty string. It is possible to emulate Perl's /g behaviour by - first trying the match again at the same offset, with the - PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that - fails, advancing the starting offset and trying an ordinary match + first trying the match again at the same offset, with the + PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that + fails, advancing the starting offset and trying an ordinary match again. There is some code that demonstrates how to do this in the pcre- demo sample program. In the most general case, you have to check to see - if the newline convention recognizes CRLF as a newline, and if so, and + if the newline convention recognizes CRLF as a newline, and if so, and the current character is CR followed by LF, advance the starting offset by two characters instead of one. - If a non-zero starting offset is passed when the pattern is anchored, + If a non-zero starting offset is passed when the pattern is anchored, one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the + if the pattern does not require the match to be at the start of the subject. How pcre_exec() returns captured substrings - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern + In general, a pattern matches a certain portion of the subject, and in + addition, further substrings from the subject may be picked out by + parts of the pattern. Following the usage in Jeffrey Friedl's book, + this is called "capturing" in what follows, and the phrase "capturing + subpattern" is used for a fragment of a pattern that picks out a sub- + string. PCRE supports several other kinds of parenthesized subpattern that do not cause substrings to be captured. Captured substrings are returned to the caller via a vector of integers - whose address is passed in ovector. The number of elements in the vec- - tor is passed in ovecsize, which must be a non-negative number. Note: + whose address is passed in ovector. The number of elements in the vec- + tor is passed in ovecsize, which must be a non-negative number. Note: this argument is NOT the size of ovector in bytes. - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The number passed in ovecsize should always be a multiple of three. If + The first two-thirds of the vector is used to pass back captured sub- + strings, each substring using a pair of integers. The remaining third + of the vector is used as workspace by pcre_exec() while matching cap- + turing subpatterns, and is not available for passing back information. + The number passed in ovecsize should always be a multiple of three. If it is not, it is rounded down. - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of each pair is set to the byte offset of the first character - in a substring, and the second is set to the byte offset of the first - character after the end of a substring. Note: these values are always - byte offsets, even in UTF-8 mode. They are not character counts. - - The first pair of integers, ovector[0] and ovector[1], identify the - portion of the subject string matched by the entire pattern. The next - pair is used for the first capturing subpattern, and so on. The value + When a match is successful, information about captured substrings is + returned in pairs of integers, starting at the beginning of ovector, + and continuing up to two-thirds of its length at the most. The first + element of each pair is set to the offset of the first character in a + substring, and the second is set to the offset of the first character + after the end of a substring. These values are always data unit off- + sets, even in UTF mode. They are byte offsets in the 8-bit library, + 16-bit data item offsets in the 16-bit library, and 32-bit data item + offsets in the 32-bit library. Note: they are not character counts. + + The first pair of integers, ovector[0] and ovector[1], identify the + portion of the subject string matched by the entire pattern. The next + pair is used for the first capturing subpattern, and so on. The value returned by pcre_exec() is one more than the highest numbered pair that - has been set. For example, if two substrings have been captured, the - returned value is 3. If there are no capturing subpatterns, the return + has been set. For example, if two substrings have been captured, the + returned value is 3. If there are no capturing subpatterns, the return value from a successful match is 1, indicating that just the first pair of offsets has been set. If a capturing subpattern is matched repeatedly, it is the last portion of the string that it matched that is returned. - If the vector is too small to hold all the captured substring offsets, + If the vector is too small to hold all the captured substring offsets, it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. If neither the actual string matched - nor any captured substrings are of interest, pcre_exec() may be called - with ovector passed as NULL and ovecsize as zero. However, if the pat- - tern contains back references and the ovector is not big enough to - remember the related substrings, PCRE has to get additional memory for - use during matching. Thus it is usually advisable to supply an ovector + function returns a value of zero. If neither the actual string matched + nor any captured substrings are of interest, pcre_exec() may be called + with ovector passed as NULL and ovecsize as zero. However, if the pat- + tern contains back references and the ovector is not big enough to + remember the related substrings, PCRE has to get additional memory for + use during matching. Thus it is usually advisable to supply an ovector of reasonable size. - There are some cases where zero is returned (indicating vector over- - flow) when in fact the vector is exactly the right size for the final + There are some cases where zero is returned (indicating vector over- + flow) when in fact the vector is exactly the right size for the final match. For example, consider the pattern (a)(?:(b)c|bd) - If a vector of 6 elements (allowing for only 1 captured substring) is + If a vector of 6 elements (allowing for only 1 captured substring) is given with subject string "abd", pcre_exec() will try to set the second captured string, thereby recording a vector overflow, before failing to - match "c" and backing up to try the second alternative. The zero - return, however, does correctly indicate that the maximum number of + match "c" and backing up to try the second alternative. The zero + return, however, does correctly indicate that the maximum number of slots (namely 2) have been filled. In similar cases where there is tem- - porary overflow, but the final number of used slots is actually less + porary overflow, but the final number of used slots is actually less than the maximum, a non-zero value is returned. The pcre_fullinfo() function can be used to find out how many capturing - subpatterns there are in a compiled pattern. The smallest size for - ovector that will allow for n captured substrings, in addition to the + subpatterns there are in a compiled pattern. The smallest size for + ovector that will allow for n captured substrings, in addition to the offsets of the substring matched by the whole pattern, is (n+1)*3. - It is possible for capturing subpattern number n+1 to match some part + It is possible for capturing subpattern number n+1 to match some part of the subject when subpattern n has not been used at all. For example, - if the string "abc" is matched against the pattern (a|(z))(bc) the + if the string "abc" is matched against the pattern (a|(z))(bc) the return from the function is 4, and subpatterns 1 and 3 are matched, but - 2 is not. When this happens, both values in the offset pairs corre- + 2 is not. When this happens, both values in the offset pairs corre- sponding to unused subpatterns are set to -1. - Offset values that correspond to unused subpatterns at the end of the - expression are also set to -1. For example, if the string "abc" is - matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not - matched. The return from the function is 2, because the highest used - capturing subpattern number is 1, and the offsets for for the second - and third capturing subpatterns (assuming the vector is large enough, + Offset values that correspond to unused subpatterns at the end of the + expression are also set to -1. For example, if the string "abc" is + matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not + matched. The return from the function is 2, because the highest used + capturing subpattern number is 1, and the offsets for for the second + and third capturing subpatterns (assuming the vector is large enough, of course) are set to -1. - Note: Elements in the first two-thirds of ovector that do not corre- - spond to capturing parentheses in the pattern are never changed. That - is, if a pattern contains n capturing parentheses, no more than ovec- - tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in + Note: Elements in the first two-thirds of ovector that do not corre- + spond to capturing parentheses in the pattern are never changed. That + is, if a pattern contains n capturing parentheses, no more than ovec- + tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in the first two-thirds) retain whatever values they previously had. - Some convenience functions are provided for extracting the captured + Some convenience functions are provided for extracting the captured substrings as separate strings. These are described below. Error return values from pcre_exec() - If pcre_exec() fails, it returns a negative number. The following are + If pcre_exec() fails, it returns a negative number. The following are defined in the header file: PCRE_ERROR_NOMATCH (-1) @@ -3448,7 +3585,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_NULL (-2) - Either code or subject was passed as NULL, or ovector was NULL and + Either code or subject was passed as NULL, or ovector was NULL and ovecsize was not zero. PCRE_ERROR_BADOPTION (-3) @@ -3457,82 +3594,82 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_BADMAGIC (-4) - PCRE stores a 4-byte "magic number" at the start of the compiled code, + PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch the case when it is passed a junk pointer and to detect when a pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE + an environment with the other endianness. This is the error that PCRE gives when the magic number is not present. PCRE_ERROR_UNKNOWN_OPCODE (-5) While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by + compiled pattern. This error could be caused by a bug in PCRE or by overwriting of the compiled pattern. PCRE_ERROR_NOMEMORY (-6) - If a pattern contains back references, but the ovector that is passed + If a pattern contains back references, but the ovector that is passed to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The + PCRE gets a block of memory at the start of matching to use for this + purpose. If the call via pcre_malloc() fails, this error is given. The memory is automatically freed at the end of matching. - This error is also given if pcre_stack_malloc() fails in pcre_exec(). - This can happen only when PCRE has been compiled with --disable-stack- + This error is also given if pcre_stack_malloc() fails in pcre_exec(). + This can happen only when PCRE has been compiled with --disable-stack- for-recursion. PCRE_ERROR_NOSUBSTRING (-7) - This error is used by the pcre_copy_substring(), pcre_get_substring(), + This error is used by the pcre_copy_substring(), pcre_get_substring(), and pcre_get_substring_list() functions (see below). It is never returned by pcre_exec(). PCRE_ERROR_MATCHLIMIT (-8) - The backtracking limit, as specified by the match_limit field in a - pcre_extra structure (or defaulted) was reached. See the description + The backtracking limit, as specified by the match_limit field in a + pcre_extra structure (or defaulted) was reached. See the description above. PCRE_ERROR_CALLOUT (-9) This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. + use by callout functions that want to yield a distinctive error code. See the pcrecallout documentation for details. PCRE_ERROR_BADUTF8 (-10) - A string that contains an invalid UTF-8 byte sequence was passed as a - subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of - the output vector (ovecsize) is at least 2, the byte offset to the - start of the the invalid UTF-8 character is placed in the first ele- - ment, and a reason code is placed in the second element. The reason + A string that contains an invalid UTF-8 byte sequence was passed as a + subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of + the output vector (ovecsize) is at least 2, the byte offset to the + start of the the invalid UTF-8 character is placed in the first ele- + ment, and a reason code is placed in the second element. The reason codes are listed in the following section. For backward compatibility, - if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- - acter at the end of the subject (reason codes 1 to 5), + if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- + acter at the end of the subject (reason codes 1 to 5), PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. PCRE_ERROR_BADUTF8_OFFSET (-11) - The UTF-8 byte sequence that was passed as a subject was checked and - found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the - value of startoffset did not point to the beginning of a UTF-8 charac- + The UTF-8 byte sequence that was passed as a subject was checked and + found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the + value of startoffset did not point to the beginning of a UTF-8 charac- ter or the end of the subject. PCRE_ERROR_PARTIAL (-12) - The subject string did not match, but it did match partially. See the + The subject string did not match, but it did match partially. See the pcrepartial documentation for details of partial matching. PCRE_ERROR_BADPARTIAL (-13) - This code is no longer in use. It was formerly returned when the - PCRE_PARTIAL option was used with a compiled pattern containing items - that were not supported for partial matching. From release 8.00 + This code is no longer in use. It was formerly returned when the + PCRE_PARTIAL option was used with a compiled pattern containing items + that were not supported for partial matching. From release 8.00 onwards, there are no restrictions on partial matching. PCRE_ERROR_INTERNAL (-14) - An unexpected internal error has occurred. This error could be caused + An unexpected internal error has occurred. This error could be caused by a bug in PCRE or by overwriting of the compiled pattern. PCRE_ERROR_BADCOUNT (-15) @@ -3542,7 +3679,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_RECURSIONLIMIT (-21) The internal recursion limit, as specified by the match_limit_recursion - field in a pcre_extra structure (or defaulted) was reached. See the + field in a pcre_extra structure (or defaulted) was reached. See the description above. PCRE_ERROR_BADNEWLINE (-23) @@ -3556,29 +3693,29 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_SHORTUTF8 (-25) - This error is returned instead of PCRE_ERROR_BADUTF8 when the subject - string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD - option is set. Information about the failure is returned as for - PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but - this special error code for PCRE_PARTIAL_HARD precedes the implementa- - tion of returned information; it is retained for backwards compatibil- + This error is returned instead of PCRE_ERROR_BADUTF8 when the subject + string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD + option is set. Information about the failure is returned as for + PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but + this special error code for PCRE_PARTIAL_HARD precedes the implementa- + tion of returned information; it is retained for backwards compatibil- ity. PCRE_ERROR_RECURSELOOP (-26) This error is returned when pcre_exec() detects a recursion loop within - the pattern. Specifically, it means that either the whole pattern or a - subpattern has been called recursively for the second time at the same + the pattern. Specifically, it means that either the whole pattern or a + subpattern has been called recursively for the second time at the same position in the subject string. Some simple patterns that might do this - are detected and faulted at compile time, but more complicated cases, + are detected and faulted at compile time, but more complicated cases, in particular mutual recursions between two different subpatterns, can- not be detected until run time. PCRE_ERROR_JIT_STACKLIMIT (-27) - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the memory available - for the just-in-time processing stack is not large enough. See the + This error is returned when a pattern that was successfully studied + using a JIT compile option is being matched, but the memory available + for the just-in-time processing stack is not large enough. See the pcrejit documentation for more details. PCRE_ERROR_BADMODE (-28) @@ -3588,38 +3725,38 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_BADENDIANNESS (-29) - This error is given if a pattern that was compiled and saved is - reloaded on a host with different endianness. The utility function + This error is given if a pattern that was compiled and saved is + reloaded on a host with different endianness. The utility function pcre_pattern_to_host_byte_order() can be used to convert such a pattern so that it runs on the new host. PCRE_ERROR_JIT_BADOPTION - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the matching mode - (partial or complete match) does not correspond to any JIT compilation - mode. When the JIT fast path function is used, this error may be also - given for invalid options. See the pcrejit documentation for more + This error is returned when a pattern that was successfully studied + using a JIT compile option is being matched, but the matching mode + (partial or complete match) does not correspond to any JIT compilation + mode. When the JIT fast path function is used, this error may be also + given for invalid options. See the pcrejit documentation for more details. PCRE_ERROR_BADLENGTH (-32) - This error is given if pcre_exec() is called with a negative value for + This error is given if pcre_exec() is called with a negative value for the length argument. Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). Reason codes for invalid UTF-8 strings - This section applies only to the 8-bit library. The corresponding - information for the 16-bit and 32-bit libraries is given in the pcre16 + This section applies only to the 8-bit library. The corresponding + information for the 16-bit and 32-bit libraries is given in the pcre16 and pcre32 pages. When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT- - UTF8, and the size of the output vector (ovecsize) is at least 2, the - offset of the start of the invalid UTF-8 character is placed in the + UTF8, and the size of the output vector (ovecsize) is at least 2, the + offset of the start of the invalid UTF-8 character is placed in the first output vector element (ovector[0]) and a reason code is placed in - the second element (ovector[1]). The reason codes are given names in + the second element (ovector[1]). The reason codes are given names in the pcre.h header file: PCRE_UTF8_ERR1 @@ -3628,10 +3765,10 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_UTF8_ERR4 PCRE_UTF8_ERR5 - The string ends with a truncated UTF-8 character; the code specifies - how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 - characters to be no longer than 4 bytes, the encoding scheme (origi- - nally defined by RFC 2279) allows for up to 6 bytes, and this is + The string ends with a truncated UTF-8 character; the code specifies + how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 + characters to be no longer than 4 bytes, the encoding scheme (origi- + nally defined by RFC 2279) allows for up to 6 bytes, and this is checked first; hence the possibility of 4 or 5 missing bytes. PCRE_UTF8_ERR6 @@ -3641,24 +3778,24 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_UTF8_ERR10 The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of - the character do not have the binary value 0b10 (that is, either the + the character do not have the binary value 0b10 (that is, either the most significant bit is 0, or the next bit is 1). PCRE_UTF8_ERR11 PCRE_UTF8_ERR12 - A character that is valid by the RFC 2279 rules is either 5 or 6 bytes + A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; these code points are excluded by RFC 3629. PCRE_UTF8_ERR13 - A 4-byte character has a value greater than 0x10fff; these code points + A 4-byte character has a value greater than 0x10fff; these code points are excluded by RFC 3629. PCRE_UTF8_ERR14 - A 3-byte character has a value in the range 0xd800 to 0xdfff; this - range of code points are reserved by RFC 3629 for use with UTF-16, and + A 3-byte character has a value in the range 0xd800 to 0xdfff; this + range of code points are reserved by RFC 3629 for use with UTF-16, and so are excluded from UTF-8. PCRE_UTF8_ERR15 @@ -3667,28 +3804,29 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_UTF8_ERR18 PCRE_UTF8_ERR19 - A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes - for a value that can be represented by fewer bytes, which is invalid. - For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- + A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes + for a value that can be represented by fewer bytes, which is invalid. + For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- rect coding uses just one byte. PCRE_UTF8_ERR20 The two most significant bits of the first byte of a character have the - binary value 0b10 (that is, the most significant bit is 1 and the sec- - ond is 0). Such a byte can only validly occur as the second or subse- + binary value 0b10 (that is, the most significant bit is 1 and the sec- + ond is 0). Such a byte can only validly occur as the second or subse- quent byte of a multi-byte character. PCRE_UTF8_ERR21 - The first byte of a character has the value 0xfe or 0xff. These values + The first byte of a character has the value 0xfe or 0xff. These values can never occur in a valid UTF-8 string. - PCRE_UTF8_ERR2 + PCRE_UTF8_ERR22 - Non-character. These are the last two characters in each plane (0xfffe, - 0xffff, 0x1fffe, 0x1ffff .. 0x10fffe, 0x10ffff), and the characters - 0xfdd0..0xfdef. + This error code was formerly used when the presence of a so-called + "non-character" caused an error. Unicode corrigendum #9 makes it clear + that such characters should not cause a string to be rejected, and so + this code is no longer in use and is never returned. EXTRACTING CAPTURED SUBSTRINGS BY NUMBER @@ -4039,55 +4177,64 @@ MATCHING A PATTERN: THE ALTERNATIVE FUNCTION filled with the longest matches. Unlike pcre_exec(), pcre_dfa_exec() can use the entire ovector for returning matched strings. + NOTE: PCRE's "auto-possessification" optimization usually applies to + character repeats at the end of a pattern (as well as internally). For + example, the pattern "a\d+" is compiled as if it were "a\d++" because + there is no point even considering the possibility of backtracking into + the repeated digits. For DFA matching, this means that only one possi- + ble match is found. If you really do want multiple matches in such + cases, either use an ungreedy repeat ("a\d+?") or set the + PCRE_NO_AUTO_POSSESS option when compiling. + Error returns from pcre_dfa_exec() - The pcre_dfa_exec() function returns a negative number when it fails. - Many of the errors are the same as for pcre_exec(), and these are - described above. There are in addition the following errors that are + The pcre_dfa_exec() function returns a negative number when it fails. + Many of the errors are the same as for pcre_exec(), and these are + described above. There are in addition the following errors that are specific to pcre_dfa_exec(): PCRE_ERROR_DFA_UITEM (-16) - This return is given if pcre_dfa_exec() encounters an item in the pat- - tern that it does not support, for instance, the use of \C or a back + This return is given if pcre_dfa_exec() encounters an item in the pat- + tern that it does not support, for instance, the use of \C or a back reference. PCRE_ERROR_DFA_UCOND (-17) - This return is given if pcre_dfa_exec() encounters a condition item - that uses a back reference for the condition, or a test for recursion + This return is given if pcre_dfa_exec() encounters a condition item + that uses a back reference for the condition, or a test for recursion in a specific group. These are not supported. PCRE_ERROR_DFA_UMLIMIT (-18) - This return is given if pcre_dfa_exec() is called with an extra block - that contains a setting of the match_limit or match_limit_recursion - fields. This is not supported (these fields are meaningless for DFA + This return is given if pcre_dfa_exec() is called with an extra block + that contains a setting of the match_limit or match_limit_recursion + fields. This is not supported (these fields are meaningless for DFA matching). PCRE_ERROR_DFA_WSSIZE (-19) - This return is given if pcre_dfa_exec() runs out of space in the + This return is given if pcre_dfa_exec() runs out of space in the workspace vector. PCRE_ERROR_DFA_RECURSE (-20) - When a recursive subpattern is processed, the matching function calls - itself recursively, using private vectors for ovector and workspace. - This error is given if the output vector is not large enough. This + When a recursive subpattern is processed, the matching function calls + itself recursively, using private vectors for ovector and workspace. + This error is given if the output vector is not large enough. This should be extremely rare, as a vector of size 1000 is used. PCRE_ERROR_DFA_BADRESTART (-30) - When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some - plausibility checks are made on the contents of the workspace, which - should contain data about the previous partial match. If any of these + When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some + plausibility checks are made on the contents of the workspace, which + should contain data about the previous partial match. If any of these checks fail, this error is given. SEE ALSO - pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), + pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre- sample(3), pcrestack(3). @@ -4101,18 +4248,18 @@ AUTHOR REVISION - Last updated: 08 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRECALLOUT(3) PCRECALLOUT(3) +PCRECALLOUT(3) Library Functions Manual PCRECALLOUT(3) + NAME PCRE - Perl-compatible regular expressions - SYNOPSIS #include <pcre.h> @@ -4153,48 +4300,88 @@ DESCRIPTION (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) Notice that there is a callout before and after each parenthesis and - alternation bar. Automatic callouts can be used for tracking the - progress of pattern matching. The pcretest command has an option that - sets automatic callouts; when it is used, the output indicates how the - pattern is matched. This is useful information when you are trying to - optimize the performance of a particular pattern. + alternation bar. If the pattern contains a conditional group whose con- + dition is an assertion, an automatic callout is inserted immediately + before the condition. Such a callout may also be inserted explicitly, + for example: + + (?(?C9)(?=a)ab|de) + + This applies only to assertion conditions (because they are themselves + independent groups). - The use of callouts in a pattern makes it ineligible for optimization - by the just-in-time compiler. Studying such a pattern with the - PCRE_STUDY_JIT_COMPILE option always fails. + Automatic callouts can be used for tracking the progress of pattern + matching. The pcretest program has a pattern qualifier (/C) that sets + automatic callouts; when it is used, the output indicates how the pat- + tern is being matched. This is useful information when you are trying + to optimize the performance of a particular pattern. MISSING CALLOUTS - You should be aware that, because of optimizations in the way PCRE - matches patterns by default, callouts sometimes do not happen. For - example, if the pattern is + You should be aware that, because of optimizations in the way PCRE com- + piles and matches patterns, callouts sometimes do not happen exactly as + you might expect. + + At compile time, PCRE "auto-possessifies" repeated items when it knows + that what follows cannot be part of the repeat. For example, a+[bc] is + compiled as if it were a++[bc]. The pcretest output when this pattern + is anchored and then applied with automatic callouts to the string + "aaaa" is: + + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + No match + + This indicates that when matching [bc] fails, there is no backtracking + into a+ and therefore the callouts that would be taken for the back- + tracks do not occur. You can disable the auto-possessify feature by + passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern + with (*NO_AUTO_POSSESS). If this is done in pcretest (using the /O + qualifier), the output changes to this: + + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^^ [bc] + No match + + This time, when matching [bc] fails, the matcher backtracks into a+ and + tries again, repeatedly, until a+ itself fails. + + Other optimizations that provide fast "no match" results also affect + callouts. For example, if the pattern is ab(?C4)cd PCRE knows that any matching string must contain the letter "d". If the - subject string is "abyz", the lack of "d" means that matching doesn't - ever start, and the callout is never reached. However, with "abyd", + subject string is "abyz", the lack of "d" means that matching doesn't + ever start, and the callout is never reached. However, with "abyd", though the result is still no match, the callout is obeyed. - If the pattern is studied, PCRE knows the minimum length of a matching - string, and will immediately give a "no match" return without actually - running a match if the subject is not long enough, or, for unanchored + If the pattern is studied, PCRE knows the minimum length of a matching + string, and will immediately give a "no match" return without actually + running a match if the subject is not long enough, or, for unanchored patterns, if it has been scanned far enough. - You can disable these optimizations by passing the PCRE_NO_START_OPTI- - MIZE option to the matching function, or by starting the pattern with - (*NO_START_OPT). This slows down the matching process, but does ensure + You can disable these optimizations by passing the PCRE_NO_START_OPTI- + MIZE option to the matching function, or by starting the pattern with + (*NO_START_OPT). This slows down the matching process, but does ensure that callouts such as the example above are obeyed. THE CALLOUT INTERFACE - During matching, when PCRE reaches a callout point, the external func- + During matching, when PCRE reaches a callout point, the external func- tion defined by pcre_callout or pcre[16|32]_callout is called (if it is - set). This applies to both normal and DFA matching. The only argument - to the callout function is a pointer to a pcre_callout or - pcre[16|32]_callout block. These structures contains the following + set). This applies to both normal and DFA matching. The only argument + to the callout function is a pointer to a pcre_callout or + pcre[16|32]_callout block. These structures contains the following fields: int version; @@ -4215,44 +4402,47 @@ THE CALLOUT INTERFACE const PCRE_UCHAR16 *mark; (16-bit version) const PCRE_UCHAR32 *mark; (32-bit version) - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 2. The - version number will change again in future if additional fields are + The version field is an integer containing the version number of the + block format. The initial version was 0; the current version is 2. The + version number will change again in future if additional fields are added, but the intention is never to remove any of the existing fields. - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- + The callout_number field contains the number of the callout, as com- + piled into the pattern (that is, the number after ?C for manual call- outs, and 255 for automatically generated callouts). - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to the matching function. When pcre_exec() or - pcre[16|32]_exec() is used, the contents can be inspected, in order to - extract substrings that have been matched so far, in the same way as - for extracting substrings after a match has completed. For the DFA + The offset_vector field is a pointer to the vector of offsets that was + passed by the caller to the matching function. When pcre_exec() or + pcre[16|32]_exec() is used, the contents can be inspected, in order to + extract substrings that have been matched so far, in the same way as + for extracting substrings after a match has completed. For the DFA matching functions, this field is not useful. The subject and subject_length fields contain copies of the values that were passed to the matching function. - The start_match field normally contains the offset within the subject - at which the current match attempt started. However, if the escape - sequence \K has been encountered, this value is changed to reflect the - modified starting point. If the pattern is not anchored, the callout + The start_match field normally contains the offset within the subject + at which the current match attempt started. However, if the escape + sequence \K has been encountered, this value is changed to reflect the + modified starting point. If the pattern is not anchored, the callout function may be called several times from the same point in the pattern for different starting points in the subject. - The current_position field contains the offset within the subject of + The current_position field contains the offset within the subject of the current match pointer. - When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top - field contains one more than the number of the highest numbered cap- - tured substring so far. If no substrings have been captured, the value - of capture_top is one. This is always the case when the DFA functions + When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top + field contains one more than the number of the highest numbered cap- + tured substring so far. If no substrings have been captured, the value + of capture_top is one. This is always the case when the DFA functions are used, because they do not support captured substrings. - The capture_last field contains the number of the most recently cap- - tured substring. If no substrings have been captured, its value is -1. - This is always the case for the DFA matching functions. + The capture_last field contains the number of the most recently cap- + tured substring. However, when a recursion exits, the value reverts to + what it was outside the recursion, as do the values of all captured + substrings. If no substrings have been captured, the value of cap- + ture_last is -1. This is always the case for the DFA matching func- + tions. The callout_data field contains a value that is passed to a matching function specifically so that it can be passed back in callouts. It is @@ -4310,18 +4500,18 @@ AUTHOR REVISION - Last updated: 24 June 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRECOMPAT(3) PCRECOMPAT(3) +PCRECOMPAT(3) Library Functions Manual PCRECOMPAT(3) + NAME PCRE - Perl-compatible regular expressions - DIFFERENCES BETWEEN PCRE AND PERL This document describes the differences in the ways that PCRE and Perl @@ -4340,10 +4530,8 @@ DIFFERENCES BETWEEN PCRE AND PERL 3. Capturing subpatterns that occur inside negative lookahead asser- tions are counted, but their entries in the offsets vector are never - set. Perl sets its numerical variables from any such patterns that are - matched before the assertion fails to match something (thereby succeed- - ing), but only if the negative lookahead assertion contains just one - branch. + set. Perl sometimes (but not always) sets its numerical variables from + inside negative assertions. 4. Though binary zero characters are supported in the subject string, they are not allowed in a pattern string because it is passed as a nor- @@ -4398,24 +4586,30 @@ DIFFERENCES BETWEEN PCRE AND PERL There is a discussion that explains these differences in more detail in the section on recursion differences from Perl in the pcrepattern page. - 10. If any of the backtracking control verbs are used in an assertion - or in a subpattern that is called as a subroutine (whether or not - recursively), their effect is confined to that subpattern; it does not - extend to the surrounding pattern. This is not always the case in Perl. - In particular, if (*THEN) is present in a group that is called as a - subroutine, its action is limited to that group, even if the group does - not contain any | characters. There is one exception to this: the name - from a *(MARK), (*PRUNE), or (*THEN) that is encountered in a success- - ful positive assertion is passed back when a match succeeds (compare - capturing parentheses in assertions). Note that such subpatterns are - processed as anchored at the point where they are tested. - - 11. There are some differences that are concerned with the settings of + 10. If any of the backtracking control verbs are used in a subpattern + that is called as a subroutine (whether or not recursively), their + effect is confined to that subpattern; it does not extend to the sur- + rounding pattern. This is not always the case in Perl. In particular, + if (*THEN) is present in a group that is called as a subroutine, its + action is limited to that group, even if the group does not contain any + | characters. Note that such subpatterns are processed as anchored at + the point where they are tested. + + 11. If a pattern contains more than one backtracking control verb, the + first one that is backtracked onto acts. For example, in the pattern + A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure + in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases + it is the same as PCRE, but there are examples where it differs. + + 12. Most backtracking verbs in assertions have their normal actions. + They are not confined to the assertion. + + 13. There are some differences that are concerned with the settings of captured strings when part of a pattern is repeated. For example, matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". - 12. PCRE's handling of duplicate subpattern numbers and duplicate sub- + 14. PCRE's handling of duplicate subpattern numbers and duplicate sub- pattern names is not as general as Perl's. This is a consequence of the fact the PCRE works internally just with numbers, using an external ta- ble to translate between numbers and names. In particular, a pattern @@ -4426,29 +4620,42 @@ DIFFERENCES BETWEEN PCRE AND PERL turing subpattern number 1. To avoid this confusing situation, an error is given at compile time. - 13. Perl recognizes comments in some places that PCRE does not, for + 15. Perl recognizes comments in some places that PCRE does not, for example, between the ( and ? at the start of a subpattern. If the /x - modifier is set, Perl allows white space between ( and ? but PCRE never - does, even if the PCRE_EXTENDED option is set. - - 14. PCRE provides some extensions to the Perl regular expression facil- - ities. Perl 5.10 includes new features that are not in earlier ver- - sions of Perl, some of which (such as named parentheses) have been in + modifier is set, Perl allows white space between ( and ? (though cur- + rent Perls warn that this is deprecated) but PCRE never does, even if + the PCRE_EXTENDED option is set. + + 16. Perl, when in warning mode, gives warnings for character classes + such as [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter- + als. PCRE has no warning features, so it gives an error in these cases + because they are almost certainly user mistakes. + + 17. In PCRE, the upper/lower case character properties Lu and Ll are + not affected when case-independent matching is specified. For example, + \p{Lu} always matches an upper case letter. I think Perl has changed in + this respect; in the release at the time of writing (5.16), \p{Lu} and + \p{Ll} match all letters, regardless of case, when case independence is + specified. + + 18. PCRE provides some extensions to the Perl regular expression facil- + ities. Perl 5.10 includes new features that are not in earlier ver- + sions of Perl, some of which (such as named parentheses) have been in PCRE for some time. This list is with respect to Perl 5.10: - (a) Although lookbehind assertions in PCRE must match fixed length - strings, each alternative branch of a lookbehind assertion can match a - different length of string. Perl requires them all to have the same + (a) Although lookbehind assertions in PCRE must match fixed length + strings, each alternative branch of a lookbehind assertion can match a + different length of string. Perl requires them all to have the same length. - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ + (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-character matches only at the very end of the string. (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- cial meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. (Perl can be made to issue a warning.) - (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- + (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- fiers is inverted, that is, by default they are not greedy, but if fol- lowed by a question mark they are. @@ -4456,10 +4663,10 @@ DIFFERENCES BETWEEN PCRE AND PERL tried only at the first matching position in the subject string. (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- + and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- lents. - (g) The \R escape sequence can be restricted to match only CR, LF, or + (g) The \R escape sequence can be restricted to match only CR, LF, or CRLF by the PCRE_BSR_ANYCRLF option. (h) The callout facility is PCRE-specific. @@ -4467,14 +4674,14 @@ DIFFERENCES BETWEEN PCRE AND PERL (i) The partial matching facility is PCRE-specific. (j) Patterns compiled by PCRE can be saved and re-used at a later time, - even on different hosts that have the other endianness. However, this + even on different hosts that have the other endianness. However, this does not apply to optimized data created by the just-in-time compiler. (k) The alternative matching functions (pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and + pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and are not Perl-compatible. - (l) PCRE recognizes some special sequences such as (*CR) at the start + (l) PCRE recognizes some special sequences such as (*CR) at the start of a pattern that set overall options that cannot be changed within the pattern. @@ -4488,18 +4695,18 @@ AUTHOR REVISION - Last updated: 25 August 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 10 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREPATTERN(3) PCREPATTERN(3) +PCREPATTERN(3) Library Functions Manual PCREPATTERN(3) + NAME PCRE - Perl-compatible regular expressions - PCRE REGULAR EXPRESSION DETAILS The syntax and semantics of the regular expressions that are supported @@ -4517,6 +4724,29 @@ PCRE REGULAR EXPRESSION DETAILS great detail. This description of PCRE's regular expressions is intended as reference material. + This document discusses the patterns that are supported by PCRE when + one its main matching functions, pcre_exec() (8-bit) or + pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has alternative + matching functions, pcre_dfa_exec() and pcre[16|32_dfa_exec(), which + match using a different algorithm that is not Perl-compatible. Some of + the features discussed below are not available when DFA matching is + used. The advantages and disadvantages of the alternative functions, + and how they differ from the normal functions, are discussed in the + pcrematching page. + + +SPECIAL START-OF-PATTERN ITEMS + + A number of options that can be passed to pcre_compile() can also be + set by special items at the start of a pattern. These are not Perl-com- + patible, but are provided to make these options accessible to pattern + writers who are not able to change the program that processes the pat- + tern. Any number of these items may appear, but they must all be + together right at the start of the pattern string, and the letters must + be in upper case. + + UTF support + The original operation of PCRE was on strings of one-byte characters. However, there is now also support for UTF-8 strings in the original library, an extra library that supports 16-bit and UTF-16 character @@ -4533,47 +4763,39 @@ PCRE REGULAR EXPRESSION DETAILS (*UTF) is a generic sequence that can be used with any of the libraries. Starting a pattern with such a sequence is equivalent to - setting the relevant option. This feature is not Perl-compatible. How - setting a UTF mode affects pattern matching is mentioned in several - places below. There is also a summary of features in the pcreunicode - page. + setting the relevant option. How setting a UTF mode affects pattern + matching is mentioned in several places below. There is also a summary + of features in the pcreunicode page. - Another special sequence that may appear at the start of a pattern or - in combination with (*UTF8), (*UTF16), (*UTF32) or (*UTF) is: + Some applications that allow their users to supply patterns may wish to + restrict them to non-UTF data for security reasons. If the + PCRE_NEVER_UTF option is set at compile time, (*UTF) etc. are not + allowed, and their appearance causes an error. - (*UCP) + Unicode property support - This has the same effect as setting the PCRE_UCP option: it causes - sequences such as \d and \w to use Unicode properties to determine - character types, instead of recognizing only characters with codes less - than 128 via a lookup table. + Another special sequence that may appear at the start of a pattern is + (*UCP). This has the same effect as setting the PCRE_UCP option: it + causes sequences such as \d and \w to use Unicode properties to deter- + mine character types, instead of recognizing only characters with codes + less than 128 via a lookup table. - If a pattern starts with (*NO_START_OPT), it has the same effect as - setting the PCRE_NO_START_OPTIMIZE option either at compile or matching - time. There are also some more of these special sequences that are con- - cerned with the handling of newlines; they are described below. + Disabling auto-possessification - The remainder of this document discusses the patterns that are sup- - ported by PCRE when one its main matching functions, pcre_exec() - (8-bit) or pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has - alternative matching functions, pcre_dfa_exec() and - pcre[16|32_dfa_exec(), which match using a different algorithm that is - not Perl-compatible. Some of the features discussed below are not - available when DFA matching is used. The advantages and disadvantages - of the alternative functions, and how they differ from the normal func- - tions, are discussed in the pcrematching page. + If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as + setting the PCRE_NO_AUTO_POSSESS option at compile time. This stops + PCRE from making quantifiers possessive when what follows cannot match + the repeated item. For example, by default a+b is treated as a++b. For + more details, see the pcreapi documentation. + Disabling start-up optimizations -EBCDIC CHARACTER CODES - - PCRE can be compiled to run in an environment that uses EBCDIC as its - character code rather than ASCII or Unicode (typically a mainframe sys- - tem). In the sections below, character code values are ASCII or Uni- - code; in an EBCDIC environment these characters may have different code - values, and there are no code points greater than 255. - + If a pattern starts with (*NO_START_OPT), it has the same effect as + setting the PCRE_NO_START_OPTIMIZE option either at compile or matching + time. This disables several optimizations for quickly reaching "no + match" results. For more details, see the pcreapi documentation. -NEWLINE CONVENTIONS + Newline conventions PCRE supports five different conventions for indicating line breaks in strings: a single CR (carriage return) character, a single LF (line- @@ -4598,10 +4820,8 @@ NEWLINE CONVENTIONS (*CR)a.b changes the convention to CR. That pattern matches "a\nb" because LF is - no longer a newline. Note that these special settings, which are not - Perl-compatible, are recognized only at the very start of a pattern, - and that they must be in upper case. If more than one of them is - present, the last one is used. + no longer a newline. If more than one of these settings is present, the + last one is used. The newline convention affects where the circumflex and dollar asser- tions are true. It also affects the interpretation of the dot metachar- @@ -4612,6 +4832,36 @@ NEWLINE CONVENTIONS line sequences" below. A change of \R setting can be combined with a change of newline convention. + Setting match and recursion limits + + The caller of pcre_exec() can set a limit on the number of times the + internal match() function is called and on the maximum depth of recur- + sive calls. These facilities are provided to catch runaway matches that + are provoked by patterns with huge matching trees (a typical example is + a pattern with nested unlimited repeats) and to avoid running out of + system stack by too much recursion. When one of these limits is + reached, pcre_exec() gives an error return. The limits can also be set + by items at the start of the pattern of the form + + (*LIMIT_MATCH=d) + (*LIMIT_RECURSION=d) + + where d is any number of decimal digits. However, the value of the set- + ting must be less than the value set (or defaulted) by the caller of + pcre_exec() for it to have any effect. In other words, the pattern + writer can lower the limits set by the programmer, but not raise them. + If there is more than one setting of one of these limits, the lower + value is used. + + +EBCDIC CHARACTER CODES + + PCRE can be compiled to run in an environment that uses EBCDIC as its + character code rather than ASCII or Unicode (typically a mainframe sys- + tem). In the sections below, character code values are ASCII or Uni- + code; in an EBCDIC environment these characters may have different code + values, and there are no code points greater than 255. + CHARACTERS AND METACHARACTERS @@ -4689,11 +4939,11 @@ BACKSLASH after a backslash. All other characters (in particular, those whose codepoints are greater than 127) are treated as literals. - If a pattern is compiled with the PCRE_EXTENDED option, white space in - the pattern (other than in a character class) and characters between a - # outside a character class and the next newline are ignored. An escap- - ing backslash can be used to include a white space or # character as - part of the pattern. + If a pattern is compiled with the PCRE_EXTENDED option, most white + space in the pattern (other than in a character class), and characters + between a # outside a character class and the next newline, inclusive, + are ignored. An escaping backslash can be used to include a white space + or # character as part of the pattern. If you want to remove the special meaning from a sequence of charac- ters, you can do so by putting them between \Q and \E. This is differ- @@ -4731,7 +4981,9 @@ BACKSLASH \n linefeed (hex 0A) \r carriage return (hex 0D) \t tab (hex 09) + \0dd character with octal code 0dd \ddd character with octal code ddd, or back reference + \o{ddd..} character with octal code ddd.. \xhh character with hex code hh \x{hhh..} character with hex code hhh.. (non-JavaScript mode) \uhhhh character with hex code hhhh (JavaScript mode only) @@ -4754,61 +5006,38 @@ BACKSLASH are disjoint, \cZ becomes hex 29 (Z is E9), and other characters also generate different values. - By default, after \x, from zero to two hexadecimal digits are read - (letters can be in upper or lower case). Any number of hexadecimal dig- - its may appear between \x{ and }, but the character code is constrained - as follows: - - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x80000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint - - Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- - called "surrogate" codepoints), and 0xffef. - - If characters other than hexadecimal digits appear between \x{ and }, - or if there is no terminating }, this form of escape is not recognized. - Instead, the initial \x will be interpreted as a basic hexadecimal - escape, with no following digits, giving a character whose value is - zero. - - If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x - is as just described only when it is followed by two hexadecimal dig- - its. Otherwise, it matches a literal "x" character. In JavaScript - mode, support for code points greater than 256 is provided by \u, which - must be followed by four hexadecimal digits; otherwise it matches a - literal "u" character. Character codes specified by \u in JavaScript - mode are constrained in the same was as those specified by \x in non- - JavaScript mode. - - Characters whose value is less than 256 can be defined by either of the - two syntaxes for \x (or by \u in JavaScript mode). There is no differ- - ence in the way they are handled. For example, \xdc is exactly the same - as \x{dc} (or \u00dc in JavaScript mode). - After \0 up to two further octal digits are read. If there are fewer than two digits, just those that are present are used. Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL character (code value 7). Make sure you supply two digits after the initial zero if the pattern character that follows is itself an octal digit. + The escape \o must be followed by a sequence of octal digits, enclosed + in braces. An error occurs if this is not the case. This escape is a + recent addition to Perl; it provides way of specifying character code + points as octal numbers greater than 0777, and it also allows octal + numbers and back references to be unambiguously specified. + + For greater clarity and unambiguity, it is best to avoid following \ by + a digit greater than zero. Instead, use \o{} or \x{} to specify charac- + ter numbers, and \g{} to specify back references. The following para- + graphs describe the old, ambiguous syntax. + The handling of a backslash followed by a digit other than 0 is compli- - cated. Outside a character class, PCRE reads it and any following dig- - its as a decimal number. If the number is less than 10, or if there - have been at least that many previous capturing left parentheses in the - expression, the entire sequence is taken as a back reference. A + cated, and Perl has changed in recent releases, causing PCRE also to + change. Outside a character class, PCRE reads the digit and any follow- + ing digits as a decimal number. If the number is less than 8, or if + there have been at least that many previous capturing left parentheses + in the expression, the entire sequence is taken as a back reference. A description of how this works is given later, following the discussion of parenthesized subpatterns. - Inside a character class, or if the decimal number is greater than 9 - and there have not been that many capturing subpatterns, PCRE re-reads - up to three octal digits following the backslash, and uses them to gen- - erate a data character. Any subsequent digits stand for themselves. The - value of the character is constrained in the same way as characters - specified in hexadecimal. For example: + Inside a character class, or if the decimal number following \ is + greater than 7 and there have not been that many capturing subpatterns, + PCRE handles \8 and \9 as the literal characters "8" and "9", and oth- + erwise re-reads up to three octal digits following the backslash, using + them to generate a data character. Any subsequent digits stand for + themselves. For example: \040 is another way of writing an ASCII space \40 is the same, provided there are fewer than 40 @@ -4822,45 +5051,81 @@ BACKSLASH character with octal code 113 \377 might be a back reference, otherwise the value 255 (decimal) - \81 is either a back reference, or a binary zero - followed by the two characters "8" and "1" + \81 is either a back reference, or the two + characters "8" and "1" + + Note that octal values of 100 or greater that are specified using this + syntax must not be introduced by a leading zero, because no more than + three octal digits are ever read. + + By default, after \x that is not followed by {, from zero to two hexa- + decimal digits are read (letters can be in upper or lower case). Any + number of hexadecimal digits may appear between \x{ and }. If a charac- + ter other than a hexadecimal digit appears between \x{ and }, or if + there is no terminating }, an error occurs. + + If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x + is as just described only when it is followed by two hexadecimal dig- + its. Otherwise, it matches a literal "x" character. In JavaScript + mode, support for code points greater than 256 is provided by \u, which + must be followed by four hexadecimal digits; otherwise it matches a + literal "u" character. + + Characters whose value is less than 256 can be defined by either of the + two syntaxes for \x (or by \u in JavaScript mode). There is no differ- + ence in the way they are handled. For example, \xdc is exactly the same + as \x{dc} (or \u00dc in JavaScript mode). - Note that octal values of 100 or greater must not be introduced by a - leading zero, because no more than three octal digits are ever read. + Constraints on character values + + Characters that are specified using octal or hexadecimal numbers are + limited to certain values, as follows: + + 8-bit non-UTF mode less than 0x100 + 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint + 16-bit non-UTF mode less than 0x10000 + 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint + 32-bit non-UTF mode less than 0x100000000 + 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint + + Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- + called "surrogate" codepoints), and 0xffef. + + Escape sequences in character classes All the sequences that define a single character value can be used both - inside and outside character classes. In addition, inside a character + inside and outside character classes. In addition, inside a character class, \b is interpreted as the backspace character (hex 08). - \N is not allowed in a character class. \B, \R, and \X are not special - inside a character class. Like other unrecognized escape sequences, - they are treated as the literal characters "B", "R", and "X" by - default, but cause an error if the PCRE_EXTRA option is set. Outside a + \N is not allowed in a character class. \B, \R, and \X are not special + inside a character class. Like other unrecognized escape sequences, + they are treated as the literal characters "B", "R", and "X" by + default, but cause an error if the PCRE_EXTRA option is set. Outside a character class, these sequences have different meanings. Unsupported escape sequences - In Perl, the sequences \l, \L, \u, and \U are recognized by its string - handler and used to modify the case of following characters. By - default, PCRE does not support these escape sequences. However, if the - PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and + In Perl, the sequences \l, \L, \u, and \U are recognized by its string + handler and used to modify the case of following characters. By + default, PCRE does not support these escape sequences. However, if the + PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and \u can be used to define a character by code point, as described in the previous section. Absolute and relative back references - The sequence \g followed by an unsigned or a negative number, option- - ally enclosed in braces, is an absolute or relative back reference. A + The sequence \g followed by an unsigned or a negative number, option- + ally enclosed in braces, is an absolute or relative back reference. A named back reference can be coded as \g{name}. Back references are dis- cussed later, following the discussion of parenthesized subpatterns. Absolute and relative subroutine calls - For compatibility with Oniguruma, the non-Perl syntax \g followed by a + For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a "subroutine". - Details are discussed later. Note that \g{...} (Perl syntax) and - \g<...> (Oniguruma syntax) are not synonymous. The former is a back + an alternative syntax for referencing a subpattern as a "subroutine". + Details are discussed later. Note that \g{...} (Perl syntax) and + \g<...> (Oniguruma syntax) are not synonymous. The former is a back reference; the latter is a subroutine call. Generic character types @@ -4879,44 +5144,49 @@ BACKSLASH \W any "non-word" character There is also the single sequence \N, which matches a non-newline char- - acter. This is the same as the "." metacharacter when PCRE_DOTALL is - not set. Perl also uses \N to match characters by name; PCRE does not + acter. This is the same as the "." metacharacter when PCRE_DOTALL is + not set. Perl also uses \N to match characters by name; PCRE does not support this. - Each pair of lower and upper case escape sequences partitions the com- - plete set of characters into two disjoint sets. Any given character - matches one, and only one, of each pair. The sequences can appear both - inside and outside character classes. They each match one character of - the appropriate type. If the current matching point is at the end of - the subject string, all of them fail, because there is no character to + Each pair of lower and upper case escape sequences partitions the com- + plete set of characters into two disjoint sets. Any given character + matches one, and only one, of each pair. The sequences can appear both + inside and outside character classes. They each match one character of + the appropriate type. If the current matching point is at the end of + the subject string, all of them fail, because there is no character to match. - For compatibility with Perl, \s does not match the VT character (code - 11). This makes it different from the the POSIX "space" class. The \s - characters are HT (9), LF (10), FF (12), CR (13), and space (32). If - "use locale;" is included in a Perl script, \s may match the VT charac- - ter. In PCRE, it never does. - - A "word" character is an underscore or any character that is a letter - or digit. By default, the definition of letters and digits is con- - trolled by PCRE's low-valued character tables, and may vary if locale- - specific matching is taking place (see "Locale support" in the pcreapi - page). For example, in a French locale such as "fr_FR" in Unix-like - systems, or "french" in Windows, some character codes greater than 128 - are used for accented letters, and these are then matched by \w. The + For compatibility with Perl, \s did not used to match the VT character + (code 11), which made it different from the the POSIX "space" class. + However, Perl added VT at release 5.18, and PCRE followed suit at + release 8.34. The default \s characters are now HT (9), LF (10), VT + (11), FF (12), CR (13), and space (32), which are defined as white + space in the "C" locale. This list may vary if locale-specific matching + is taking place. For example, in some locales the "non-breaking space" + character (\xA0) is recognized as white space, and in others the VT + character is not. + + A "word" character is an underscore or any character that is a letter + or digit. By default, the definition of letters and digits is con- + trolled by PCRE's low-valued character tables, and may vary if locale- + specific matching is taking place (see "Locale support" in the pcreapi + page). For example, in a French locale such as "fr_FR" in Unix-like + systems, or "french" in Windows, some character codes greater than 127 + are used for accented letters, and these are then matched by \w. The use of locales with Unicode is discouraged. - By default, in a UTF mode, characters with values greater than 128 - never match \d, \s, or \w, and always match \D, \S, and \W. These - sequences retain their original meanings from before UTF support was - available, mainly for efficiency reasons. However, if PCRE is compiled - with Unicode property support, and the PCRE_UCP option is set, the be- - haviour is changed so that Unicode properties are used to determine - character types, as follows: + By default, characters whose code points are greater than 127 never + match \d, \s, or \w, and always match \D, \S, and \W, although this may + vary for characters in the range 128-255 when locale-specific matching + is happening. These escape sequences retain their original meanings + from before Unicode support was available, mainly for efficiency rea- + sons. If PCRE is compiled with Unicode property support, and the + PCRE_UCP option is set, the behaviour is changed so that Unicode prop- + erties are used to determine character types, as follows: - \d any character that \p{Nd} matches (decimal digit) - \s any character that \p{Z} matches, plus HT, LF, FF, CR - \w any character that \p{L} or \p{N} matches, plus underscore + \d any character that matches \p{Nd} (decimal digit) + \s any character that matches \p{Z} or \h or \v + \w any character that matches \p{L} or \p{N}, plus underscore The upper case escapes match the inverse sets of characters. Note that \d matches only decimal digits, whereas \w matches any Unicode digit, @@ -4927,7 +5197,7 @@ BACKSLASH The sequences \h, \H, \v, and \V are features that were added to Perl at release 5.10. In contrast to the other sequences, which match only ASCII characters by default, these always match certain high-valued - codepoints, whether or not PCRE_UCP is set. The horizontal space char- + code points, whether or not PCRE_UCP is set. The horizontal space char- acters are: U+0009 Horizontal tab (HT) @@ -5136,52 +5406,53 @@ BACKSLASH in the Unicode table. Specifying caseless matching does not affect these escape sequences. - For example, \p{Lu} always matches only upper case letters. + For example, \p{Lu} always matches only upper case letters. This is + different from the behaviour of current versions of Perl. - Matching characters by Unicode property is not fast, because PCRE has - to do a multistage table lookup in order to find a character's prop- + Matching characters by Unicode property is not fast, because PCRE has + to do a multistage table lookup in order to find a character's prop- erty. That is why the traditional escape sequences such as \d and \w do not use Unicode properties in PCRE by default, though you can make them - do so by setting the PCRE_UCP option or by starting the pattern with + do so by setting the PCRE_UCP option or by starting the pattern with (*UCP). Extended grapheme clusters - The \X escape matches any number of Unicode characters that form an + The \X escape matches any number of Unicode characters that form an "extended grapheme cluster", and treats the sequence as an atomic group - (see below). Up to and including release 8.31, PCRE matched an ear- + (see below). Up to and including release 8.31, PCRE matched an ear- lier, simpler definition that was equivalent to (?>\PM\pM*) - That is, it matched a character without the "mark" property, followed - by zero or more characters with the "mark" property. Characters with - the "mark" property are typically non-spacing accents that affect the + That is, it matched a character without the "mark" property, followed + by zero or more characters with the "mark" property. Characters with + the "mark" property are typically non-spacing accents that affect the preceding character. - This simple definition was extended in Unicode to include more compli- - cated kinds of composite character by giving each character a grapheme - breaking property, and creating rules that use these properties to - define the boundaries of extended grapheme clusters. In releases of + This simple definition was extended in Unicode to include more compli- + cated kinds of composite character by giving each character a grapheme + breaking property, and creating rules that use these properties to + define the boundaries of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches one of these clusters. - \X always matches at least one character. Then it decides whether to + \X always matches at least one character. Then it decides whether to add additional characters according to the following rules for ending a cluster: 1. End at the end of the subject string. - 2. Do not end between CR and LF; otherwise end after any control char- + 2. Do not end between CR and LF; otherwise end after any control char- acter. - 3. Do not break Hangul (a Korean script) syllable sequences. Hangul - characters are of five types: L, V, T, LV, and LVT. An L character may - be followed by an L, V, LV, or LVT character; an LV or V character may + 3. Do not break Hangul (a Korean script) syllable sequences. Hangul + characters are of five types: L, V, T, LV, and LVT. An L character may + be followed by an L, V, LV, or LVT character; an LV or V character may be followed by a V or T character; an LVT or T character may be follwed only by a T character. - 4. Do not end before extending characters or spacing marks. Characters - with the "mark" property always have the "extend" grapheme breaking + 4. Do not end before extending characters or spacing marks. Characters + with the "mark" property always have the "extend" grapheme breaking property. 5. Do not end after prepend characters. @@ -5190,51 +5461,63 @@ BACKSLASH PCRE's additional properties - As well as the standard Unicode properties described above, PCRE sup- - ports four more that make it possible to convert traditional escape - sequences such as \w and \s and POSIX character classes to use Unicode - properties. PCRE uses these non-standard, non-Perl properties inter- - nally when PCRE_UCP is set. They are: + As well as the standard Unicode properties described above, PCRE sup- + ports four more that make it possible to convert traditional escape + sequences such as \w and \s to use Unicode properties. PCRE uses these + non-standard, non-Perl properties internally when PCRE_UCP is set. How- + ever, they may also be used explicitly. These properties are: Xan Any alphanumeric character Xps Any POSIX space character Xsp Any Perl space character Xwd Any Perl "word" character - Xan matches characters that have either the L (letter) or the N (num- - ber) property. Xps matches the characters tab, linefeed, vertical tab, - form feed, or carriage return, and any other character that has the Z - (separator) property. Xsp is the same as Xps, except that vertical tab - is excluded. Xwd matches the same characters as Xan, plus underscore. + Xan matches characters that have either the L (letter) or the N (num- + ber) property. Xps matches the characters tab, linefeed, vertical tab, + form feed, or carriage return, and any other character that has the Z + (separator) property. Xsp is the same as Xps; it used to exclude ver- + tical tab, for Perl compatibility, but Perl changed, and so PCRE fol- + lowed at release 8.34. Xwd matches the same characters as Xan, plus + underscore. + + There is another non-standard property, Xuc, which matches any charac- + ter that can be represented by a Universal Character Name in C++ and + other programming languages. These are the characters $, @, ` (grave + accent), and all characters with Unicode code points greater than or + equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that + most base (ASCII) characters are excluded. (Universal Character Names + are of the form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit. + Note that the Xuc property does not match these sequences but the char- + acters that they represent.) Resetting the match start - The escape sequence \K causes any previously matched characters not to + The escape sequence \K causes any previously matched characters not to be included in the final matched sequence. For example, the pattern: foo\Kbar - matches "foobar", but reports that it has matched "bar". This feature - is similar to a lookbehind assertion (described below). However, in - this case, the part of the subject before the real match does not have - to be of fixed length, as lookbehind assertions do. The use of \K does - not interfere with the setting of captured substrings. For example, + matches "foobar", but reports that it has matched "bar". This feature + is similar to a lookbehind assertion (described below). However, in + this case, the part of the subject before the real match does not have + to be of fixed length, as lookbehind assertions do. The use of \K does + not interfere with the setting of captured substrings. For example, when the pattern (foo)\Kbar matches "foobar", the first substring is still set to "foo". - Perl documents that the use of \K within assertions is "not well - defined". In PCRE, \K is acted upon when it occurs inside positive + Perl documents that the use of \K within assertions is "not well + defined". In PCRE, \K is acted upon when it occurs inside positive assertions, but is ignored in negative assertions. Simple assertions - The final use of backslash is for certain simple assertions. An asser- - tion specifies a condition that has to be met at a particular point in - a match, without consuming any characters from the subject string. The - use of subpatterns for more complicated assertions is described below. + The final use of backslash is for certain simple assertions. An asser- + tion specifies a condition that has to be met at a particular point in + a match, without consuming any characters from the subject string. The + use of subpatterns for more complicated assertions is described below. The backslashed assertions are: \b matches at a word boundary @@ -5245,161 +5528,161 @@ BACKSLASH \z matches only at the end of the subject \G matches at the first matching position in the subject - Inside a character class, \b has a different meaning; it matches the - backspace character. If any other of these assertions appears in a - character class, by default it matches the corresponding literal char- + Inside a character class, \b has a different meaning; it matches the + backspace character. If any other of these assertions appears in a + character class, by default it matches the corresponding literal char- acter (for example, \B matches the letter B). However, if the - PCRE_EXTRA option is set, an "invalid escape sequence" error is gener- + PCRE_EXTRA option is set, an "invalid escape sequence" error is gener- ated instead. - A word boundary is a position in the subject string where the current - character and the previous character do not both match \w or \W (i.e. - one matches \w and the other matches \W), or the start or end of the - string if the first or last character matches \w, respectively. In a - UTF mode, the meanings of \w and \W can be changed by setting the - PCRE_UCP option. When this is done, it also affects \b and \B. Neither - PCRE nor Perl has a separate "start of word" or "end of word" metase- - quence. However, whatever follows \b normally determines which it is. + A word boundary is a position in the subject string where the current + character and the previous character do not both match \w or \W (i.e. + one matches \w and the other matches \W), or the start or end of the + string if the first or last character matches \w, respectively. In a + UTF mode, the meanings of \w and \W can be changed by setting the + PCRE_UCP option. When this is done, it also affects \b and \B. Neither + PCRE nor Perl has a separate "start of word" or "end of word" metase- + quence. However, whatever follows \b normally determines which it is. For example, the fragment \ba matches "a" at the start of a word. - The \A, \Z, and \z assertions differ from the traditional circumflex + The \A, \Z, and \z assertions differ from the traditional circumflex and dollar (described in the next section) in that they only ever match - at the very start and end of the subject string, whatever options are - set. Thus, they are independent of multiline mode. These three asser- + at the very start and end of the subject string, whatever options are + set. Thus, they are independent of multiline mode. These three asser- tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which - affect only the behaviour of the circumflex and dollar metacharacters. - However, if the startoffset argument of pcre_exec() is non-zero, indi- + affect only the behaviour of the circumflex and dollar metacharacters. + However, if the startoffset argument of pcre_exec() is non-zero, indi- cating that matching is to start at a point other than the beginning of - the subject, \A can never match. The difference between \Z and \z is + the subject, \A can never match. The difference between \Z and \z is that \Z matches before a newline at the end of the string as well as at the very end, whereas \z matches only at the end. - The \G assertion is true only when the current matching position is at - the start point of the match, as specified by the startoffset argument - of pcre_exec(). It differs from \A when the value of startoffset is - non-zero. By calling pcre_exec() multiple times with appropriate argu- + The \G assertion is true only when the current matching position is at + the start point of the match, as specified by the startoffset argument + of pcre_exec(). It differs from \A when the value of startoffset is + non-zero. By calling pcre_exec() multiple times with appropriate argu- ments, you can mimic Perl's /g option, and it is in this kind of imple- mentation where \G can be useful. - Note, however, that PCRE's interpretation of \G, as the start of the + Note, however, that PCRE's interpretation of \G, as the start of the current match, is subtly different from Perl's, which defines it as the - end of the previous match. In Perl, these can be different when the - previously matched string was empty. Because PCRE does just one match + end of the previous match. In Perl, these can be different when the + previously matched string was empty. Because PCRE does just one match at a time, it cannot reproduce this behaviour. - If all the alternatives of a pattern begin with \G, the expression is + If all the alternatives of a pattern begin with \G, the expression is anchored to the starting match position, and the "anchored" flag is set in the compiled regular expression. CIRCUMFLEX AND DOLLAR - The circumflex and dollar metacharacters are zero-width assertions. - That is, they test for a particular condition being true without con- + The circumflex and dollar metacharacters are zero-width assertions. + That is, they test for a particular condition being true without con- suming any characters from the subject string. Outside a character class, in the default matching mode, the circumflex - character is an assertion that is true only if the current matching - point is at the start of the subject string. If the startoffset argu- - ment of pcre_exec() is non-zero, circumflex can never match if the - PCRE_MULTILINE option is unset. Inside a character class, circumflex + character is an assertion that is true only if the current matching + point is at the start of the subject string. If the startoffset argu- + ment of pcre_exec() is non-zero, circumflex can never match if the + PCRE_MULTILINE option is unset. Inside a character class, circumflex has an entirely different meaning (see below). - Circumflex need not be the first character of the pattern if a number - of alternatives are involved, but it should be the first thing in each - alternative in which it appears if the pattern is ever to match that - branch. If all possible alternatives start with a circumflex, that is, - if the pattern is constrained to match only at the start of the sub- - ject, it is said to be an "anchored" pattern. (There are also other + Circumflex need not be the first character of the pattern if a number + of alternatives are involved, but it should be the first thing in each + alternative in which it appears if the pattern is ever to match that + branch. If all possible alternatives start with a circumflex, that is, + if the pattern is constrained to match only at the start of the sub- + ject, it is said to be an "anchored" pattern. (There are also other constructs that can cause a pattern to be anchored.) - The dollar character is an assertion that is true only if the current - matching point is at the end of the subject string, or immediately - before a newline at the end of the string (by default). Note, however, - that it does not actually match the newline. Dollar need not be the + The dollar character is an assertion that is true only if the current + matching point is at the end of the subject string, or immediately + before a newline at the end of the string (by default). Note, however, + that it does not actually match the newline. Dollar need not be the last character of the pattern if a number of alternatives are involved, - but it should be the last item in any branch in which it appears. Dol- + but it should be the last item in any branch in which it appears. Dol- lar has no special meaning in a character class. - The meaning of dollar can be changed so that it matches only at the - very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at + The meaning of dollar can be changed so that it matches only at the + very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This does not affect the \Z assertion. The meanings of the circumflex and dollar characters are changed if the - PCRE_MULTILINE option is set. When this is the case, a circumflex - matches immediately after internal newlines as well as at the start of - the subject string. It does not match after a newline that ends the - string. A dollar matches before any newlines in the string, as well as - at the very end, when PCRE_MULTILINE is set. When newline is specified - as the two-character sequence CRLF, isolated CR and LF characters do + PCRE_MULTILINE option is set. When this is the case, a circumflex + matches immediately after internal newlines as well as at the start of + the subject string. It does not match after a newline that ends the + string. A dollar matches before any newlines in the string, as well as + at the very end, when PCRE_MULTILINE is set. When newline is specified + as the two-character sequence CRLF, isolated CR and LF characters do not indicate newlines. - For example, the pattern /^abc$/ matches the subject string "def\nabc" - (where \n represents a newline) in multiline mode, but not otherwise. - Consequently, patterns that are anchored in single line mode because - all branches start with ^ are not anchored in multiline mode, and a - match for circumflex is possible when the startoffset argument of - pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if + For example, the pattern /^abc$/ matches the subject string "def\nabc" + (where \n represents a newline) in multiline mode, but not otherwise. + Consequently, patterns that are anchored in single line mode because + all branches start with ^ are not anchored in multiline mode, and a + match for circumflex is possible when the startoffset argument of + pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. - Note that the sequences \A, \Z, and \z can be used to match the start - and end of the subject in both modes, and if all branches of a pattern - start with \A it is always anchored, whether or not PCRE_MULTILINE is + Note that the sequences \A, \Z, and \z can be used to match the start + and end of the subject in both modes, and if all branches of a pattern + start with \A it is always anchored, whether or not PCRE_MULTILINE is set. FULL STOP (PERIOD, DOT) AND \N Outside a character class, a dot in the pattern matches any one charac- - ter in the subject string except (by default) a character that signi- + ter in the subject string except (by default) a character that signi- fies the end of a line. - When a line ending is defined as a single character, dot never matches - that character; when the two-character sequence CRLF is used, dot does - not match CR if it is immediately followed by LF, but otherwise it - matches all characters (including isolated CRs and LFs). When any Uni- - code line endings are being recognized, dot does not match CR or LF or + When a line ending is defined as a single character, dot never matches + that character; when the two-character sequence CRLF is used, dot does + not match CR if it is immediately followed by LF, but otherwise it + matches all characters (including isolated CRs and LFs). When any Uni- + code line endings are being recognized, dot does not match CR or LF or any of the other line ending characters. - The behaviour of dot with regard to newlines can be changed. If the - PCRE_DOTALL option is set, a dot matches any one character, without + The behaviour of dot with regard to newlines can be changed. If the + PCRE_DOTALL option is set, a dot matches any one character, without exception. If the two-character sequence CRLF is present in the subject string, it takes two dots to match it. - The handling of dot is entirely independent of the handling of circum- - flex and dollar, the only relationship being that they both involve + The handling of dot is entirely independent of the handling of circum- + flex and dollar, the only relationship being that they both involve newlines. Dot has no special meaning in a character class. - The escape sequence \N behaves like a dot, except that it is not - affected by the PCRE_DOTALL option. In other words, it matches any - character except one that signifies the end of a line. Perl also uses + The escape sequence \N behaves like a dot, except that it is not + affected by the PCRE_DOTALL option. In other words, it matches any + character except one that signifies the end of a line. Perl also uses \N to match characters by name; PCRE does not support this. MATCHING A SINGLE DATA UNIT - Outside a character class, the escape sequence \C matches any one data - unit, whether or not a UTF mode is set. In the 8-bit library, one data - unit is one byte; in the 16-bit library it is a 16-bit unit; in the - 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches - line-ending characters. The feature is provided in Perl in order to + Outside a character class, the escape sequence \C matches any one data + unit, whether or not a UTF mode is set. In the 8-bit library, one data + unit is one byte; in the 16-bit library it is a 16-bit unit; in the + 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches + line-ending characters. The feature is provided in Perl in order to match individual bytes in UTF-8 mode, but it is unclear how it can use- - fully be used. Because \C breaks up characters into individual data - units, matching one unit with \C in a UTF mode means that the rest of + fully be used. Because \C breaks up characters into individual data + units, matching one unit with \C in a UTF mode means that the rest of the string may start with a malformed UTF character. This has undefined results, because PCRE assumes that it is dealing with valid UTF strings - (and by default it checks this at the start of processing unless the - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option + (and by default it checks this at the start of processing unless the + PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option is used). - PCRE does not allow \C to appear in lookbehind assertions (described - below) in a UTF mode, because this would make it impossible to calcu- + PCRE does not allow \C to appear in lookbehind assertions (described + below) in a UTF mode, because this would make it impossible to calcu- late the length of the lookbehind. In general, the \C escape sequence is best avoided. However, one way of - using it that avoids the problem of malformed UTF characters is to use - a lookahead to check the length of the next character, as in this pat- - tern, which could be used with a UTF-8 string (ignore white space and + using it that avoids the problem of malformed UTF characters is to use + a lookahead to check the length of the next character, as in this pat- + tern, which could be used with a UTF-8 string (ignore white space and line breaks): (?| (?=[\x00-\x7f])(\C) | @@ -5407,11 +5690,11 @@ MATCHING A SINGLE DATA UNIT (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C)) - A group that starts with (?| resets the capturing parentheses numbers - in each alternative (see "Duplicate Subpattern Numbers" below). The - assertions at the start of each branch check the next UTF-8 character - for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The - character's individual bytes are then captured by the appropriate num- + A group that starts with (?| resets the capturing parentheses numbers + in each alternative (see "Duplicate Subpattern Numbers" below). The + assertions at the start of each branch check the next UTF-8 character + for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The + character's individual bytes are then captured by the appropriate num- ber of groups. @@ -5421,64 +5704,71 @@ SQUARE BRACKETS AND CHARACTER CLASSES closing square bracket. A closing square bracket on its own is not spe- cial by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square bracket causes a compile-time error. If a closing - square bracket is required as a member of the class, it should be the - first data character in the class (after an initial circumflex, if + square bracket is required as a member of the class, it should be the + first data character in the class (after an initial circumflex, if present) or escaped with a backslash. - A character class matches a single character in the subject. In a UTF - mode, the character may be more than one data unit long. A matched + A character class matches a single character in the subject. In a UTF + mode, the character may be more than one data unit long. A matched character must be in the set of characters defined by the class, unless - the first character in the class definition is a circumflex, in which + the first character in the class definition is a circumflex, in which case the subject character must not be in the set defined by the class. - If a circumflex is actually required as a member of the class, ensure + If a circumflex is actually required as a member of the class, ensure it is not the first character, or escape it with a backslash. - For example, the character class [aeiou] matches any lower case vowel, - while [^aeiou] matches any character that is not a lower case vowel. + For example, the character class [aeiou] matches any lower case vowel, + while [^aeiou] matches any character that is not a lower case vowel. Note that a circumflex is just a convenient notation for specifying the - characters that are in the class by enumerating those that are not. A - class that starts with a circumflex is not an assertion; it still con- - sumes a character from the subject string, and therefore it fails if + characters that are in the class by enumerating those that are not. A + class that starts with a circumflex is not an assertion; it still con- + sumes a character from the subject string, and therefore it fails if the current pointer is at the end of the string. In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 - (0xffff) can be included in a class as a literal string of data units, + (0xffff) can be included in a class as a literal string of data units, or by using the \x{ escaping mechanism. - When caseless matching is set, any letters in a class represent both - their upper case and lower case versions, so for example, a caseless - [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not - match "A", whereas a caseful version would. In a UTF mode, PCRE always - understands the concept of case for characters whose values are less - than 128, so caseless matching is always possible. For characters with - higher values, the concept of case is supported if PCRE is compiled - with Unicode property support, but not otherwise. If you want to use - caseless matching in a UTF mode for characters 128 and above, you must - ensure that PCRE is compiled with Unicode property support as well as + When caseless matching is set, any letters in a class represent both + their upper case and lower case versions, so for example, a caseless + [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not + match "A", whereas a caseful version would. In a UTF mode, PCRE always + understands the concept of case for characters whose values are less + than 128, so caseless matching is always possible. For characters with + higher values, the concept of case is supported if PCRE is compiled + with Unicode property support, but not otherwise. If you want to use + caseless matching in a UTF mode for characters 128 and above, you must + ensure that PCRE is compiled with Unicode property support as well as with UTF support. - Characters that might indicate line breaks are never treated in any - special way when matching character classes, whatever line-ending - sequence is in use, and whatever setting of the PCRE_DOTALL and + Characters that might indicate line breaks are never treated in any + special way when matching character classes, whatever line-ending + sequence is in use, and whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class such as [^a] always matches one of these characters. - The minus (hyphen) character can be used to specify a range of charac- - ters in a character class. For example, [d-m] matches any letter - between d and m, inclusive. If a minus character is required in a - class, it must be escaped with a backslash or appear in a position - where it cannot be interpreted as indicating a range, typically as the - first or last character in the class. + The minus (hyphen) character can be used to specify a range of charac- + ters in a character class. For example, [d-m] matches any letter + between d and m, inclusive. If a minus character is required in a + class, it must be escaped with a backslash or appear in a position + where it cannot be interpreted as indicating a range, typically as the + first or last character in the class, or immediately after a range. For + example, [b-d-z] matches letters in the range b to d, a hyphen charac- + ter, or z. It is not possible to have the literal character "]" as the end charac- - ter of a range. A pattern such as [W-]46] is interpreted as a class of - two characters ("W" and "-") followed by a literal string "46]", so it - would match "W46]" or "-46]". However, if the "]" is escaped with a - backslash it is interpreted as the end of range, so [W-\]46] is inter- - preted as a class containing a range followed by two other characters. - The octal or hexadecimal representation of "]" can also be used to end + ter of a range. A pattern such as [W-]46] is interpreted as a class of + two characters ("W" and "-") followed by a literal string "46]", so it + would match "W46]" or "-46]". However, if the "]" is escaped with a + backslash it is interpreted as the end of range, so [W-\]46] is inter- + preted as a class containing a range followed by two other characters. + The octal or hexadecimal representation of "]" can also be used to end a range. + An error is generated if a POSIX character class (see below) or an + escape sequence other than one that defines a single character appears + at a point where a range ending character is expected. For example, + [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not. + Ranges operate in the collating sequence of character values. They can also be used for characters specified numerically, for example [\000-\037]. Ranges can include any characters that are valid for the @@ -5515,15 +5805,16 @@ SQUARE BRACKETS AND CHARACTER CLASSES The only metacharacters that are recognized in character classes are backslash, hyphen (only where it can be interpreted as specifying a range), circumflex (only at the start), opening square bracket (only - when it can be interpreted as introducing a POSIX class name - see the - next section), and the terminating closing square bracket. However, - escaping other non-alphanumeric characters does no harm. + when it can be interpreted as introducing a POSIX class name, or for a + special compatibility feature - see the next two sections), and the + terminating closing square bracket. However, escaping other non- + alphanumeric characters does no harm. POSIX CHARACTER CLASSES Perl supports the POSIX notation for character classes. This uses names - enclosed by [: and :] within the enclosing square brackets. PCRE also + enclosed by [: and :] within the enclosing square brackets. PCRE also supports this notation. For example, [01[:alpha:]%] @@ -5541,15 +5832,18 @@ POSIX CHARACTER CLASSES lower lower case letters print printing characters, including space punct printing characters, excluding letters and digits and space - space white space (not quite the same as \s) + space white space (the same as \s from PCRE 8.34) upper upper case letters word "word" characters (same as \w) xdigit hexadecimal digits - The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), - and space (32). Notice that this list includes the VT character (code - 11). This makes "space" different to \s, which does not include VT (for - Perl compatibility). + The default "space" characters are HT (9), LF (10), VT (11), FF (12), + CR (13), and space (32). If locale-specific matching is taking place, + the list of space characters may be different; there may be fewer or + more of them. "Space" used to be different to \s, which did not include + VT, for Perl compatibility. However, Perl changed at release 5.18, and + PCRE followed at release 8.34. "Space" and \s now match the same set + of characters. The name "word" is a Perl extension, and "blank" is a GNU extension from Perl 5.8. Another Perl extension is negation, which is indicated @@ -5561,11 +5855,11 @@ POSIX CHARACTER CLASSES POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not supported, and an error is given if they are encountered. - By default, in UTF modes, characters with values greater than 128 do - not match any of the POSIX character classes. However, if the PCRE_UCP - option is passed to pcre_compile(), some of the classes are changed so - that Unicode character properties are used. This is achieved by replac- - ing the POSIX classes by other sequences, as follows: + By default, characters with values greater than 128 do not match any of + the POSIX character classes. However, if the PCRE_UCP option is passed + to pcre_compile(), some of the classes are changed so that Unicode + character properties are used. This is achieved by replacing certain + POSIX classes by other sequences, as follows: [:alnum:] becomes \p{Xan} [:alpha:] becomes \p{L} @@ -5576,9 +5870,48 @@ POSIX CHARACTER CLASSES [:upper:] becomes \p{Lu} [:word:] becomes \p{Xwd} - Negated versions, such as [:^alpha:] use \P instead of \p. The other - POSIX classes are unchanged, and match only characters with code points - less than 128. + Negated versions, such as [:^alpha:] use \P instead of \p. Three other + POSIX classes are handled specially in UCP mode: + + [:graph:] This matches characters that have glyphs that mark the page + when printed. In Unicode property terms, it matches all char- + acters with the L, M, N, P, S, or Cf properties, except for: + + U+061C Arabic Letter Mark + U+180E Mongolian Vowel Separator + U+2066 - U+2069 Various "isolate"s + + + [:print:] This matches the same characters as [:graph:] plus space + characters that are not controls, that is, characters with + the Zs property. + + [:punct:] This matches all characters that have the Unicode P (punctua- + tion) property, plus those characters whose code points are + less than 128 that have the S (Symbol) property. + + The other POSIX classes are unchanged, and match only characters with + code points less than 128. + + +COMPATIBILITY FEATURE FOR WORD BOUNDARIES + + In the POSIX.2 compliant library that was included in 4.4BSD Unix, the + ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" + and "end of word". PCRE treats these items as follows: + + [[:<:]] is converted to \b(?=\w) + [[:>:]] is converted to \b(?<=\w) + + Only these exact character sequences are recognized. A sequence such as + [a[:<:]b] provokes error for an unrecognized POSIX class name. This + support is not compatible with Perl. It is provided to help migrations + from other environments, and is best not used in any new patterns. Note + that \b matches at the start and the end of a word (see "Simple asser- + tions" above), and in a Perl-style pattern the preceding or following + character normally shows which is wanted, without the need for the + assertions that are used above in order to give exactly the POSIX be- + haviour. VERTICAL BAR @@ -5653,7 +5986,9 @@ INTERNAL OPTION SETTING (*UCP) leading sequences that can be used to set UTF and Unicode prop- erty modes; they are equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP options, respectively. The (*UTF) sequence - is a generic version that can be used with any of the libraries. + is a generic version that can be used with any of the libraries. How- + ever, the application can set the PCRE_NEVER_UTF option, which locks + out the use of the (*UTF) sequences. SUBPATTERNS @@ -5773,12 +6108,12 @@ NAMED SUBPATTERNS references, recursion, and conditions, can be made by name as well as by number. - Names consist of up to 32 alphanumeric characters and underscores. - Named capturing parentheses are still allocated numbers as well as - names, exactly as if the names were not present. The PCRE API provides - function calls for extracting the name-to-number translation table from - a compiled pattern. There is also a convenience function for extracting - a captured substring by name. + Names consist of up to 32 alphanumeric characters and underscores, but + must start with a non-digit. Named capturing parentheses are still + allocated numbers as well as names, exactly as if the names were not + present. The PCRE API provides function calls for extracting the name- + to-number translation table from a compiled pattern. There is also a + convenience function for extracting a captured substring by name. By default, a name must be unique within a pattern, but it is possible to relax this constraint by setting the PCRE_DUPNAMES option at compile @@ -5806,28 +6141,38 @@ NAMED SUBPATTERNS subpattern it was. If you make a back reference to a non-unique named subpattern from - elsewhere in the pattern, the one that corresponds to the first occur- - rence of the name is used. In the absence of duplicate numbers (see the - previous section) this is the one with the lowest number. If you use a - named reference in a condition test (see the section about conditions - below), either to check whether a subpattern has matched, or to check - for recursion, all subpatterns with the same name are tested. If the - condition is true for any one of them, the overall condition is true. - This is the same behaviour as testing by number. For further details of - the interfaces for handling named subpatterns, see the pcreapi documen- - tation. + elsewhere in the pattern, the subpatterns to which the name refers are + checked in the order in which they appear in the overall pattern. The + first one that is set is used for the reference. For example, this pat- + tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo": + + (?:(?<n>foo)|(?<n>bar))\k<n> + + + If you make a subroutine call to a non-unique named subpattern, the one + that corresponds to the first occurrence of the name is used. In the + absence of duplicate numbers (see the previous section) this is the one + with the lowest number. + + If you use a named reference in a condition test (see the section about + conditions below), either to check whether a subpattern has matched, or + to check for recursion, all subpatterns with the same name are tested. + If the condition is true for any one of them, the overall condition is + true. This is the same behaviour as testing by number. For further + details of the interfaces for handling named subpatterns, see the + pcreapi documentation. Warning: You cannot use different names to distinguish between two sub- - patterns with the same number because PCRE uses only the numbers when + patterns with the same number because PCRE uses only the numbers when matching. For this reason, an error is given at compile time if differ- - ent names are given to subpatterns with the same number. However, you - can give the same name to subpatterns with the same number, even when - PCRE_DUPNAMES is not set. + ent names are given to subpatterns with the same number. However, you + can always give the same name to subpatterns with the same number, even + when PCRE_DUPNAMES is not set. REPETITION - Repetition is specified by quantifiers, which can follow any of the + Repetition is specified by quantifiers, which can follow any of the following items: a literal data character @@ -5841,17 +6186,17 @@ REPETITION a parenthesized subpattern (including assertions) a subroutine call to a subpattern (recursive or otherwise) - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, + The general repetition quantifier specifies a minimum and maximum num- + ber of permitted matches, by giving the two numbers in curly brackets + (braces), separated by a comma. The numbers must be less than 65536, and the first must be less than or equal to the second. For example: z{2,4} - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required + matches "zz", "zzz", or "zzzz". A closing brace on its own is not a + special character. If the second number is omitted, but the comma is + present, there is no upper limit; if the second number and the comma + are both omitted, the quantifier specifies an exact number of required matches. Thus [aeiou]{3,} @@ -5860,50 +6205,50 @@ REPETITION \d{8} - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- + matches exactly 8 digits. An opening curly bracket that appears in a + position where a quantifier is not allowed, or one that does not match + the syntax of a quantifier, is taken as a literal character. For exam- ple, {,6} is not a quantifier, but a literal string of four characters. In UTF modes, quantifiers apply to characters rather than to individual - data units. Thus, for example, \x{100}{2} matches two characters, each + data units. Thus, for example, \x{100}{2} matches two characters, each of which is represented by a two-byte sequence in a UTF-8 string. Simi- - larly, \X{3} matches three Unicode extended grapheme clusters, each of - which may be several data units long (and they may be of different + larly, \X{3} matches three Unicode extended grapheme clusters, each of + which may be several data units long (and they may be of different lengths). The quantifier {0} is permitted, causing the expression to behave as if the previous item and the quantifier were not present. This may be use- - ful for subpatterns that are referenced as subroutines from elsewhere + ful for subpatterns that are referenced as subroutines from elsewhere in the pattern (but see also the section entitled "Defining subpatterns - for use by reference only" below). Items other than subpatterns that + for use by reference only" below). Items other than subpatterns that have a {0} quantifier are omitted from the compiled pattern. - For convenience, the three most common quantifiers have single-charac- + For convenience, the three most common quantifiers have single-charac- ter abbreviations: * is equivalent to {0,} + is equivalent to {1,} ? is equivalent to {0,1} - It is possible to construct infinite loops by following a subpattern + It is possible to construct infinite loops by following a subpattern that can match no characters with a quantifier that has no upper limit, for example: (a?)* Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- + for such patterns. However, because there are cases where this can be + useful, such patterns are now accepted, but if any repetition of the + subpattern does in fact match no characters, the loop is forcibly bro- ken. - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where + By default, the quantifiers are "greedy", that is, they match as much + as possible (up to the maximum number of permitted times), without + causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the + appear between /* and */ and within the comment, individual * and / + characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ @@ -5912,19 +6257,19 @@ REPETITION /* first comment */ not comment /* second comment */ - fails, because it matches the entire string owing to the greediness of + fails, because it matches the entire string owing to the greediness of the .* item. - However, if a quantifier is followed by a question mark, it ceases to + However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern /\*.*?\*/ - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes + does the right thing with the C comments. The meaning of the various + quantifiers is not otherwise changed, just the preferred number of + matches. Do not confuse this use of question mark with its use as a + quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d @@ -5932,45 +6277,45 @@ REPETITION which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches. - If the PCRE_UNGREEDY option is set (an option that is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other + If the PCRE_UNGREEDY option is set (an option that is not available in + Perl), the quantifiers are not greedy by default, but individual ones + can be made greedy by following them with a question mark. In other words, it inverts the default behaviour. - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the + When a parenthesized subpattern is quantified with a minimum repeat + count that is greater than 1 or with a limited maximum, more memory is + required for the compiled pattern, in proportion to the size of the minimum or maximum. If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the dot to match newlines, - the pattern is implicitly anchored, because whatever follows will be - tried against every character position in the subject string, so there - is no point in retrying the overall match at any position after the - first. PCRE normally treats such a pattern as though it were preceded + alent to Perl's /s) is set, thus allowing the dot to match newlines, + the pattern is implicitly anchored, because whatever follows will be + tried against every character position in the subject string, so there + is no point in retrying the overall match at any position after the + first. PCRE normally treats such a pattern as though it were preceded by \A. - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- + In cases where it is known that the subject string contains no new- + lines, it is worth setting PCRE_DOTALL in order to obtain this opti- mization, or alternatively using ^ to indicate anchoring explicitly. - However, there are some cases where the optimization cannot be used. + However, there are some cases where the optimization cannot be used. When .* is inside capturing parentheses that are the subject of a back reference elsewhere in the pattern, a match at the start may fail where a later one succeeds. Consider, for example: (.*)abc\1 - If the subject is "xyz123abc123" the match point is the fourth charac- + If the subject is "xyz123abc123" the match point is the fourth charac- ter. For this reason, such a pattern is not implicitly anchored. - Another case where implicit anchoring is not applied is when the lead- - ing .* is inside an atomic group. Once again, a match at the start may + Another case where implicit anchoring is not applied is when the lead- + ing .* is inside an atomic group. Once again, a match at the start may fail where a later one succeeds. Consider this pattern: (?>.*?a)b - It matches "ab" in the subject "aab". The use of the backtracking con- + It matches "ab" in the subject "aab". The use of the backtracking con- trol verbs (*PRUNE) and (*SKIP) also disable this optimization. When a capturing subpattern is repeated, the value captured is the sub- @@ -5979,8 +6324,8 @@ REPETITION (tweedle[dume]{3}\s*)+ has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- + is "tweedledee". However, if there are nested capturing subpatterns, + the corresponding captured values may have been set in previous itera- tions. For example, after /(a|(b))+/ @@ -5990,53 +6335,53 @@ REPETITION ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") - repetition, failure of what follows normally causes the repeated item - to be re-evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to prevent this, - either to change the nature of the match, or to cause it fail earlier - than it otherwise might, when the author of the pattern knows there is + With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") + repetition, failure of what follows normally causes the repeated item + to be re-evaluated to see if a different number of repeats allows the + rest of the pattern to match. Sometimes it is useful to prevent this, + either to change the nature of the match, or to cause it fail earlier + than it otherwise might, when the author of the pattern knows there is no point in carrying on. - Consider, for example, the pattern \d+foo when applied to the subject + Consider, for example, the pattern \d+foo when applied to the subject line 123456bar After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not + action of the matcher is to try again with only 5 digits matching the + \d+ item, and then with 4, and so on, before ultimately failing. + "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides + the means for specifying that once a subpattern has matched, it is not to be re-evaluated in this way. - If we use atomic grouping for the previous example, the matcher gives - up immediately on failing to match "foo" the first time. The notation + If we use atomic grouping for the previous example, the matcher gives + up immediately on failing to match "foo" the first time. The notation is a kind of special parenthesis, starting with (?> as in this example: (?>\d+)foo - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous + This kind of parenthesis "locks up" the part of the pattern it con- + tains once it has matched, and a failure further into the pattern is + prevented from backtracking into it. Backtracking past it to previous items, however, works as normal. - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would + An alternative description is that a subpattern of this type matches + the string of characters that an identical standalone pattern would match, if anchored at the current point in the subject string. Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the + must swallow everything it can. So, while both \d+ and \d+? are pre- + pared to adjust the number of digits they match in order to make the rest of the pattern match, (?>\d+) can only match an entire sequence of digits. - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an + Atomic groups in general can of course contain arbitrarily complicated + subpatterns, and can be nested. However, when the subpattern for an atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using + simpler notation, called a "possessive quantifier" can be used. This + consists of an additional + character following a quantifier. Using this notation, the previous example can be rewritten as \d++foo @@ -6046,45 +6391,45 @@ ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS (abc|xyz){2,3}+ - Possessive quantifiers are always greedy; the setting of the + Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning of a possessive quantifier and the equivalent atomic group, - though there may be a performance difference; possessive quantifiers + simpler forms of atomic group. However, there is no difference in the + meaning of a possessive quantifier and the equivalent atomic group, + though there may be a performance difference; possessive quantifiers should be slightly faster. - The possessive quantifier syntax is an extension to the Perl 5.8 syn- - tax. Jeffrey Friedl originated the idea (and the name) in the first + The possessive quantifier syntax is an extension to the Perl 5.8 syn- + tax. Jeffrey Friedl originated the idea (and the name) in the first edition of his book. Mike McCloskey liked it, so implemented it when he - built Sun's Java package, and PCRE copied it from there. It ultimately + built Sun's Java package, and PCRE copied it from there. It ultimately found its way into Perl at release 5.10. PCRE has an optimization that automatically "possessifies" certain sim- - ple pattern constructs. For example, the sequence A+B is treated as - A++B because there is no point in backtracking into a sequence of A's + ple pattern constructs. For example, the sequence A+B is treated as + A++B because there is no point in backtracking into a sequence of A's when B must follow. - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a + When a pattern contains an unlimited repeat inside a subpattern that + can itself be repeated an unlimited number of times, the use of an + atomic group is the only way to avoid some failing matches taking a very long time indeed. The pattern (\D+|<\d+>)*[!?] - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it + matches an unlimited number of substrings that either consist of non- + digits, or digits enclosed in <>, followed by either ! or ?. When it matches, it runs quickly. However, if it is applied to aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic + it takes a long time before reporting failure. This is because the + string can be divided between the internal \D+ repeat and the external + * repeat in a large number of ways, and all have to be tried. (The + example uses [!?] rather than a single character at the end, because + both PCRE and Perl have an optimization that allows for fast failure + when a single character is used. They remember the last single charac- + ter that is required for a match, and fail early if it is not present + in the string.) If the pattern is changed so that it uses an atomic group, like this: ((?>\D+)|<\d+>)*[!?] @@ -6096,28 +6441,28 @@ BACK REFERENCES Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there + pattern earlier (that is, to its left) in the pattern, provided there have been that many previous capturing left parentheses. However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. A "forward back - reference" of this type can make sense when a repetition is involved - and the subpattern to the right has participated in an earlier itera- + it is always taken as a back reference, and causes an error only if + there are not that many capturing left parentheses in the entire pat- + tern. In other words, the parentheses that are referenced need not be + to the left of the reference for numbers less than 10. A "forward back + reference" of this type can make sense when a repetition is involved + and the subpattern to the right has participated in an earlier itera- tion. - It is not possible to have a numerical "forward back reference" to a - subpattern whose number is 10 or more using this syntax because a - sequence such as \50 is interpreted as a character defined in octal. + It is not possible to have a numerical "forward back reference" to a + subpattern whose number is 10 or more using this syntax because a + sequence such as \50 is interpreted as a character defined in octal. See the subsection entitled "Non-printing characters" above for further - details of the handling of digits following a backslash. There is no - such problem when named parentheses are used. A back reference to any + details of the handling of digits following a backslash. There is no + such problem when named parentheses are used. A back reference to any subpattern is possible using named parentheses (see below). - Another way of avoiding the ambiguity inherent in the use of digits - following a backslash is to use the \g escape sequence. This escape + Another way of avoiding the ambiguity inherent in the use of digits + following a backslash is to use the \g escape sequence. This escape must be followed by an unsigned number or a negative number, optionally enclosed in braces. These examples are all identical: @@ -6125,7 +6470,7 @@ BACK REFERENCES (ring), \g1 (ring), \g{1} - An unsigned number specifies an absolute reference without the ambigu- + An unsigned number specifies an absolute reference without the ambigu- ity that is present in the older syntax. It is also useful when literal digits follow the reference. A negative number is a relative reference. Consider this example: @@ -6134,33 +6479,33 @@ BACK REFERENCES The sequence \g{-1} is a reference to the most recently started captur- ing subpattern before \g, that is, is it equivalent to \2 in this exam- - ple. Similarly, \g{-2} would be equivalent to \1. The use of relative - references can be helpful in long patterns, and also in patterns that - are created by joining together fragments that contain references + ple. Similarly, \g{-2} would be equivalent to \1. The use of relative + references can be helpful in long patterns, and also in patterns that + are created by joining together fragments that contain references within themselves. - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching + A back reference matches whatever actually matched the capturing sub- + pattern in the current subject string, rather than anything matching the subpattern itself (see "Subpatterns as subroutines" below for a way of doing that). So the pattern (sens|respons)e and \1ibility - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If caseful matching is in force at the + time of the back reference, the case of letters is relevant. For exam- ple, ((?i)rah)\s+\1 - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the + matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original capturing subpattern is matched caselessly. - There are several different ways of writing back references to named - subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or - \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's + There are several different ways of writing back references to named + subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or + \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified back reference syntax, in which \g can be used for both numeric - and named references, is also supported. We could rewrite the above + and named references, is also supported. We could rewrite the above example in any of the following ways: (?<p1>(?i)rah)\s+\k<p1> @@ -6168,66 +6513,67 @@ BACK REFERENCES (?P<p1>(?i)rah)\s+(?P=p1) (?<p1>(?i)rah)\s+\g{p1} - A subpattern that is referenced by name may appear in the pattern + A subpattern that is referenced by name may appear in the pattern before or after the reference. - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back + There may be more than one back reference to the same subpattern. If a + subpattern has not actually been used in a particular match, any back references to it always fail by default. For example, the pattern (a|(bc))\2 - always fails if it starts to match "a" rather than "bc". However, if + always fails if it starts to match "a" rather than "bc". However, if the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- ence to an unset value matches an empty string. - Because there may be many capturing parentheses in a pattern, all dig- - its following a backslash are taken as part of a potential back refer- - ence number. If the pattern continues with a digit character, some - delimiter must be used to terminate the back reference. If the - PCRE_EXTENDED option is set, this can be white space. Otherwise, the + Because there may be many capturing parentheses in a pattern, all dig- + its following a backslash are taken as part of a potential back refer- + ence number. If the pattern continues with a digit character, some + delimiter must be used to terminate the back reference. If the + PCRE_EXTENDED option is set, this can be white space. Otherwise, the \g{ syntax or an empty comment (see "Comments" below) can be used. Recursive back references - A back reference that occurs inside the parentheses to which it refers - fails when the subpattern is first used, so, for example, (a\1) never - matches. However, such references can be useful inside repeated sub- + A back reference that occurs inside the parentheses to which it refers + fails when the subpattern is first used, so, for example, (a\1) never + matches. However, such references can be useful inside repeated sub- patterns. For example, the pattern (a|b\1)+ matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- - ation of the subpattern, the back reference matches the character - string corresponding to the previous iteration. In order for this to - work, the pattern must be such that the first iteration does not need - to match the back reference. This can be done using alternation, as in + ation of the subpattern, the back reference matches the character + string corresponding to the previous iteration. In order for this to + work, the pattern must be such that the first iteration does not need + to match the back reference. This can be done using alternation, as in the example above, or by a quantifier with a minimum of zero. - Back references of this type cause the group that they reference to be - treated as an atomic group. Once the whole group has been matched, a - subsequent matching failure cannot cause backtracking into the middle + Back references of this type cause the group that they reference to be + treated as an atomic group. Once the whole group has been matched, a + subsequent matching failure cannot cause backtracking into the middle of the group. ASSERTIONS - An assertion is a test on the characters following or preceding the - current matching point that does not actually consume any characters. - The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are + An assertion is a test on the characters following or preceding the + current matching point that does not actually consume any characters. + The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described above. - More complicated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the subject - string, and those that look behind it. An assertion subpattern is - matched in the normal way, except that it does not cause the current + More complicated assertions are coded as subpatterns. There are two + kinds: those that look ahead of the current position in the subject + string, and those that look behind it. An assertion subpattern is + matched in the normal way, except that it does not cause the current matching position to be changed. - Assertion subpatterns are not capturing subpatterns. If such an asser- - tion contains capturing subpatterns within it, these are counted for - the purposes of numbering the capturing subpatterns in the whole pat- - tern. However, substring capturing is carried out only for positive - assertions, because it does not make sense for negative assertions. + Assertion subpatterns are not capturing subpatterns. If such an asser- + tion contains capturing subpatterns within it, these are counted for + the purposes of numbering the capturing subpatterns in the whole pat- + tern. However, substring capturing is carried out only for positive + assertions. (Perl sometimes, but not always, does do capturing in nega- + tive assertions.) For compatibility with Perl, assertion subpatterns may be repeated; though it makes no sense to assert the same thing several times, the @@ -6456,25 +6802,20 @@ CONDITIONAL SUBPATTERNS Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used subpattern by name. For compatibility with earlier versions of PCRE, which had this facility before Perl, the syntax (?(name)...) is - also recognized. However, there is a possible ambiguity with this syn- - tax, because subpattern names may consist entirely of digits. PCRE - looks first for a named subpattern; if it cannot find one and the name - consists entirely of digits, PCRE looks for a subpattern of that num- - ber, which must be greater than zero. Using subpattern names that con- - sist entirely of digits is not recommended. + also recognized. Rewriting the above example to use a named subpattern gives this: (?<OPEN> \( )? [^()]+ (?(<OPEN>) \) ) - If the name used in a condition of this kind is a duplicate, the test - is applied to all subpatterns of the same name, and is true if any one + If the name used in a condition of this kind is a duplicate, the test + is applied to all subpatterns of the same name, and is true if any one of them has matched. Checking for pattern recursion If the condition is the string (R), and there is no subpattern with the - name R, the condition is true if a recursive call to the whole pattern + name R, the condition is true if a recursive call to the whole pattern or any subpattern has been made. If digits or a name preceded by amper- sand follow the letter R, for example: @@ -6482,51 +6823,51 @@ CONDITIONAL SUBPATTERNS the condition is true if the most recent recursion is into a subpattern whose number or name is given. This condition does not check the entire - recursion stack. If the name used in a condition of this kind is a + recursion stack. If the name used in a condition of this kind is a duplicate, the test is applied to all subpatterns of the same name, and is true if any one of them is the most recent recursion. - At "top level", all these recursion test conditions are false. The + At "top level", all these recursion test conditions are false. The syntax for recursive patterns is described below. Defining subpatterns for use by reference only - If the condition is the string (DEFINE), and there is no subpattern - with the name DEFINE, the condition is always false. In this case, - there may be only one alternative in the subpattern. It is always - skipped if control reaches this point in the pattern; the idea of - DEFINE is that it can be used to define subroutines that can be refer- - enced from elsewhere. (The use of subroutines is described below.) For - example, a pattern to match an IPv4 address such as "192.168.23.245" + If the condition is the string (DEFINE), and there is no subpattern + with the name DEFINE, the condition is always false. In this case, + there may be only one alternative in the subpattern. It is always + skipped if control reaches this point in the pattern; the idea of + DEFINE is that it can be used to define subroutines that can be refer- + enced from elsewhere. (The use of subroutines is described below.) For + example, a pattern to match an IPv4 address such as "192.168.23.245" could be written like this (ignore white space and line breaks): (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) \b (?&byte) (\.(?&byte)){3} \b - The first part of the pattern is a DEFINE group inside which a another - group named "byte" is defined. This matches an individual component of - an IPv4 address (a number less than 256). When matching takes place, - this part of the pattern is skipped because DEFINE acts like a false - condition. The rest of the pattern uses references to the named group - to match the four dot-separated components of an IPv4 address, insist- + The first part of the pattern is a DEFINE group inside which a another + group named "byte" is defined. This matches an individual component of + an IPv4 address (a number less than 256). When matching takes place, + this part of the pattern is skipped because DEFINE acts like a false + condition. The rest of the pattern uses references to the named group + to match the four dot-separated components of an IPv4 address, insist- ing on a word boundary at each end. Assertion conditions - If the condition is not in any of the above formats, it must be an - assertion. This may be a positive or negative lookahead or lookbehind - assertion. Consider this pattern, again containing non-significant + If the condition is not in any of the above formats, it must be an + assertion. This may be a positive or negative lookahead or lookbehind + assertion. Consider this pattern, again containing non-significant white space, and with the two alternatives on the second line: (?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - The condition is a positive lookahead assertion that matches an - optional sequence of non-letters followed by a letter. In other words, - it tests for the presence of at least one letter in the subject. If a - letter is found, the subject is matched against the first alternative; - otherwise it is matched against the second. This pattern matches - strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are + The condition is a positive lookahead assertion that matches an + optional sequence of non-letters followed by a letter. In other words, + it tests for the presence of at least one letter in the subject. If a + letter is found, the subject is matched against the first alternative; + otherwise it is matched against the second. This pattern matches + strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. @@ -6535,41 +6876,41 @@ COMMENTS There are two ways of including comments in patterns that are processed by PCRE. In both cases, the start of the comment must not be in a char- acter class, nor in the middle of any other sequence of related charac- - ters such as (?: or a subpattern name or number. The characters that + ters such as (?: or a subpattern name or number. The characters that make up a comment play no part in the pattern matching. - The sequence (?# marks the start of a comment that continues up to the - next closing parenthesis. Nested parentheses are not permitted. If the + The sequence (?# marks the start of a comment that continues up to the + next closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED option is set, an unescaped # character also introduces a - comment, which in this case continues to immediately after the next - newline character or character sequence in the pattern. Which charac- + comment, which in this case continues to immediately after the next + newline character or character sequence in the pattern. Which charac- ters are interpreted as newlines is controlled by the options passed to - a compiling function or by a special sequence at the start of the pat- + a compiling function or by a special sequence at the start of the pat- tern, as described in the section entitled "Newline conventions" above. Note that the end of this type of comment is a literal newline sequence - in the pattern; escape sequences that happen to represent a newline do - not count. For example, consider this pattern when PCRE_EXTENDED is + in the pattern; escape sequences that happen to represent a newline do + not count. For example, consider this pattern when PCRE_EXTENDED is set, and the default newline convention is in force: abc #comment \n still comment - On encountering the # character, pcre_compile() skips along, looking - for a newline in the pattern. The sequence \n is still literal at this - stage, so it does not terminate the comment. Only an actual character + On encountering the # character, pcre_compile() skips along, looking + for a newline in the pattern. The sequence \n is still literal at this + stage, so it does not terminate the comment. Only an actual character with the code value 0x0a (the default newline) does so. RECURSIVE PATTERNS - Consider the problem of matching a string in parentheses, allowing for - unlimited nested parentheses. Without the use of recursion, the best - that can be done is to use a pattern that matches up to some fixed - depth of nesting. It is not possible to handle an arbitrary nesting + Consider the problem of matching a string in parentheses, allowing for + unlimited nested parentheses. Without the use of recursion, the best + that can be done is to use a pattern that matches up to some fixed + depth of nesting. It is not possible to handle an arbitrary nesting depth. For some time, Perl has provided a facility that allows regular expres- - sions to recurse (amongst other things). It does this by interpolating - Perl code in the expression at run time, and the code can refer to the + sions to recurse (amongst other things). It does this by interpolating + Perl code in the expression at run time, and the code can refer to the expression itself. A Perl pattern using code interpolation to solve the parentheses problem can be created like this: @@ -6579,201 +6920,201 @@ RECURSIVE PATTERNS refers recursively to the pattern in which it appears. Obviously, PCRE cannot support the interpolation of Perl code. Instead, - it supports special syntax for recursion of the entire pattern, and - also for individual subpattern recursion. After its introduction in - PCRE and Python, this kind of recursion was subsequently introduced + it supports special syntax for recursion of the entire pattern, and + also for individual subpattern recursion. After its introduction in + PCRE and Python, this kind of recursion was subsequently introduced into Perl at release 5.10. - A special item that consists of (? followed by a number greater than - zero and a closing parenthesis is a recursive subroutine call of the - subpattern of the given number, provided that it occurs inside that - subpattern. (If not, it is a non-recursive subroutine call, which is - described in the next section.) The special item (?R) or (?0) is a + A special item that consists of (? followed by a number greater than + zero and a closing parenthesis is a recursive subroutine call of the + subpattern of the given number, provided that it occurs inside that + subpattern. (If not, it is a non-recursive subroutine call, which is + described in the next section.) The special item (?R) or (?0) is a recursive call of the entire regular expression. - This PCRE pattern solves the nested parentheses problem (assume the + This PCRE pattern solves the nested parentheses problem (assume the PCRE_EXTENDED option is set so that white space is ignored): \( ( [^()]++ | (?R) )* \) - First it matches an opening parenthesis. Then it matches any number of - substrings which can either be a sequence of non-parentheses, or a - recursive match of the pattern itself (that is, a correctly parenthe- + First it matches an opening parenthesis. Then it matches any number of + substrings which can either be a sequence of non-parentheses, or a + recursive match of the pattern itself (that is, a correctly parenthe- sized substring). Finally there is a closing parenthesis. Note the use of a possessive quantifier to avoid backtracking into sequences of non- parentheses. - If this were part of a larger pattern, you would not want to recurse + If this were part of a larger pattern, you would not want to recurse the entire pattern, so instead you could use this: ( \( ( [^()]++ | (?1) )* \) ) - We have put the pattern into parentheses, and caused the recursion to + We have put the pattern into parentheses, and caused the recursion to refer to them instead of the whole pattern. - In a larger pattern, keeping track of parenthesis numbers can be - tricky. This is made easier by the use of relative references. Instead + In a larger pattern, keeping track of parenthesis numbers can be + tricky. This is made easier by the use of relative references. Instead of (?1) in the pattern above you can write (?-2) to refer to the second - most recently opened parentheses preceding the recursion. In other - words, a negative number counts capturing parentheses leftwards from + most recently opened parentheses preceding the recursion. In other + words, a negative number counts capturing parentheses leftwards from the point at which it is encountered. - It is also possible to refer to subsequently opened parentheses, by - writing references such as (?+2). However, these cannot be recursive - because the reference is not inside the parentheses that are refer- - enced. They are always non-recursive subroutine calls, as described in + It is also possible to refer to subsequently opened parentheses, by + writing references such as (?+2). However, these cannot be recursive + because the reference is not inside the parentheses that are refer- + enced. They are always non-recursive subroutine calls, as described in the next section. - An alternative approach is to use named parentheses instead. The Perl - syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also + An alternative approach is to use named parentheses instead. The Perl + syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We could rewrite the above example as follows: (?<pn> \( ( [^()]++ | (?&pn) )* \) ) - If there is more than one subpattern with the same name, the earliest + If there is more than one subpattern with the same name, the earliest one is used. - This particular example pattern that we have been looking at contains + This particular example pattern that we have been looking at contains nested unlimited repeats, and so the use of a possessive quantifier for matching strings of non-parentheses is important when applying the pat- - tern to strings that do not match. For example, when this pattern is + tern to strings that do not match. For example, when this pattern is applied to (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - it yields "no match" quickly. However, if a possessive quantifier is - not used, the match runs for a very long time indeed because there are - so many different ways the + and * repeats can carve up the subject, + it yields "no match" quickly. However, if a possessive quantifier is + not used, the match runs for a very long time indeed because there are + so many different ways the + and * repeats can carve up the subject, and all have to be tested before failure can be reported. - At the end of a match, the values of capturing parentheses are those - from the outermost level. If you want to obtain intermediate values, a - callout function can be used (see below and the pcrecallout documenta- + At the end of a match, the values of capturing parentheses are those + from the outermost level. If you want to obtain intermediate values, a + callout function can be used (see below and the pcrecallout documenta- tion). If the pattern above is matched against (ab(cd)ef) - the value for the inner capturing parentheses (numbered 2) is "ef", - which is the last value taken on at the top level. If a capturing sub- - pattern is not matched at the top level, its final captured value is - unset, even if it was (temporarily) set at a deeper level during the + the value for the inner capturing parentheses (numbered 2) is "ef", + which is the last value taken on at the top level. If a capturing sub- + pattern is not matched at the top level, its final captured value is + unset, even if it was (temporarily) set at a deeper level during the matching process. - If there are more than 15 capturing parentheses in a pattern, PCRE has - to obtain extra memory to store data during a recursion, which it does + If there are more than 15 capturing parentheses in a pattern, PCRE has + to obtain extra memory to store data during a recursion, which it does by using pcre_malloc, freeing it via pcre_free afterwards. If no memory can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. - Do not confuse the (?R) item with the condition (R), which tests for - recursion. Consider this pattern, which matches text in angle brack- - ets, allowing for arbitrary nesting. Only digits are allowed in nested - brackets (that is, when recursing), whereas any characters are permit- + Do not confuse the (?R) item with the condition (R), which tests for + recursion. Consider this pattern, which matches text in angle brack- + ets, allowing for arbitrary nesting. Only digits are allowed in nested + brackets (that is, when recursing), whereas any characters are permit- ted at the outer level. < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - In this pattern, (?(R) is the start of a conditional subpattern, with - two different alternatives for the recursive and non-recursive cases. + In this pattern, (?(R) is the start of a conditional subpattern, with + two different alternatives for the recursive and non-recursive cases. The (?R) item is the actual recursive call. Differences in recursion processing between PCRE and Perl - Recursion processing in PCRE differs from Perl in two important ways. - In PCRE (like Python, but unlike Perl), a recursive subpattern call is + Recursion processing in PCRE differs from Perl in two important ways. + In PCRE (like Python, but unlike Perl), a recursive subpattern call is always treated as an atomic group. That is, once it has matched some of the subject string, it is never re-entered, even if it contains untried - alternatives and there is a subsequent matching failure. This can be - illustrated by the following pattern, which purports to match a palin- - dromic string that contains an odd number of characters (for example, + alternatives and there is a subsequent matching failure. This can be + illustrated by the following pattern, which purports to match a palin- + dromic string that contains an odd number of characters (for example, "a", "aba", "abcba", "abcdcba"): ^(.|(.)(?1)\2)$ The idea is that it either matches a single character, or two identical - characters surrounding a sub-palindrome. In Perl, this pattern works; - in PCRE it does not if the pattern is longer than three characters. + characters surrounding a sub-palindrome. In Perl, this pattern works; + in PCRE it does not if the pattern is longer than three characters. Consider the subject string "abcba": - At the top level, the first character is matched, but as it is not at + At the top level, the first character is matched, but as it is not at the end of the string, the first alternative fails; the second alterna- tive is taken and the recursion kicks in. The recursive call to subpat- - tern 1 successfully matches the next character ("b"). (Note that the + tern 1 successfully matches the next character ("b"). (Note that the beginning and end of line tests are not part of the recursion). - Back at the top level, the next character ("c") is compared with what - subpattern 2 matched, which was "a". This fails. Because the recursion - is treated as an atomic group, there are now no backtracking points, - and so the entire match fails. (Perl is able, at this point, to re- - enter the recursion and try the second alternative.) However, if the + Back at the top level, the next character ("c") is compared with what + subpattern 2 matched, which was "a". This fails. Because the recursion + is treated as an atomic group, there are now no backtracking points, + and so the entire match fails. (Perl is able, at this point, to re- + enter the recursion and try the second alternative.) However, if the pattern is written with the alternatives in the other order, things are different: ^((.)(?1)\2|.)$ - This time, the recursing alternative is tried first, and continues to - recurse until it runs out of characters, at which point the recursion - fails. But this time we do have another alternative to try at the - higher level. That is the big difference: in the previous case the + This time, the recursing alternative is tried first, and continues to + recurse until it runs out of characters, at which point the recursion + fails. But this time we do have another alternative to try at the + higher level. That is the big difference: in the previous case the remaining alternative is at a deeper recursion level, which PCRE cannot use. - To change the pattern so that it matches all palindromic strings, not - just those with an odd number of characters, it is tempting to change + To change the pattern so that it matches all palindromic strings, not + just those with an odd number of characters, it is tempting to change the pattern to this: ^((.)(?1)\2|.?)$ - Again, this works in Perl, but not in PCRE, and for the same reason. - When a deeper recursion has matched a single character, it cannot be - entered again in order to match an empty string. The solution is to - separate the two cases, and write out the odd and even cases as alter- + Again, this works in Perl, but not in PCRE, and for the same reason. + When a deeper recursion has matched a single character, it cannot be + entered again in order to match an empty string. The solution is to + separate the two cases, and write out the odd and even cases as alter- natives at the higher level: ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) - If you want to match typical palindromic phrases, the pattern has to + If you want to match typical palindromic phrases, the pattern has to ignore all non-word characters, which can be done like this: ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ If run with the PCRE_CASELESS option, this pattern matches phrases such as "A man, a plan, a canal: Panama!" and it works well in both PCRE and - Perl. Note the use of the possessive quantifier *+ to avoid backtrack- - ing into sequences of non-word characters. Without this, PCRE takes a - great deal longer (ten times or more) to match typical phrases, and + Perl. Note the use of the possessive quantifier *+ to avoid backtrack- + ing into sequences of non-word characters. Without this, PCRE takes a + great deal longer (ten times or more) to match typical phrases, and Perl takes so long that you think it has gone into a loop. - WARNING: The palindrome-matching patterns above work only if the sub- - ject string does not start with a palindrome that is shorter than the - entire string. For example, although "abcba" is correctly matched, if - the subject is "ababa", PCRE finds the palindrome "aba" at the start, - then fails at top level because the end of the string does not follow. - Once again, it cannot jump back into the recursion to try other alter- + WARNING: The palindrome-matching patterns above work only if the sub- + ject string does not start with a palindrome that is shorter than the + entire string. For example, although "abcba" is correctly matched, if + the subject is "ababa", PCRE finds the palindrome "aba" at the start, + then fails at top level because the end of the string does not follow. + Once again, it cannot jump back into the recursion to try other alter- natives, so the entire match fails. - The second way in which PCRE and Perl differ in their recursion pro- - cessing is in the handling of captured values. In Perl, when a subpat- - tern is called recursively or as a subpattern (see the next section), - it has no access to any values that were captured outside the recur- - sion, whereas in PCRE these values can be referenced. Consider this + The second way in which PCRE and Perl differ in their recursion pro- + cessing is in the handling of captured values. In Perl, when a subpat- + tern is called recursively or as a subpattern (see the next section), + it has no access to any values that were captured outside the recur- + sion, whereas in PCRE these values can be referenced. Consider this pattern: ^(.)(\1|a(?2)) - In PCRE, this pattern matches "bab". The first capturing parentheses - match "b", then in the second group, when the back reference \1 fails - to match "b", the second alternative matches "a" and then recurses. In - the recursion, \1 does now match "b" and so the whole match succeeds. - In Perl, the pattern fails to match because inside the recursive call + In PCRE, this pattern matches "bab". The first capturing parentheses + match "b", then in the second group, when the back reference \1 fails + to match "b", the second alternative matches "a" and then recurses. In + the recursion, \1 does now match "b" and so the whole match succeeds. + In Perl, the pattern fails to match because inside the recursive call \1 cannot access the externally set value. SUBPATTERNS AS SUBROUTINES - If the syntax for a recursive subpattern call (either by number or by - name) is used outside the parentheses to which it refers, it operates - like a subroutine in a programming language. The called subpattern may - be defined before or after the reference. A numbered reference can be + If the syntax for a recursive subpattern call (either by number or by + name) is used outside the parentheses to which it refers, it operates + like a subroutine in a programming language. The called subpattern may + be defined before or after the reference. A numbered reference can be absolute or relative, as in these examples: (...(absolute)...)...(?2)... @@ -6784,190 +7125,203 @@ SUBPATTERNS AS SUBROUTINES (sens|respons)e and \1ibility - matches "sense and sensibility" and "response and responsibility", but + matches "sense and sensibility" and "response and responsibility", but not "sense and responsibility". If instead the pattern (sens|respons)e and (?1)ibility - is used, it does match "sense and responsibility" as well as the other - two strings. Another example is given in the discussion of DEFINE + is used, it does match "sense and responsibility" as well as the other + two strings. Another example is given in the discussion of DEFINE above. - All subroutine calls, whether recursive or not, are always treated as - atomic groups. That is, once a subroutine has matched some of the sub- + All subroutine calls, whether recursive or not, are always treated as + atomic groups. That is, once a subroutine has matched some of the sub- ject string, it is never re-entered, even if it contains untried alter- - natives and there is a subsequent matching failure. Any capturing - parentheses that are set during the subroutine call revert to their + natives and there is a subsequent matching failure. Any capturing + parentheses that are set during the subroutine call revert to their previous values afterwards. - Processing options such as case-independence are fixed when a subpat- - tern is defined, so if it is used as a subroutine, such options cannot + Processing options such as case-independence are fixed when a subpat- + tern is defined, so if it is used as a subroutine, such options cannot be changed for different calls. For example, consider this pattern: (abc)(?i:(?-1)) - It matches "abcabc". It does not match "abcABC" because the change of + It matches "abcabc". It does not match "abcABC" because the change of processing option does not affect the called subpattern. ONIGURUMA SUBROUTINE SYNTAX - For compatibility with Oniguruma, the non-Perl syntax \g followed by a + For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a subroutine, - possibly recursively. Here are two of the examples used above, rewrit- + an alternative syntax for referencing a subpattern as a subroutine, + possibly recursively. Here are two of the examples used above, rewrit- ten using this syntax: (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) ) (sens|respons)e and \g'1'ibility - PCRE supports an extension to Oniguruma: if a number is preceded by a + PCRE supports an extension to Oniguruma: if a number is preceded by a plus or a minus sign it is taken as a relative reference. For example: (abc)(?i:\g<-1>) - Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not - synonymous. The former is a back reference; the latter is a subroutine + Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not + synonymous. The former is a back reference; the latter is a subroutine call. CALLOUTS Perl has a feature whereby using the sequence (?{...}) causes arbitrary - Perl code to be obeyed in the middle of matching a regular expression. + Perl code to be obeyed in the middle of matching a regular expression. This makes it possible, amongst other things, to extract different sub- strings that match the same pair of parentheses when there is a repeti- tion. PCRE provides a similar feature, but of course it cannot obey arbitrary Perl code. The feature is called "callout". The caller of PCRE provides - an external function by putting its entry point in the global variable - pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit - library). By default, this variable contains NULL, which disables all + an external function by putting its entry point in the global variable + pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit + library). By default, this variable contains NULL, which disables all calling out. - Within a regular expression, (?C) indicates the points at which the - external function is to be called. If you want to identify different - callout points, you can put a number less than 256 after the letter C. - The default value is zero. For example, this pattern has two callout + Within a regular expression, (?C) indicates the points at which the + external function is to be called. If you want to identify different + callout points, you can put a number less than 256 after the letter C. + The default value is zero. For example, this pattern has two callout points: (?C1)abc(?C2)def - If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- - outs are automatically installed before each item in the pattern. They - are all numbered 255. + If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- + outs are automatically installed before each item in the pattern. They + are all numbered 255. If there is a conditional group in the pattern + whose condition is an assertion, an additional callout is inserted just + before the condition. An explicit callout may also be set at this posi- + tion, as in this example: + + (?(?C9)(?=a)abc|def) + + Note that this applies only to assertion conditions, not to other types + of condition. - During matching, when PCRE reaches a callout point, the external func- - tion is called. It is provided with the number of the callout, the - position in the pattern, and, optionally, one item of data originally - supplied by the caller of the matching function. The callout function - may cause matching to proceed, to backtrack, or to fail altogether. A - complete description of the interface to the callout function is given - in the pcrecallout documentation. + During matching, when PCRE reaches a callout point, the external func- + tion is called. It is provided with the number of the callout, the + position in the pattern, and, optionally, one item of data originally + supplied by the caller of the matching function. The callout function + may cause matching to proceed, to backtrack, or to fail altogether. + + By default, PCRE implements a number of optimizations at compile time + and matching time, and one side-effect is that sometimes callouts are + skipped. If you need all possible callouts to happen, you need to set + options that disable the relevant optimizations. More details, and a + complete description of the interface to the callout function, are + given in the pcrecallout documentation. BACKTRACKING CONTROL Perl 5.10 introduced a number of "Special Backtracking Control Verbs", - which are described in the Perl documentation as "experimental and sub- - ject to change or removal in a future version of Perl". It goes on to - say: "Their usage in production code should be noted to avoid problems - during upgrades." The same remarks apply to the PCRE features described - in this section. - - Since these verbs are specifically related to backtracking, most of - them can be used only when the pattern is to be matched using one of - the traditional matching functions, which use a backtracking algorithm. - With the exception of (*FAIL), which behaves like a failing negative - assertion, they cause an error if encountered by a DFA matching func- - tion. + which are still described in the Perl documentation as "experimental + and subject to change or removal in a future version of Perl". It goes + on to say: "Their usage in production code should be noted to avoid + problems during upgrades." The same remarks apply to the PCRE features + described in this section. - If any of these verbs are used in an assertion or in a subpattern that - is called as a subroutine (whether or not recursively), their effect is - confined to that subpattern; it does not extend to the surrounding pat- - tern, with one exception: the name from a *(MARK), (*PRUNE), or (*THEN) - that is encountered in a successful positive assertion is passed back - when a match succeeds (compare capturing parentheses in assertions). - Note that such subpatterns are processed as anchored at the point where - they are tested. Note also that Perl's treatment of subroutines and - assertions is different in some cases. - - The new verbs make use of what was previously invalid syntax: an open- + The new verbs make use of what was previously invalid syntax: an open- ing parenthesis followed by an asterisk. They are generally of the form - (*VERB) or (*VERB:NAME). Some may take either form, with differing be- - haviour, depending on whether or not an argument is present. A name is + (*VERB) or (*VERB:NAME). Some may take either form, possibly behaving + differently depending on whether or not a name is present. A name is any sequence of characters that does not include a closing parenthesis. The maximum length of name is 255 in the 8-bit library and 65535 in the - 16-bit and 32-bit library. If the name is empty, that is, if the clos- - ing parenthesis immediately follows the colon, the effect is as if the - colon were not there. Any number of these verbs may occur in a pattern. + 16-bit and 32-bit libraries. If the name is empty, that is, if the + closing parenthesis immediately follows the colon, the effect is as if + the colon were not there. Any number of these verbs may occur in a + pattern. + + Since these verbs are specifically related to backtracking, most of + them can be used only when the pattern is to be matched using one of + the traditional matching functions, because these use a backtracking + algorithm. With the exception of (*FAIL), which behaves like a failing + negative assertion, the backtracking control verbs cause an error if + encountered by a DFA matching function. + + The behaviour of these verbs in repeated groups, assertions, and in + subpatterns called as subroutines (whether or not recursively) is docu- + mented below. Optimizations that affect backtracking verbs - PCRE contains some optimizations that are used to speed up matching by + PCRE contains some optimizations that are used to speed up matching by running some checks at the start of each match attempt. For example, it - may know the minimum length of matching subject, or that a particular - character must be present. When one of these optimizations suppresses - the running of a match, any included backtracking verbs will not, of + may know the minimum length of matching subject, or that a particular + character must be present. When one of these optimizations bypasses the + running of a match, any included backtracking verbs will not, of course, be processed. You can suppress the start-of-match optimizations - by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- + by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT). There is more discussion of this option in the section entitled "Option bits for pcre_exec()" in the pcreapi documentation. - Experiments with Perl suggest that it too has similar optimizations, + Experiments with Perl suggest that it too has similar optimizations, sometimes leading to anomalous results. Verbs that act immediately - The following verbs act as soon as they are encountered. They may not + The following verbs act as soon as they are encountered. They may not be followed by a name. (*ACCEPT) - This verb causes the match to end successfully, skipping the remainder - of the pattern. However, when it is inside a subpattern that is called - as a subroutine, only that subpattern is ended successfully. Matching - then continues at the outer level. If (*ACCEPT) is inside capturing - parentheses, the data so far is captured. For example: + This verb causes the match to end successfully, skipping the remainder + of the pattern. However, when it is inside a subpattern that is called + as a subroutine, only that subpattern is ended successfully. Matching + then continues at the outer level. If (*ACCEPT) in triggered in a posi- + tive assertion, the assertion succeeds; in a negative assertion, the + assertion fails. + + If (*ACCEPT) is inside capturing parentheses, the data so far is cap- + tured. For example: A((?:A|B(*ACCEPT)|C)D) - This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- + This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- tured by the outer parentheses. (*FAIL) or (*F) - This verb causes a matching failure, forcing backtracking to occur. It - is equivalent to (?!) but easier to read. The Perl documentation notes - that it is probably useful only when combined with (?{}) or (??{}). - Those are, of course, Perl features that are not present in PCRE. The - nearest equivalent is the callout feature, as for example in this pat- + This verb causes a matching failure, forcing backtracking to occur. It + is equivalent to (?!) but easier to read. The Perl documentation notes + that it is probably useful only when combined with (?{}) or (??{}). + Those are, of course, Perl features that are not present in PCRE. The + nearest equivalent is the callout feature, as for example in this pat- tern: a+(?C)(*FAIL) - A match with the string "aaaa" always fails, but the callout is taken + A match with the string "aaaa" always fails, but the callout is taken before each backtrack happens (in this example, 10 times). Recording which path was taken - There is one verb whose main purpose is to track how a match was - arrived at, though it also has a secondary use in conjunction with + There is one verb whose main purpose is to track how a match was + arrived at, though it also has a secondary use in conjunction with advancing the match starting point (see (*SKIP) below). (*MARK:NAME) or (*:NAME) - A name is always required with this verb. There may be as many - instances of (*MARK) as you like in a pattern, and their names do not + A name is always required with this verb. There may be as many + instances of (*MARK) as you like in a pattern, and their names do not have to be unique. - When a match succeeds, the name of the last-encountered (*MARK) on the - matching path is passed back to the caller as described in the section - entitled "Extra data for pcre_exec()" in the pcreapi documentation. - Here is an example of pcretest output, where the /K modifier requests - the retrieval and outputting of (*MARK) data: + When a match succeeds, the name of the last-encountered (*MARK:NAME), + (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to + the caller as described in the section entitled "Extra data for + pcre_exec()" in the pcreapi documentation. Here is an example of + pcretest output, where the /K modifier requests the retrieval and out- + putting of (*MARK) data: re> /X(*MARK:A)Y|X(*MARK:B)Z/K data> XY @@ -6982,57 +7336,67 @@ BACKTRACKING CONTROL efficient way of obtaining this information than putting each alterna- tive in its own capturing parentheses. - If (*MARK) is encountered in a positive assertion, its name is recorded - and passed back if it is the last-encountered. This does not happen for - negative assertions. + If a verb with a name is encountered in a positive assertion that is + true, the name is recorded and passed back if it is the last-encoun- + tered. This does not happen for negative assertions or failing positive + assertions. - After a partial match or a failed match, the name of the last encoun- - tered (*MARK) in the entire match process is returned. For example: + After a partial match or a failed match, the last encountered name in + the entire match process is returned. For example: re> /X(*MARK:A)Y|X(*MARK:B)Z/K data> XP No match, mark = B - Note that in this unanchored example the mark is retained from the + Note that in this unanchored example the mark is retained from the match attempt that started at the letter "X" in the subject. Subsequent match attempts starting at "P" and then with an empty string do not get as far as the (*MARK) item, but nevertheless do not reset it. - If you are interested in (*MARK) values after failed matches, you - should probably set the PCRE_NO_START_OPTIMIZE option (see above) to + If you are interested in (*MARK) values after failed matches, you + should probably set the PCRE_NO_START_OPTIMIZE option (see above) to ensure that the match is always attempted. Verbs that act after backtracking The following verbs do nothing when they are encountered. Matching con- - tinues with what follows, but if there is no subsequent match, causing - a backtrack to the verb, a failure is forced. That is, backtracking - cannot pass to the left of the verb. However, when one of these verbs - appears inside an atomic group, its effect is confined to that group, - because once the group has been matched, there is never any backtrack- - ing into it. In this situation, backtracking can "jump back" to the - left of the entire atomic group. (Remember also, as stated above, that - this localization also applies in subroutine calls and assertions.) + tinues with what follows, but if there is no subsequent match, causing + a backtrack to the verb, a failure is forced. That is, backtracking + cannot pass to the left of the verb. However, when one of these verbs + appears inside an atomic group or an assertion that is true, its effect + is confined to that group, because once the group has been matched, + there is never any backtracking into it. In this situation, backtrack- + ing can "jump back" to the left of the entire atomic group or asser- + tion. (Remember also, as stated above, that this localization also + applies in subroutine calls.) These verbs differ in exactly what kind of failure occurs when back- - tracking reaches them. + tracking reaches them. The behaviour described below is what happens + when the verb is not in a subroutine or an assertion. Subsequent sec- + tions cover these special cases. (*COMMIT) This verb, which may not be followed by a name, causes the whole match - to fail outright if the rest of the pattern does not match. Even if the - pattern is unanchored, no further attempts to find a match by advancing - the starting point take place. Once (*COMMIT) has been passed, - pcre_exec() is committed to finding a match at the current starting - point, or not at all. For example: + to fail outright if there is a later matching failure that causes back- + tracking to reach it. Even if the pattern is unanchored, no further + attempts to find a match by advancing the starting point take place. If + (*COMMIT) is the only backtracking verb that is encountered, once it + has been passed pcre_exec() is committed to finding a match at the cur- + rent starting point, or not at all. For example: a+(*COMMIT)b - This matches "xxaab" but not "aacaab". It can be thought of as a kind + This matches "xxaab" but not "aacaab". It can be thought of as a kind of dynamic anchor, or "I've started, so I must finish." The name of the - most recently passed (*MARK) in the path is passed back when (*COMMIT) + most recently passed (*MARK) in the path is passed back when (*COMMIT) forces a match failure. + If there is more than one backtracking verb in a pattern, a different + one that follows (*COMMIT) may be triggered first, so merely passing + (*COMMIT) during a match does not always guarantee that a match must be + at this starting point. + Note that (*COMMIT) at the start of a pattern is not the same as an anchor, unless PCRE's start-of-match optimizations are turned off, as shown in this pcretest example: @@ -7052,66 +7416,80 @@ BACKTRACKING CONTROL (*PRUNE) or (*PRUNE:NAME) This verb causes the match to fail at the current starting position in - the subject if the rest of the pattern does not match. If the pattern - is unanchored, the normal "bumpalong" advance to the next starting - character then happens. Backtracking can occur as usual to the left of - (*PRUNE), before it is reached, or when matching to the right of - (*PRUNE), but if there is no match to the right, backtracking cannot - cross (*PRUNE). In simple cases, the use of (*PRUNE) is just an alter- - native to an atomic group or possessive quantifier, but there are some - uses of (*PRUNE) that cannot be expressed in any other way. The behav- - iour of (*PRUNE:NAME) is the same as (*MARK:NAME)(*PRUNE). In an - anchored pattern (*PRUNE) has the same effect as (*COMMIT). + the subject if there is a later matching failure that causes backtrack- + ing to reach it. If the pattern is unanchored, the normal "bumpalong" + advance to the next starting character then happens. Backtracking can + occur as usual to the left of (*PRUNE), before it is reached, or when + matching to the right of (*PRUNE), but if there is no match to the + right, backtracking cannot cross (*PRUNE). In simple cases, the use of + (*PRUNE) is just an alternative to an atomic group or possessive quan- + tifier, but there are some uses of (*PRUNE) that cannot be expressed in + any other way. In an anchored pattern (*PRUNE) has the same effect as + (*COMMIT). + + The behaviour of (*PRUNE:NAME) is the not the same as + (*MARK:NAME)(*PRUNE). It is like (*MARK:NAME) in that the name is + remembered for passing back to the caller. However, (*SKIP:NAME) + searches only for names set with (*MARK). (*SKIP) - This verb, when given without a name, is like (*PRUNE), except that if - the pattern is unanchored, the "bumpalong" advance is not to the next + This verb, when given without a name, is like (*PRUNE), except that if + the pattern is unanchored, the "bumpalong" advance is not to the next character, but to the position in the subject where (*SKIP) was encoun- - tered. (*SKIP) signifies that whatever text was matched leading up to + tered. (*SKIP) signifies that whatever text was matched leading up to it cannot be part of a successful match. Consider: a+(*SKIP)b - If the subject is "aaaac...", after the first match attempt fails - (starting at the first character in the string), the starting point + If the subject is "aaaac...", after the first match attempt fails + (starting at the first character in the string), the starting point skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect as this example; although it would - suppress backtracking during the first match attempt, the second - attempt would start at the second character instead of skipping on to + tifer does not have the same effect as this example; although it would + suppress backtracking during the first match attempt, the second + attempt would start at the second character instead of skipping on to "c". (*SKIP:NAME) - When (*SKIP) has an associated name, its behaviour is modified. If the - following pattern fails to match, the previous path through the pattern - is searched for the most recent (*MARK) that has the same name. If one - is found, the "bumpalong" advance is to the subject position that cor- - responds to that (*MARK) instead of to where (*SKIP) was encountered. - If no (*MARK) with a matching name is found, the (*SKIP) is ignored. + When (*SKIP) has an associated name, its behaviour is modified. When it + is triggered, the previous path through the pattern is searched for the + most recent (*MARK) that has the same name. If one is found, the + "bumpalong" advance is to the subject position that corresponds to that + (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with + a matching name is found, the (*SKIP) is ignored. + + Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It + ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME). (*THEN) or (*THEN:NAME) - This verb causes a skip to the next innermost alternative if the rest - of the pattern does not match. That is, it cancels pending backtrack- - ing, but only within the current alternative. Its name comes from the - observation that it can be used for a pattern-based if-then-else block: + This verb causes a skip to the next innermost alternative when back- + tracking reaches it. That is, it cancels any further backtracking + within the current alternative. Its name comes from the observation + that it can be used for a pattern-based if-then-else block: ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... If the COND1 pattern matches, FOO is tried (and possibly further items after the end of the group if FOO succeeds); on failure, the matcher skips to the second alternative and tries COND2, without backtracking - into COND1. The behaviour of (*THEN:NAME) is exactly the same as - (*MARK:NAME)(*THEN). If (*THEN) is not inside an alternation, it acts - like (*PRUNE). - - Note that a subpattern that does not contain a | character is just a - part of the enclosing alternative; it is not a nested alternation with - only one alternative. The effect of (*THEN) extends beyond such a sub- - pattern to the enclosing alternative. Consider this pattern, where A, - B, etc. are complex pattern fragments that do not contain any | charac- - ters at this level: + into COND1. If that succeeds and BAR fails, COND3 is tried. If subse- + quently BAZ fails, there are no more alternatives, so there is a back- + track to whatever came before the entire group. If (*THEN) is not + inside an alternation, it acts like (*PRUNE). + + The behaviour of (*THEN:NAME) is the not the same as + (*MARK:NAME)(*THEN). It is like (*MARK:NAME) in that the name is + remembered for passing back to the caller. However, (*SKIP:NAME) + searches only for names set with (*MARK). + + A subpattern that does not contain a | character is just a part of the + enclosing alternative; it is not a nested alternation with only one + alternative. The effect of (*THEN) extends beyond such a subpattern to + the enclosing alternative. Consider this pattern, where A, B, etc. are + complex pattern fragments that do not contain any | characters at this + level: A (B(*THEN)C) | D @@ -7127,7 +7505,7 @@ BACKTRACKING CONTROL tern to fail because there are no more alternatives to try. In this case, matching does now backtrack into A. - Note also that a conditional subpattern is not considered as having two + Note that a conditional subpattern is not considered as having two alternatives, because only one is ever used. In other words, the | character in a conditional subpattern has a different meaning. Ignoring white space, consider: @@ -7151,16 +7529,78 @@ BACKTRACKING CONTROL the advance may be more than one character. (*COMMIT) is the strongest, causing the entire match to fail. - If more than one such verb is present in a pattern, the "strongest" one - wins. For example, consider this pattern, where A, B, etc. are complex - pattern fragments: + More than one backtracking verb + + If more than one backtracking verb is present in a pattern, the one + that is backtracked onto first acts. For example, consider this pat- + tern, where A, B, etc. are complex pattern fragments: + + (A(*COMMIT)B(*THEN)C|ABD) + + If A matches but B fails, the backtrack to (*COMMIT) causes the entire + match to fail. However, if A and B match, but C fails, the backtrack to + (*THEN) causes the next alternative (ABD) to be tried. This behaviour + is consistent, but is not always the same as Perl's. It means that if + two or more backtracking verbs appear in succession, all the the last + of them has no effect. Consider this example: + + ...(*COMMIT)(*PRUNE)... + + If there is a matching failure to the right, backtracking onto (*PRUNE) + causes it to be triggered, and its action is taken. There can never be + a backtrack onto (*COMMIT). + + Backtracking verbs in repeated groups + + PCRE differs from Perl in its handling of backtracking verbs in + repeated groups. For example, consider: + + /(a(*COMMIT)b)+ac/ + + If the subject is "abac", Perl matches, but PCRE fails because the + (*COMMIT) in the second repeat of the group acts. + + Backtracking verbs in assertions + + (*FAIL) in an assertion has its normal effect: it forces an immediate + backtrack. + + (*ACCEPT) in a positive assertion causes the assertion to succeed with- + out any further processing. In a negative assertion, (*ACCEPT) causes + the assertion to fail without any further processing. - (A(*COMMIT)B(*THEN)C|D) + The other backtracking verbs are not treated specially if they appear + in a positive assertion. In particular, (*THEN) skips to the next + alternative in the innermost enclosing group that has alternations, + whether or not this is within the assertion. - Once A has matched, PCRE is committed to this match, at the current - starting position. If subsequently B matches, but C does not, the nor- - mal (*THEN) action of trying the next alternative (that is, D) does not - happen because (*COMMIT) overrides. + Negative assertions are, however, different, in order to ensure that + changing a positive assertion into a negative assertion changes its + result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg- + ative assertion to be true, without considering any further alternative + branches in the assertion. Backtracking into (*THEN) causes it to skip + to the next enclosing alternative within the assertion (the normal be- + haviour), but if the assertion does not have such an alternative, + (*THEN) behaves like (*PRUNE). + + Backtracking verbs in subroutines + + These behaviours occur whether or not the subpattern is called recur- + sively. Perl's treatment of subroutines is different in some cases. + + (*FAIL) in a subpattern called as a subroutine has its normal effect: + it forces an immediate backtrack. + + (*ACCEPT) in a subpattern called as a subroutine causes the subroutine + match to succeed without any further processing. Matching then contin- + ues after the subroutine call. + + (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine + cause the subroutine match to fail. + + (*THEN) skips to the next alternative in the innermost enclosing group + within the subpattern that has alternatives. If there is no such group + within the subpattern, (*THEN) causes the subroutine match to fail. SEE ALSO @@ -7178,18 +7618,18 @@ AUTHOR REVISION - Last updated: 11 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 03 December 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRESYNTAX(3) PCRESYNTAX(3) +PCRESYNTAX(3) Library Functions Manual PCRESYNTAX(3) + NAME PCRE - Perl-compatible regular expressions - PCRE REGULAR EXPRESSION SYNTAX SUMMARY The full syntax and semantics of the regular expressions that are sup- @@ -7212,10 +7652,15 @@ CHARACTERS \n newline (hex 0A) \r carriage return (hex 0D) \t tab (hex 09) + \0dd character with octal code 0dd \ddd character with octal code ddd, or backreference + \o{ddd..} character with octal code ddd.. \xhh character with hex code hh \x{hhh..} character with hex code hhh.. + Note that \0dd is always an octal code, and that \8 and \9 are the lit- + eral characters "8" and "9". + CHARACTER TYPES @@ -7238,9 +7683,12 @@ CHARACTER TYPES \W a "non-word" character \X a Unicode extended grapheme cluster - In PCRE, by default, \d, \D, \s, \S, \w, and \W recognize only ASCII - characters, even in a UTF mode. However, this can be changed by setting - the PCRE_UCP option. + By default, \d, \s, and \w match only ASCII characters, even in UTF-8 + mode or in the 16- bit and 32-bit libraries. However, if locale-spe- + cific matching is happening, \s and \w may also match characters with + code points in the range 128-255. If the PCRE_UCP option is set, the + behaviour of these escape sequences is changed to use Unicode proper- + ties and they match many more characters. GENERAL CATEGORY PROPERTIES FOR \p and \P @@ -7295,27 +7743,32 @@ PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P Xan Alphanumeric: union of properties L and N Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, FF, CR + Xsp Perl space: property Z or tab, NL, VT, FF, CR + Xuc Univerally-named character: one that can be + represented by a Universal Character Name Xwd Perl word: property Xan or underscore + Perl and POSIX space are now the same. Perl added VT to its space char- + acter set at release 5.18 and PCRE changed at release 8.34. + SCRIPT NAMES FOR \p AND \P - Arabic, Armenian, Avestan, Balinese, Bamum, Batak, Bengali, Bopomofo, - Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Carian, Chakma, - Cham, Cherokee, Common, Coptic, Cuneiform, Cypriot, Cyrillic, Deseret, - Devanagari, Egyptian_Hieroglyphs, Ethiopic, Georgian, Glagolitic, - Gothic, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hira- - gana, Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Lao, Latin, Lepcha, Limbu, Linear_B, Lisu, Lycian, + Arabic, Armenian, Avestan, Balinese, Bamum, Batak, Bengali, Bopomofo, + Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Carian, Chakma, + Cham, Cherokee, Common, Coptic, Cuneiform, Cypriot, Cyrillic, Deseret, + Devanagari, Egyptian_Hieroglyphs, Ethiopic, Georgian, Glagolitic, + Gothic, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hira- + gana, Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- + tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, + Kharoshthi, Khmer, Lao, Latin, Lepcha, Limbu, Linear_B, Lisu, Lycian, Lydian, Malayalam, Mandaic, Meetei_Mayek, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Mongolian, Myanmar, New_Tai_Lue, Nko, - Ogham, Old_Italic, Old_Persian, Old_South_Arabian, Old_Turkic, - Ol_Chiki, Oriya, Osmanya, Phags_Pa, Phoenician, Rejang, Runic, Samari- - tan, Saurashtra, Sharada, Shavian, Sinhala, Sora_Sompeng, Sundanese, - Syloti_Nagri, Syriac, Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, - Takri, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Ugaritic, Vai, + Meroitic_Hieroglyphs, Miao, Mongolian, Myanmar, New_Tai_Lue, Nko, + Ogham, Old_Italic, Old_Persian, Old_South_Arabian, Old_Turkic, + Ol_Chiki, Oriya, Osmanya, Phags_Pa, Phoenician, Rejang, Runic, Samari- + tan, Saurashtra, Sharada, Shavian, Sinhala, Sora_Sompeng, Sundanese, + Syloti_Nagri, Syriac, Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, + Takri, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Ugaritic, Vai, Yi. @@ -7342,8 +7795,8 @@ CHARACTER CLASSES word same as \w xdigit hexadecimal digit - In PCRE, POSIX character set names recognize only ASCII characters by - default, but some of them use Unicode properties if PCRE_UCP is set. + In PCRE, POSIX character set names recognize only ASCII characters by + default, but some of them use Unicode properties if PCRE_UCP is set. You can use \Q...\E inside a character class. @@ -7424,9 +7877,11 @@ OPTION SETTING (?x) extended (ignore white space) (?-...) unset option(s) - The following are recognized only at the start of a pattern or after + The following are recognized only at the start of a pattern or after one of the newline-setting options with similar syntax: + (*LIMIT_MATCH=d) set the match limit to d (decimal number) + (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) @@ -7434,6 +7889,9 @@ OPTION SETTING (*UTF) set appropriate UTF mode for the library in use (*UCP) set PCRE_UCP (use Unicode properties for \d etc) + Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of + the limits set by the caller of pcre_exec(), not increase them. + LOOKAHEAD AND LOOKBEHIND ASSERTIONS @@ -7558,18 +8016,18 @@ AUTHOR REVISION - Last updated: 11 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREUNICODE(3) PCREUNICODE(3) +PCREUNICODE(3) Library Functions Manual PCREUNICODE(3) + NAME PCRE - Perl-compatible regular expressions - UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) @@ -7632,7 +8090,9 @@ UNICODE PROPERTY SUPPORT fication. Earlier releases of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 to U+10FFFF, exclud- - ing the surrogate area and the non-characters. + ing the surrogate area. (From release 8.33 the so-called "non-charac- + ter" code points are no longer excluded because Unicode corrigendum #9 + makes it clear that they should not be.) Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, where they are used in pairs to encode codepoints with values @@ -7641,10 +8101,6 @@ UNICODE PROPERTY SUPPORT other words, the whole surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and UTF-32.) - Also excluded are the "Non-Character" code points, which are U+FDD0 to - U+FDEF and the last two code points in each plane, U+??FFFE and - U+??FFFF. - If an invalid UTF-8 string is passed to PCRE, an error return is given. At compile time, the only additional information is the offset to the first byte of the failing character. The run-time functions pcre_exec() @@ -7676,10 +8132,6 @@ UNICODE PROPERTY SUPPORT surrogate range U+D800 to U+DFFF are independent code points. Values in the surrogate range must be used in pairs in the correct manner. - Excluded are the "Non-Character" code points, which are U+FDD0 to - U+FDEF and the last two code points in each plane, U+??FFFE and - U+??FFFF. - If an invalid UTF-16 string is passed to PCRE, an error return is given. At compile time, the only additional information is the offset to the first data unit of the failing character. The run-time functions @@ -7701,77 +8153,76 @@ UNICODE PROPERTY SUPPORT are passed as patterns and subjects are (by default) checked for valid- ity on entry to the relevant functions. This check allows only values in the range U+0 to U+10FFFF, excluding the surrogate area U+D800 to - U+DFFF, and the "Non-Character" code points, which are U+FDD0 to U+FDEF - and the last two characters in each plane, U+??FFFE and U+??FFFF. + U+DFFF. - If an invalid UTF-32 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset + If an invalid UTF-32 string is passed to PCRE, an error return is + given. At compile time, the only additional information is the offset to the first data unit of the failing character. The run-time functions pcre32_exec() and pcre32_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory + well as a more detailed reason code if the caller has provided memory in which to do this. - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at + In some situations, you may already know that your strings are valid, + and therefore want to skip these checks in order to improve perfor- + mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that the pattern or subject it is given (respec- tively) contains only valid UTF-32 sequences. In this case, it does not - diagnose an invalid UTF-32 string. However, if an invalid string is + diagnose an invalid UTF-32 string. However, if an invalid string is passed, the result is undefined. General comments about UTF modes - 1. Codepoints less than 256 can be specified in patterns by either + 1. Codepoints less than 256 can be specified in patterns by either braced or unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger values have to use braced sequences. - 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they + 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match two-byte characters for values greater than \177. 3. Repeat quantifiers apply to complete UTF characters, not to individ- ual data units, for example: \x{100}{3}. - 4. The dot metacharacter matches one UTF character instead of a single + 4. The dot metacharacter matches one UTF character instead of a single data unit. - 5. The escape sequence \C can be used to match a single byte in UTF-8 - mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit - data unit in UTF-32 mode, but its use can lead to some strange effects - because it breaks up multi-unit characters (see the description of \C - in the pcrepattern documentation). The use of \C is not supported in - the alternative matching function pcre[16|32]_dfa_exec(), nor is it + 5. The escape sequence \C can be used to match a single byte in UTF-8 + mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit + data unit in UTF-32 mode, but its use can lead to some strange effects + because it breaks up multi-unit characters (see the description of \C + in the pcrepattern documentation). The use of \C is not supported in + the alternative matching function pcre[16|32]_dfa_exec(), nor is it supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If - JIT optimization is requested for a UTF pattern that contains \C, it + JIT optimization is requested for a UTF pattern that contains \C, it will not succeed, and so the matching will be carried out by the normal interpretive function. - 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly + 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly test characters of any code value, but, by default, the characters that - PCRE recognizes as digits, spaces, or word characters remain the same - set as in non-UTF mode, all with values less than 256. This remains - true even when PCRE is built to include Unicode property support, + PCRE recognizes as digits, spaces, or word characters remain the same + set as in non-UTF mode, all with values less than 256. This remains + true even when PCRE is built to include Unicode property support, because to do otherwise would slow down PCRE in many common cases. Note - in particular that this applies to \b and \B, because they are defined + in particular that this applies to \b and \B, because they are defined in terms of \w and \W. If you really want to test for a wider sense of, - say, "digit", you can use explicit Unicode property tests such as + say, "digit", you can use explicit Unicode property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the - character escapes work is changed so that Unicode properties are used + character escapes work is changed so that Unicode properties are used to determine which characters match. There are more details in the sec- tion on generic character types in the pcrepattern documentation. - 7. Similarly, characters that match the POSIX named character classes + 7. Similarly, characters that match the POSIX named character classes are all low-valued characters, unless the PCRE_UCP option is set. - 8. However, the horizontal and vertical white space matching escapes - (\h, \H, \v, and \V) do match all the appropriate Unicode characters, + 8. However, the horizontal and vertical white space matching escapes + (\h, \H, \v, and \V) do match all the appropriate Unicode characters, whether or not PCRE_UCP is set. - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - A few Unicode characters such as Greek sigma have more than two code- + 9. Case-insensitive matching applies only to characters whose values + are less than 128, unless PCRE is built with Unicode property support. + A few Unicode characters such as Greek sigma have more than two code- points that are case-equivalent. Up to and including PCRE release 8.31, - only one-to-one case mappings were supported, but later releases (with - Unicode property support) do treat as case-equivalent all versions of + only one-to-one case mappings were supported, but later releases (with + Unicode property support) do treat as case-equivalent all versions of characters such as Greek sigma. @@ -7784,18 +8235,18 @@ AUTHOR REVISION - Last updated: 11 November 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 27 February 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREJIT(3) PCREJIT(3) +PCREJIT(3) Library Functions Manual PCREJIT(3) + NAME PCRE - Perl-compatible regular expressions - PCRE JUST-IN-TIME COMPILER SUPPORT Just-in-time compiling is a heavyweight optimization that can greatly @@ -7941,15 +8392,9 @@ UNSUPPORTED OPTIONS AND PATTERN ITEMS BOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PAR- TIAL_HARD, and PCRE_PARTIAL_SOFT. - The unsupported pattern items are: - - \C match a single byte; not supported in UTF-8 mode - (?Cn) callouts - (*PRUNE) ) - (*SKIP) ) backtracking control verbs - (*THEN) ) - - Support for some of these may be added in future. + The only unsupported pattern items are \C (match a single data unit) + when running in a UTF mode, and a callout immediately before an asser- + tion condition in a conditional group. RETURN VALUES FROM JIT EXECUTION @@ -8203,18 +8648,18 @@ AUTHOR REVISION - Last updated: 31 October 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 17 March 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREPARTIAL(3) PCREPARTIAL(3) +PCREPARTIAL(3) Library Functions Manual PCREPARTIAL(3) + NAME PCRE - Perl-compatible regular expressions - PARTIAL MATCHING IN PCRE In normal use of PCRE, if the subject string that is passed to a match- @@ -8273,7 +8718,7 @@ PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() A partial match occurs during a call to pcre_exec() or pcre[16|32]_exec() when the end of the subject string is reached suc- cessfully, but matching cannot continue because more characters are - needed. However, at least one character in the subject must have been + needed. However, at least one character in the subject must have been inspected. This character need not form part of the final matched string; lookbehind assertions and the \K escape sequence provide ways of inspecting characters before the start of a matched substring. The @@ -8286,18 +8731,22 @@ PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() match is returned, the first slot is set to the offset of the earliest character that was inspected. For convenience, the second offset points to the end of the subject so that a substring can easily be identified. + If there are at least three slots in the offsets vector, the third slot + is set to the offset of the character where matching started. - For the majority of patterns, the first offset identifies the start of - the partially matched string. However, for patterns that contain look- - behind assertions, or \K, or begin with \b or \B, earlier characters - have been inspected while carrying out the match. For example: + For the majority of patterns, the contents of the first and third slots + will be the same. However, for patterns that contain lookbehind asser- + tions, or begin with \b or \B, characters before the one where matching + started may have been inspected while carrying out the match. For exam- + ple, consider this pattern: /(?<=abc)123/ This pattern matches "123", but only if it is preceded by "abc". If the - subject string is "xyzabc12", the offsets after a partial match are for - the substring "abc12", because all these characters are needed if - another match is tried with extra characters added to the subject. + subject string is "xyzabc12", the first two offsets after a partial + match are for the substring "abc12", because all these characters were + inspected. However, the third offset is set to 6, because that is the + offset where matching began. What happens when a partial match is identified depends on which of the two partial matching options are set. @@ -8491,6 +8940,16 @@ MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec() matched string. It is up to the calling program to do that if it needs to. + That means that, for an unanchored pattern, if a continued match fails, + it is not possible to try again at a new starting point. All this + facility is capable of doing is continuing with the previous match + attempt. In the previous example, if the second set of data is "ug23" + the result is no match, even though there would be a match for "aug23" + if the entire string were given at once. Depending on the application, + this may or may not be what you want. The only way to allow for start- + ing again at the next character is to retain the matched part of the + subject and try a new complete match. + You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with PCRE_DFA_RESTART to continue partial matching over multiple segments. This facility can be used to pass very long subject strings to the DFA @@ -8523,10 +8982,9 @@ MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec() Note: If the pattern contains lookbehind assertions, or \K, or starts with \b or \B, the string that is returned for a partial match includes - characters that precede the partially matched string itself, because - these must be retained when adding on more characters for a subsequent - matching attempt. However, in some cases you may need to retain even - earlier characters, as discussed in the next section. + characters that precede the start of what would be returned for a com- + plete match, because it contains all the characters that were inspected + during the partial match. ISSUES WITH MULTI-SEGMENT MATCHING @@ -8535,23 +8993,44 @@ ISSUES WITH MULTI-SEGMENT MATCHING whichever matching function is used. 1. If the pattern contains a test for the beginning of a line, you need - to pass the PCRE_NOTBOL option when the subject string for any call - does start at the beginning of a line. There is also a PCRE_NOTEOL + to pass the PCRE_NOTBOL option when the subject string for any call + does start at the beginning of a line. There is also a PCRE_NOTEOL option, but in practice when doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL. - 2. Lookbehind assertions that have already been obeyed are catered for + 2. Lookbehind assertions that have already been obeyed are catered for in the offsets that are returned for a partial match. However a lookbe- - hind assertion later in the pattern could require even earlier charac- - ters to be inspected. You can handle this case by using the + hind assertion later in the pattern could require even earlier charac- + ters to be inspected. You can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the pcre_fullinfo() or - pcre[16|32]_fullinfo() functions to obtain the length of the largest - lookbehind in the pattern. This length is given in characters, not - bytes. If you always retain at least that many characters before the - partially matched string, all should be well. (Of course, near the + pcre[16|32]_fullinfo() functions to obtain the length of the longest + lookbehind in the pattern. This length is given in characters, not + bytes. If you always retain at least that many characters before the + partially matched string, all should be well. (Of course, near the start of the subject, fewer characters may be present; in that case all characters should be retained.) + From release 8.33, there is a more accurate way of deciding which char- + acters to retain. Instead of subtracting the length of the longest + lookbehind from the earliest inspected character (offsets[0]), the + match start position (offsets[2]) should be used, and the next match + attempt started at the offsets[2] character by setting the startoffset + argument of pcre_exec() or pcre_dfa_exec(). + + For example, if the pattern "(?<=123)abc" is partially matched against + the string "xx123a", the three offset values returned are 2, 6, and 5. + This indicates that the matching process that gave a partial match + started at offset 5, but the characters "123a" were all inspected. The + maximum lookbehind for that pattern is 3, so taking that away from 5 + shows that we need only keep "123a", and the next match attempt can be + started at offset 3 (that is, at "a") when further characters have been + added. When the match start is not the earliest inspected character, + pcretest shows it explicitly: + + re> "(?<=123)abc" + data> xx123a\P\P + Partial match at offset 5: 123a + 3. Because a partial match must always contain at least one character, what might be considered a partial match of an empty string actually gives a "no match" result. For example: @@ -8654,18 +9133,18 @@ AUTHOR REVISION - Last updated: 24 June 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 02 July 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREPRECOMPILE(3) PCREPRECOMPILE(3) +PCREPRECOMPILE(3) Library Functions Manual PCREPRECOMPILE(3) + NAME PCRE - Perl-compatible regular expressions - SAVING AND RE-USING PRECOMPILED PCRE PATTERNS If you are running an application that uses a large number of regular @@ -8758,6 +9237,10 @@ RE-USING A PRECOMPILED PATTERN is used to pass this data, as described in the section on matching a pattern in the pcreapi documentation. + Warning: The tables that pcre_exec() and pcre_dfa_exec() use must be + the same as those that were used when the pattern was compiled. If this + is not the case, the behaviour is undefined. + If you did not provide custom character tables when the pattern was compiled, the pointer in the compiled pattern is NULL, which causes the matching functions to use PCRE's internal tables. Thus, you do not need @@ -8789,18 +9272,18 @@ AUTHOR REVISION - Last updated: 24 June 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCREPERFORM(3) PCREPERFORM(3) +PCREPERFORM(3) Library Functions Manual PCREPERFORM(3) + NAME PCRE - Perl-compatible regular expressions - PCRE PERFORMANCE Two aspects of performance are discussed below: memory usage and pro- @@ -8964,14 +9447,14 @@ REVISION ------------------------------------------------------------------------------ -PCREPOSIX(3) PCREPOSIX(3) +PCREPOSIX(3) Library Functions Manual PCREPOSIX(3) + NAME PCRE - Perl-compatible regular expressions. - -SYNOPSIS OF POSIX API +SYNOPSIS #include <pcreposix.h> @@ -8980,8 +9463,7 @@ SYNOPSIS OF POSIX API int regexec(regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); - - size_t regerror(int errcode, const regex_t *preg, + size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size); void regfree(regex_t *preg); @@ -9229,13 +9711,13 @@ REVISION ------------------------------------------------------------------------------ -PCRECPP(3) PCRECPP(3) +PCRECPP(3) Library Functions Manual PCRECPP(3) + NAME PCRE - Perl-compatible regular expressions. - SYNOPSIS OF C++ WRAPPER #include <pcrecpp.h> @@ -9572,13 +10054,13 @@ REVISION ------------------------------------------------------------------------------ -PCRESAMPLE(3) PCRESAMPLE(3) +PCRESAMPLE(3) Library Functions Manual PCRESAMPLE(3) + NAME PCRE - Perl-compatible regular expressions - PCRE SAMPLE PROGRAM A simple, complete demonstration program, to get you started with using @@ -9658,51 +10140,56 @@ REVISION Last updated: 10 January 2012 Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------ -PCRELIMITS(3) PCRELIMITS(3) +PCRELIMITS(3) Library Functions Manual PCRELIMITS(3) + NAME PCRE - Perl-compatible regular expressions - SIZE AND OTHER LIMITATIONS There are some size limitations in PCRE but it is hoped that they will never in practice be relevant. The maximum length of a compiled pattern is approximately 64K data - units (bytes for the 8-bit library, 32-bit units for the 32-bit + units (bytes for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for the 32-bit library) if PCRE is compiled - with the default internal linkage size of 2 bytes. If you want to - process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (when building the 16-bit - or 32-bit library, 3 is rounded up to 4). See the README file in the - source distribution and the pcrebuild documentation for details. In - these cases the limit is substantially larger. However, the speed of + with the default internal linkage size, which is 2 bytes for the 8-bit + and 16-bit libraries, and 4 bytes for the 32-bit library. If you want + to process regular expressions that are truly enormous, you can compile + PCRE with an internal linkage size of 3 or 4 (when building the 16-bit + or 32-bit library, 3 is rounded up to 4). See the README file in the + source distribution and the pcrebuild documentation for details. In + these cases the limit is substantially larger. However, the speed of execution is slower. All values in repeating quantifiers must be less than 65536. There is no limit to the number of parenthesized subpatterns, but there - can be no more than 65535 capturing subpatterns. + can be no more than 65535 capturing subpatterns. There is, however, a + limit to the depth of nesting of parenthesized subpatterns of all + kinds. This is imposed in order to limit the amount of system stack + used at compile time. The limit can be specified when PCRE is built; + the default is 250. There is a limit to the number of forward references to subsequent sub- - patterns of around 200,000. Repeated forward references with fixed - upper limits, for example, (?2){0,100} when subpattern number 2 is to - the right, are included in the count. There is no limit to the number + patterns of around 200,000. Repeated forward references with fixed + upper limits, for example, (?2){0,100} when subpattern number 2 is to + the right, are included in the count. There is no limit to the number of backward references. The maximum length of name for a named subpattern is 32 characters, and the maximum number of named subpatterns is 10000. - The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or - (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and - 32-bit library. + The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or + (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and + 32-bit libraries. - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, when using the traditional + The maximum length of a subject string is the largest positive number + that an integer variable can hold. However, when using the traditional matching function, PCRE uses recursion to handle subpatterns and indef- - inite repetition. This means that the available stack space may limit + inite repetition. This means that the available stack space may limit the size of a subject string that can be processed by certain patterns. For a discussion of stack issues, see the pcrestack documentation. @@ -9716,18 +10203,18 @@ AUTHOR REVISION - Last updated: 04 May 2012 - Copyright (c) 1997-2012 University of Cambridge. + Last updated: 05 November 2013 + Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------ -PCRESTACK(3) PCRESTACK(3) +PCRESTACK(3) Library Functions Manual PCRESTACK(3) + NAME PCRE - Perl-compatible regular expressions - PCRE DISCUSSION OF STACK USAGE When you call pcre[16|32]_exec(), it makes use of an internal function diff --git a/ext/pcre/pcrelib/pcre.h b/ext/pcre/pcrelib/pcre.h index a6aa4e934..c85f36b6b 100644 --- a/ext/pcre/pcrelib/pcre.h +++ b/ext/pcre/pcrelib/pcre.h @@ -5,7 +5,7 @@ /* This is the public header file for the PCRE library, to be #included by applications that call the PCRE functions. - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE_MAJOR 8 -#define PCRE_MINOR 32 +#define PCRE_MINOR 34 #define PCRE_PRERELEASE -#define PCRE_DATE 2012-11-30 +#define PCRE_DATE 2013-12-15 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate @@ -96,11 +96,14 @@ extern "C" { #endif /* Public options. Some are compile-time only, some are run-time only, and some -are both, so we keep them all distinct. However, almost all the bits in the -options word are now used. In the long run, we may have to re-use some of the -compile-time only bits for runtime options, or vice versa. Any of the -compile-time options may be inspected during studying (and therefore JIT -compiling). +are both. Most of the compile-time options are saved with the compiled regex so +that they can be inspected during studying (and therefore JIT compiling). Note +that pcre_study() has its own set of options. Originally, all the options +defined here used distinct bits. However, almost all the bits in a 32-bit word +are now used, so in order to conserve them, option bits that were previously +only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may +also be used for compile-time options that affect only compiling and are not +relevant for studying or JIT compiling. Some options for pcre_compile() change its behaviour but do not affect the behaviour of the execution functions. Other options are passed through to the @@ -142,8 +145,15 @@ with J. */ #define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ #define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ #define PCRE_PARTIAL 0x00008000 /* E D J ) */ -#define PCRE_DFA_SHORTEST 0x00010000 /* D */ -#define PCRE_DFA_RESTART 0x00020000 /* D */ + +/* This pair use the same bit. */ +#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ +#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ + +/* This pair use the same bit. */ +#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ +#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ + #define PCRE_FIRSTLINE 0x00040000 /* C3 */ #define PCRE_DUPNAMES 0x00080000 /* C1 */ #define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ @@ -199,6 +209,7 @@ with J. */ #define PCRE_ERROR_DFA_BADRESTART (-30) #define PCRE_ERROR_JIT_BADOPTION (-31) #define PCRE_ERROR_BADLENGTH (-32) +#define PCRE_ERROR_UNSET (-33) /* Specific error codes for UTF-8 validity checks */ @@ -224,7 +235,7 @@ with J. */ #define PCRE_UTF8_ERR19 19 #define PCRE_UTF8_ERR20 20 #define PCRE_UTF8_ERR21 21 -#define PCRE_UTF8_ERR22 22 +#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ /* Specific error codes for UTF-16 validity checks */ @@ -232,13 +243,13 @@ with J. */ #define PCRE_UTF16_ERR1 1 #define PCRE_UTF16_ERR2 2 #define PCRE_UTF16_ERR3 3 -#define PCRE_UTF16_ERR4 4 +#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ /* Specific error codes for UTF-32 validity checks */ #define PCRE_UTF32_ERR0 0 #define PCRE_UTF32_ERR1 1 -#define PCRE_UTF32_ERR2 2 +#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ #define PCRE_UTF32_ERR3 3 /* Request types for pcre_fullinfo() */ @@ -263,10 +274,13 @@ with J. */ #define PCRE_INFO_JIT 16 #define PCRE_INFO_JITSIZE 17 #define PCRE_INFO_MAXLOOKBEHIND 18 -#define PCRE_INFO_FIRSTCHARACTER 19 -#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 +#define PCRE_INFO_FIRSTCHARACTER 19 +#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 #define PCRE_INFO_REQUIREDCHAR 21 -#define PCRE_INFO_REQUIREDCHARFLAGS 22 +#define PCRE_INFO_REQUIREDCHARFLAGS 22 +#define PCRE_INFO_MATCHLIMIT 23 +#define PCRE_INFO_RECURSIONLIMIT 24 +#define PCRE_INFO_MATCH_EMPTY 25 /* Request types for pcre_config(). Do not re-arrange, in order to remain compatible. */ @@ -284,6 +298,7 @@ compatible. */ #define PCRE_CONFIG_UTF16 10 #define PCRE_CONFIG_JITTARGET 11 #define PCRE_CONFIG_UTF32 12 +#define PCRE_CONFIG_PARENS_LIMIT 13 /* Request types for pcre_study(). Do not re-arrange, in order to remain compatible. */ @@ -645,6 +660,9 @@ PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, pcre16_jit_callback, void *); PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, pcre32_jit_callback, void *); +PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); #ifdef __cplusplus } /* extern "C" */ diff --git a/ext/pcre/pcrelib/pcre_chartables.c b/ext/pcre/pcrelib/pcre_chartables.c index 2a39e9ff3..1e20ec29d 100644 --- a/ext/pcre/pcrelib/pcre_chartables.c +++ b/ext/pcre/pcrelib/pcre_chartables.c @@ -163,7 +163,7 @@ graph, print, punct, and cntrl. Other classes are built from combinations. */ */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ - 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ diff --git a/ext/pcre/pcrelib/pcre_compile.c b/ext/pcre/pcrelib/pcre_compile.c index 4997b3b1e..c170c47a0 100644 --- a/ext/pcre/pcrelib/pcre_compile.c +++ b/ext/pcre/pcrelib/pcre_compile.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -115,6 +115,13 @@ kicks in at the same number of forward references in all cases. */ #define COMPILE_WORK_SIZE (2048*LINK_SIZE) #define COMPILE_WORK_SIZE_MAX (100*COMPILE_WORK_SIZE) +/* This value determines the size of the initial vector that is used for +remembering named groups during the pre-compile. It is allocated on the stack, +but if it is too small, it is expanded using malloc(), in a similar way to the +workspace. The value is the number of slots in the list. */ + +#define NAMED_GROUP_LIST_SIZE 20 + /* The overrun tests check for a slightly smaller size so that they detect the overrun before it actually does run off the end of the data block. */ @@ -253,11 +260,25 @@ static const verbitem verbs[] = { static const int verbcount = sizeof(verbs)/sizeof(verbitem); +/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in +another regex library. */ + +static const pcre_uchar sub_start_of_word[] = { + CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK, + CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\0' }; + +static const pcre_uchar sub_end_of_word[] = { + CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK, + CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, + CHAR_RIGHT_PARENTHESIS, '\0' }; + + /* Tables of names of POSIX character classes and their lengths. The names are now all in a single string, to reduce the number of relocations when a shared library is dynamically loaded. The list of lengths is terminated by a zero length entry. The first three must be alpha, lower, upper, as this is assumed -for handling case independence. */ +for handling case independence. The indices for graph, print, and punct are +needed, so identify them. */ static const char posix_names[] = STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0 @@ -268,6 +289,11 @@ static const char posix_names[] = static const pcre_uint8 posix_name_lengths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; +#define PC_GRAPH 8 +#define PC_PRINT 9 +#define PC_PUNCT 10 + + /* Table of class bit maps for each POSIX class. Each class is formed from a base map, with an optional addition or removal of another map. Then, for some classes, there is some additional tweaking: for [:blank:] the vertical space @@ -295,9 +321,8 @@ static const int posix_class_maps[] = { cbit_xdigit,-1, 0 /* xdigit */ }; -/* Table of substitutes for \d etc when PCRE_UCP is set. The POSIX class -substitutes must be in the order of the names, defined above, and there are -both positive and negative cases. NULL means no substitute. */ +/* Table of substitutes for \d etc when PCRE_UCP is set. They are replaced by +Unicode property escapes. */ #ifdef SUPPORT_UCP static const pcre_uchar string_PNd[] = { @@ -322,12 +347,18 @@ static const pcre_uchar string_pXwd[] = { static const pcre_uchar *substitutes[] = { string_PNd, /* \D */ string_pNd, /* \d */ - string_PXsp, /* \S */ /* NOTE: Xsp is Perl space */ - string_pXsp, /* \s */ + string_PXsp, /* \S */ /* Xsp is Perl space, but from 8.34, Perl */ + string_pXsp, /* \s */ /* space and POSIX space are the same. */ string_PXwd, /* \W */ string_pXwd /* \w */ }; +/* The POSIX class substitutes must be in the order of the POSIX class names, +defined above, and there are both positive and negative cases. NULL means no +general substitute of a Unicode property escape (\p or \P). However, for some +POSIX classes (e.g. graph, print, punct) a special property code is compiled +directly. */ + static const pcre_uchar string_pL[] = { CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' }; @@ -375,8 +406,8 @@ static const pcre_uchar *posix_substitutes[] = { NULL, /* graph */ NULL, /* print */ NULL, /* punct */ - string_pXps, /* space */ /* NOTE: Xps is POSIX space */ - string_pXwd, /* word */ + string_pXps, /* space */ /* Xps is POSIX space, but from 8.34 */ + string_pXwd, /* word */ /* Perl and POSIX space are the same */ NULL, /* xdigit */ /* Negated cases */ string_PL, /* ^alpha */ @@ -390,8 +421,8 @@ static const pcre_uchar *posix_substitutes[] = { NULL, /* ^graph */ NULL, /* ^print */ NULL, /* ^punct */ - string_PXps, /* ^space */ /* NOTE: Xps is POSIX space */ - string_PXwd, /* ^word */ + string_PXps, /* ^space */ /* Xps is POSIX space, but from 8.34 */ + string_PXwd, /* ^word */ /* Perl and POSIX space are the same */ NULL /* ^xdigit */ }; #define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(pcre_uchar *)) @@ -455,7 +486,7 @@ static const char error_texts[] = "POSIX collating elements are not supported\0" "this version of PCRE is compiled without UTF support\0" "spare error\0" /** DEAD **/ - "character value in \\x{...} sequence is too large\0" + "character value in \\x{} or \\o{} is too large\0" /* 35 */ "invalid condition (?(0)\0" "\\C not allowed in lookbehind assertion\0" @@ -487,7 +518,7 @@ static const char error_texts[] = "a numbered reference must not be zero\0" "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\0" /* 60 */ - "(*VERB) not recognized\0" + "(*VERB) not recognized or malformed\0" "number is too big\0" "subpattern name expected\0" "digit expected after (?+\0" @@ -508,6 +539,14 @@ static const char error_texts[] = "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0" "character value in \\u.... sequence is too large\0" "invalid UTF-32 string\0" + "setting UTF is disabled by the application\0" + "non-hex character in \\x{} (closing brace missing?)\0" + /* 80 */ + "non-octal character in \\o{} (closing brace missing?)\0" + "missing opening brace after \\o\0" + "parentheses are too deeply nested\0" + "invalid range in character class\0" + "group name must start with a non-digit\0" ; /* Table to identify digits and hex digits. This is used when compiling @@ -647,6 +686,183 @@ static const pcre_uint8 ebcdic_chartab[] = { /* chartable partial dup */ #endif +/* This table is used to check whether auto-possessification is possible +between adjacent character-type opcodes. The left-hand (repeated) opcode is +used to select the row, and the right-hand opcode is use to select the column. +A value of 1 means that auto-possessification is OK. For example, the second +value in the first row means that \D+\d can be turned into \D++\d. + +The Unicode property types (\P and \p) have to be present to fill out the table +because of what their opcode values are, but the table values should always be +zero because property types are handled separately in the code. The last four +columns apply to items that cannot be repeated, so there is no need to have +rows for them. Note that OP_DIGIT etc. are generated only when PCRE_UCP is +*not* set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ + +#define APTROWS (LAST_AUTOTAB_LEFT_OP - FIRST_AUTOTAB_OP + 1) +#define APTCOLS (LAST_AUTOTAB_RIGHT_OP - FIRST_AUTOTAB_OP + 1) + +static const pcre_uint8 autoposstab[APTROWS][APTCOLS] = { +/* \D \d \S \s \W \w . .+ \C \P \p \R \H \h \V \v \X \Z \z $ $M */ + { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \D */ + { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \d */ + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \S */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \s */ + { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \W */ + { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \w */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* . */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* .+ */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \C */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* \P */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* \p */ + { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, /* \R */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, /* \H */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0 }, /* \h */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0 }, /* \V */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 }, /* \v */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } /* \X */ +}; + + +/* This table is used to check whether auto-possessification is possible +between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP). The +left-hand (repeated) opcode is used to select the row, and the right-hand +opcode is used to select the column. The values are as follows: + + 0 Always return FALSE (never auto-possessify) + 1 Character groups are distinct (possessify if both are OP_PROP) + 2 Check character categories in the same group (general or particular) + 3 TRUE if the two opcodes are not the same (PROP vs NOTPROP) + + 4 Check left general category vs right particular category + 5 Check right general category vs left particular category + + 6 Left alphanum vs right general category + 7 Left space vs right general category + 8 Left word vs right general category + + 9 Right alphanum vs left general category + 10 Right space vs left general category + 11 Right word vs left general category + + 12 Left alphanum vs right particular category + 13 Left space vs right particular category + 14 Left word vs right particular category + + 15 Right alphanum vs left particular category + 16 Right space vs left particular category + 17 Right word vs left particular category +*/ + +static const pcre_uint8 propposstab[PT_TABSIZE][PT_TABSIZE] = { +/* ANY LAMP GC PC SC ALNUM SPACE PXSPACE WORD CLIST UCNC */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* PT_ANY */ + { 0, 3, 0, 0, 0, 3, 1, 1, 0, 0, 0 }, /* PT_LAMP */ + { 0, 0, 2, 4, 0, 9, 10, 10, 11, 0, 0 }, /* PT_GC */ + { 0, 0, 5, 2, 0, 15, 16, 16, 17, 0, 0 }, /* PT_PC */ + { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, /* PT_SC */ + { 0, 3, 6, 12, 0, 3, 1, 1, 0, 0, 0 }, /* PT_ALNUM */ + { 0, 1, 7, 13, 0, 1, 3, 3, 1, 0, 0 }, /* PT_SPACE */ + { 0, 1, 7, 13, 0, 1, 3, 3, 1, 0, 0 }, /* PT_PXSPACE */ + { 0, 0, 8, 14, 0, 0, 1, 1, 3, 0, 0 }, /* PT_WORD */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* PT_CLIST */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 } /* PT_UCNC */ +}; + +/* This table is used to check whether auto-possessification is possible +between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP) when one +specifies a general category and the other specifies a particular category. The +row is selected by the general category and the column by the particular +category. The value is 1 if the particular category is not part of the general +category. */ + +static const pcre_uint8 catposstab[7][30] = { +/* Cc Cf Cn Co Cs Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So Zl Zp Zs */ + { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* C */ + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* L */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* M */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* N */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, /* P */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }, /* S */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 } /* Z */ +}; + +/* This table is used when checking ALNUM, (PX)SPACE, SPACE, and WORD against +a general or particular category. The properties in each row are those +that apply to the character set in question. Duplication means that a little +unnecessary work is done when checking, but this keeps things much simpler +because they can all use the same code. For more details see the comment where +this table is used. + +Note: SPACE and PXSPACE used to be different because Perl excluded VT from +"space", but from Perl 5.18 it's included, so both categories are treated the +same here. */ + +static const pcre_uint8 posspropstab[3][4] = { + { ucp_L, ucp_N, ucp_N, ucp_Nl }, /* ALNUM, 3rd and 4th values redundant */ + { ucp_Z, ucp_Z, ucp_C, ucp_Cc }, /* SPACE and PXSPACE, 2nd value redundant */ + { ucp_L, ucp_N, ucp_P, ucp_Po } /* WORD */ +}; + +/* This table is used when converting repeating opcodes into possessified +versions as a result of an explicit possessive quantifier such as ++. A zero +value means there is no possessified version - in those cases the item in +question must be wrapped in ONCE brackets. The table is truncated at OP_CALLOUT +because all relevant opcodes are less than that. */ + +static const pcre_uint8 opcode_possessify[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16 - 31 */ + + 0, /* NOTI */ + OP_POSSTAR, 0, /* STAR, MINSTAR */ + OP_POSPLUS, 0, /* PLUS, MINPLUS */ + OP_POSQUERY, 0, /* QUERY, MINQUERY */ + OP_POSUPTO, 0, /* UPTO, MINUPTO */ + 0, /* EXACT */ + 0, 0, 0, 0, /* POS{STAR,PLUS,QUERY,UPTO} */ + + OP_POSSTARI, 0, /* STARI, MINSTARI */ + OP_POSPLUSI, 0, /* PLUSI, MINPLUSI */ + OP_POSQUERYI, 0, /* QUERYI, MINQUERYI */ + OP_POSUPTOI, 0, /* UPTOI, MINUPTOI */ + 0, /* EXACTI */ + 0, 0, 0, 0, /* POS{STARI,PLUSI,QUERYI,UPTOI} */ + + OP_NOTPOSSTAR, 0, /* NOTSTAR, NOTMINSTAR */ + OP_NOTPOSPLUS, 0, /* NOTPLUS, NOTMINPLUS */ + OP_NOTPOSQUERY, 0, /* NOTQUERY, NOTMINQUERY */ + OP_NOTPOSUPTO, 0, /* NOTUPTO, NOTMINUPTO */ + 0, /* NOTEXACT */ + 0, 0, 0, 0, /* NOTPOS{STAR,PLUS,QUERY,UPTO} */ + + OP_NOTPOSSTARI, 0, /* NOTSTARI, NOTMINSTARI */ + OP_NOTPOSPLUSI, 0, /* NOTPLUSI, NOTMINPLUSI */ + OP_NOTPOSQUERYI, 0, /* NOTQUERYI, NOTMINQUERYI */ + OP_NOTPOSUPTOI, 0, /* NOTUPTOI, NOTMINUPTOI */ + 0, /* NOTEXACTI */ + 0, 0, 0, 0, /* NOTPOS{STARI,PLUSI,QUERYI,UPTOI} */ + + OP_TYPEPOSSTAR, 0, /* TYPESTAR, TYPEMINSTAR */ + OP_TYPEPOSPLUS, 0, /* TYPEPLUS, TYPEMINPLUS */ + OP_TYPEPOSQUERY, 0, /* TYPEQUERY, TYPEMINQUERY */ + OP_TYPEPOSUPTO, 0, /* TYPEUPTO, TYPEMINUPTO */ + 0, /* TYPEEXACT */ + 0, 0, 0, 0, /* TYPEPOS{STAR,PLUS,QUERY,UPTO} */ + + OP_CRPOSSTAR, 0, /* CRSTAR, CRMINSTAR */ + OP_CRPOSPLUS, 0, /* CRPLUS, CRMINPLUS */ + OP_CRPOSQUERY, 0, /* CRQUERY, CRMINQUERY */ + OP_CRPOSRANGE, 0, /* CRRANGE, CRMINRANGE */ + 0, 0, 0, 0, /* CRPOS{STAR,PLUS,QUERY,RANGE} */ + + 0, 0, 0, /* CLASS, NCLASS, XCLASS */ + 0, 0, /* REF, REFI */ + 0, 0, /* DNREF, DNREFI */ + 0, 0 /* RECURSE, CALLOUT */ +}; + + /************************************************* * Find an error text * @@ -674,6 +890,7 @@ return s; } + /************************************************* * Expand the workspace * *************************************************/ @@ -751,16 +968,15 @@ return (*p == CHAR_RIGHT_CURLY_BRACKET); *************************************************/ /* This function is called when a \ has been encountered. It either returns a -positive value for a simple escape such as \n, or 0 for a data character -which will be placed in chptr. A backreference to group n is returned as -negative n. When UTF-8 is enabled, a positive value greater than 255 may -be returned in chptr. -On entry,ptr is pointing at the \. On exit, it is on the final character of the -escape sequence. +positive value for a simple escape such as \n, or 0 for a data character which +will be placed in chptr. A backreference to group n is returned as negative n. +When UTF-8 is enabled, a positive value greater than 255 may be returned in +chptr. On entry, ptr is pointing at the \. On exit, it is on the final +character of the escape sequence. Arguments: ptrptr points to the pattern position pointer - chptr points to the data character + chptr points to a returned data character errorcodeptr points to the errorcode variable bracount number of previous extracting brackets options the options bits @@ -797,7 +1013,8 @@ Otherwise further processing may be required. */ #ifndef EBCDIC /* ASCII/UTF-8 coding */ /* Not alphanumeric */ else if (c < CHAR_0 || c > CHAR_z) {} -else if ((i = escapes[c - CHAR_0]) != 0) { if (i > 0) c = (pcre_uint32)i; else escape = -i; } +else if ((i = escapes[c - CHAR_0]) != 0) + { if (i > 0) c = (pcre_uint32)i; else escape = -i; } #else /* EBCDIC coding */ /* Not alphanumeric */ @@ -847,11 +1064,11 @@ else } #if defined COMPILE_PCRE8 - if (c > (utf ? 0x10ffff : 0xff)) + if (c > (utf ? 0x10ffffU : 0xffU)) #elif defined COMPILE_PCRE16 - if (c > (utf ? 0x10ffff : 0xffff)) + if (c > (utf ? 0x10ffffU : 0xffffU)) #elif defined COMPILE_PCRE32 - if (utf && c > 0x10ffff) + if (utf && c > 0x10ffffU) #endif { *errorcodeptr = ERR76; @@ -963,16 +1180,20 @@ else break; /* The handling of escape sequences consisting of a string of digits - starting with one that is not zero is not straightforward. By experiment, - the way Perl works seems to be as follows: + starting with one that is not zero is not straightforward. Perl has changed + over the years. Nowadays \g{} for backreferences and \o{} for octal are + recommended to avoid the ambiguities in the old syntax. Outside a character class, the digits are read as a decimal number. If the - number is less than 10, or if there are that many previous extracting - left brackets, then it is a back reference. Otherwise, up to three octal - digits are read to form an escaped byte. Thus \123 is likely to be octal - 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal - value is greater than 377, the least significant 8 bits are taken. Inside a - character class, \ followed by a digit is always an octal number. */ + number is less than 8 (used to be 10), or if there are that many previous + extracting left brackets, then it is a back reference. Otherwise, up to + three octal digits are read to form an escaped byte. Thus \123 is likely to + be octal 123 (cf \0123, which is octal 012 followed by the literal 3). If + the octal value is greater than 377, the least significant 8 bits are + taken. \8 and \9 are treated as the literal characters 8 and 9. + + Inside a character class, \ followed by a digit is always either a literal + 8 or 9 or an octal number. */ case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9: @@ -999,7 +1220,7 @@ else *errorcodeptr = ERR61; break; } - if (s < 10 || s <= bracount) + if (s < 8 || s <= bracount) /* Check for back reference */ { escape = -s; break; @@ -1007,16 +1228,14 @@ else ptr = oldptr; /* Put the pointer back and fall through */ } - /* Handle an octal number following \. If the first digit is 8 or 9, Perl - generates a binary zero byte and treats the digit as a following literal. - Thus we have to pull back the pointer by one. */ + /* Handle a digit following \ when the number is not a back reference. If + the first digit is 8 or 9, Perl used to generate a binary zero byte and + then treat the digit as a following literal. At least by Perl 5.18 this + changed so as not to insert the binary zero. */ - if ((c = *ptr) >= CHAR_8) - { - ptr--; - c = 0; - break; - } + if ((c = *ptr) >= CHAR_8) break; + + /* Fall through with a digit less than 8 */ /* \0 always starts an octal number, but we may drop through to here with a larger first octal digit. The original code used just to take the least @@ -1033,15 +1252,50 @@ else #endif break; - /* \x is complicated. \x{ddd} is a character number which can be greater - than 0xff in utf or non-8bit mode, but only if the ddd are hex digits. - If not, { is treated as a data character. */ + /* \o is a relatively new Perl feature, supporting a more general way of + specifying character codes in octal. The only supported form is \o{ddd}. */ + + case CHAR_o: + if (ptr[1] != CHAR_LEFT_CURLY_BRACKET) *errorcodeptr = ERR81; else + { + ptr += 2; + c = 0; + overflow = FALSE; + while (*ptr >= CHAR_0 && *ptr <= CHAR_7) + { + register pcre_uint32 cc = *ptr++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ +#ifdef COMPILE_PCRE32 + if (c >= 0x20000000l) { overflow = TRUE; break; } +#endif + c = (c << 3) + cc - CHAR_0 ; +#if defined COMPILE_PCRE8 + if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE16 + if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE32 + if (utf && c > 0x10ffffU) { overflow = TRUE; break; } +#endif + } + if (overflow) + { + while (*ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++; + *errorcodeptr = ERR34; + } + else if (*ptr == CHAR_RIGHT_CURLY_BRACKET) + { + if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } + else *errorcodeptr = ERR80; + } + break; + + /* \x is complicated. In JavaScript, \x must be followed by two hexadecimal + numbers. Otherwise it is a lowercase x letter. */ case CHAR_x: if ((options & PCRE_JAVASCRIPT_COMPAT) != 0) { - /* In JavaScript, \x must be followed by two hexadecimal numbers. - Otherwise it is a lowercase x letter. */ if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0 && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0) { @@ -1058,73 +1312,86 @@ else #endif } } - break; - } + } /* End JavaScript handling */ - if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) - { - const pcre_uchar *pt = ptr + 2; + /* Handle \x in Perl's style. \x{ddd} is a character number which can be + greater than 0xff in utf or non-8bit mode, but only if the ddd are hex + digits. If not, { used to be treated as a data character. However, Perl + seems to read hex digits up to the first non-such, and ignore the rest, so + that, for example \x{zz} matches a binary zero. This seems crazy, so PCRE + now gives an error. */ - c = 0; - overflow = FALSE; - while (MAX_255(*pt) && (digitab[*pt] & ctype_xdigit) != 0) + else + { + if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) { - register pcre_uint32 cc = *pt++; - if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ + ptr += 2; + c = 0; + overflow = FALSE; + while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) + { + register pcre_uint32 cc = *ptr++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ #ifdef COMPILE_PCRE32 - if (c >= 0x10000000l) { overflow = TRUE; break; } + if (c >= 0x10000000l) { overflow = TRUE; break; } #endif #ifndef EBCDIC /* ASCII/UTF-8 coding */ - if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ - c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); #else /* EBCDIC coding */ - if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ - c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); #endif #if defined COMPILE_PCRE8 - if (c > (utf ? 0x10ffff : 0xff)) { overflow = TRUE; break; } + if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; } #elif defined COMPILE_PCRE16 - if (c > (utf ? 0x10ffff : 0xffff)) { overflow = TRUE; break; } + if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; } #elif defined COMPILE_PCRE32 - if (utf && c > 0x10ffff) { overflow = TRUE; break; } + if (utf && c > 0x10ffffU) { overflow = TRUE; break; } #endif - } + } - if (overflow) - { - while (MAX_255(*pt) && (digitab[*pt] & ctype_xdigit) != 0) pt++; - *errorcodeptr = ERR34; - } + if (overflow) + { + while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) ptr++; + *errorcodeptr = ERR34; + } - if (*pt == CHAR_RIGHT_CURLY_BRACKET) - { - if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; - ptr = pt; - break; - } + else if (*ptr == CHAR_RIGHT_CURLY_BRACKET) + { + if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } - /* If the sequence of hex digits does not end with '}', then we don't - recognize this construct; fall through to the normal \x handling. */ - } + /* If the sequence of hex digits does not end with '}', give an error. + We used just to recognize this construct and fall through to the normal + \x handling, but nowadays Perl gives an error, which seems much more + sensible, so we do too. */ - /* Read just a single-byte hex-defined char */ + else *errorcodeptr = ERR79; + } /* End of \x{} processing */ - c = 0; - while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0) - { - pcre_uint32 cc; /* Some compilers don't like */ - cc = *(++ptr); /* ++ in initializers */ + /* Read a single-byte hex-defined char (up to two hex digits after \x) */ + + else + { + c = 0; + while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0) + { + pcre_uint32 cc; /* Some compilers don't like */ + cc = *(++ptr); /* ++ in initializers */ #ifndef EBCDIC /* ASCII/UTF-8 coding */ - if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ - c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); #else /* EBCDIC coding */ - if (cc <= CHAR_z) cc += 64; /* Convert to upper case */ - c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); + if (cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); #endif - } + } + } /* End of \xdd handling */ + } /* End of Perl-style \x handling */ break; /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped. @@ -1190,6 +1457,8 @@ if ((options & PCRE_UCP) != 0 && escape >= ESC_D && escape <= ESC_w) return escape; } + + #ifdef SUPPORT_UCP /************************************************* * Handle \P and \p * @@ -1287,7 +1556,6 @@ return FALSE; - /************************************************* * Read repeat counts * *************************************************/ @@ -1356,302 +1624,6 @@ return p; /************************************************* -* Subroutine for finding forward reference * -*************************************************/ - -/* This recursive function is called only from find_parens() below. The -top-level call starts at the beginning of the pattern. All other calls must -start at a parenthesis. It scans along a pattern's text looking for capturing -subpatterns, and counting them. If it finds a named pattern that matches the -name it is given, it returns its number. Alternatively, if the name is NULL, it -returns when it reaches a given numbered subpattern. Recursion is used to keep -track of subpatterns that reset the capturing group numbers - the (?| feature. - -This function was originally called only from the second pass, in which we know -that if (?< or (?' or (?P< is encountered, the name will be correctly -terminated because that is checked in the first pass. There is now one call to -this function in the first pass, to check for a recursive back reference by -name (so that we can make the whole group atomic). In this case, we need check -only up to the current position in the pattern, and that is still OK because -and previous occurrences will have been checked. To make this work, the test -for "end of pattern" is a check against cd->end_pattern in the main loop, -instead of looking for a binary zero. This means that the special first-pass -call can adjust cd->end_pattern temporarily. (Checks for binary zero while -processing items within the loop are OK, because afterwards the main loop will -terminate.) - -Arguments: - ptrptr address of the current character pointer (updated) - cd compile background data - name name to seek, or NULL if seeking a numbered subpattern - lorn name length, or subpattern number if name is NULL - xmode TRUE if we are in /x mode - utf TRUE if we are in UTF-8 / UTF-16 / UTF-32 mode - count pointer to the current capturing subpattern number (updated) - -Returns: the number of the named subpattern, or -1 if not found -*/ - -static int -find_parens_sub(pcre_uchar **ptrptr, compile_data *cd, const pcre_uchar *name, int lorn, - BOOL xmode, BOOL utf, int *count) -{ -pcre_uchar *ptr = *ptrptr; -int start_count = *count; -int hwm_count = start_count; -BOOL dup_parens = FALSE; - -/* If the first character is a parenthesis, check on the type of group we are -dealing with. The very first call may not start with a parenthesis. */ - -if (ptr[0] == CHAR_LEFT_PARENTHESIS) - { - /* Handle specials such as (*SKIP) or (*UTF8) etc. */ - - if (ptr[1] == CHAR_ASTERISK) ptr += 2; - - /* Handle a normal, unnamed capturing parenthesis. */ - - else if (ptr[1] != CHAR_QUESTION_MARK) - { - *count += 1; - if (name == NULL && *count == lorn) return *count; - ptr++; - } - - /* All cases now have (? at the start. Remember when we are in a group - where the parenthesis numbers are duplicated. */ - - else if (ptr[2] == CHAR_VERTICAL_LINE) - { - ptr += 3; - dup_parens = TRUE; - } - - /* Handle comments; all characters are allowed until a ket is reached. */ - - else if (ptr[2] == CHAR_NUMBER_SIGN) - { - for (ptr += 3; *ptr != CHAR_NULL; ptr++) - if (*ptr == CHAR_RIGHT_PARENTHESIS) break; - goto FAIL_EXIT; - } - - /* Handle a condition. If it is an assertion, just carry on so that it - is processed as normal. If not, skip to the closing parenthesis of the - condition (there can't be any nested parens). */ - - else if (ptr[2] == CHAR_LEFT_PARENTHESIS) - { - ptr += 2; - if (ptr[1] != CHAR_QUESTION_MARK) - { - while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; - if (*ptr != CHAR_NULL) ptr++; - } - } - - /* Start with (? but not a condition. */ - - else - { - ptr += 2; - if (*ptr == CHAR_P) ptr++; /* Allow optional P */ - - /* We have to disambiguate (?<! and (?<= from (?<name> for named groups */ - - if ((*ptr == CHAR_LESS_THAN_SIGN && ptr[1] != CHAR_EXCLAMATION_MARK && - ptr[1] != CHAR_EQUALS_SIGN) || *ptr == CHAR_APOSTROPHE) - { - pcre_uchar term; - const pcre_uchar *thisname; - *count += 1; - if (name == NULL && *count == lorn) return *count; - term = *ptr++; - if (term == CHAR_LESS_THAN_SIGN) term = CHAR_GREATER_THAN_SIGN; - thisname = ptr; - while (*ptr != term) ptr++; - if (name != NULL && lorn == (int)(ptr - thisname) && - STRNCMP_UC_UC(name, thisname, (unsigned int)lorn) == 0) - return *count; - term++; - } - } - } - -/* Past any initial parenthesis handling, scan for parentheses or vertical -bars. Stop if we get to cd->end_pattern. Note that this is important for the -first-pass call when this value is temporarily adjusted to stop at the current -position. So DO NOT change this to a test for binary zero. */ - -for (; ptr < cd->end_pattern; ptr++) - { - /* Skip over backslashed characters and also entire \Q...\E */ - - if (*ptr == CHAR_BACKSLASH) - { - if (*(++ptr) == CHAR_NULL) goto FAIL_EXIT; - if (*ptr == CHAR_Q) for (;;) - { - while (*(++ptr) != CHAR_NULL && *ptr != CHAR_BACKSLASH) {}; - if (*ptr == CHAR_NULL) goto FAIL_EXIT; - if (*(++ptr) == CHAR_E) break; - } - continue; - } - - /* Skip over character classes; this logic must be similar to the way they - are handled for real. If the first character is '^', skip it. Also, if the - first few characters (either before or after ^) are \Q\E or \E we skip them - too. This makes for compatibility with Perl. Note the use of STR macros to - encode "Q\\E" so that it works in UTF-8 on EBCDIC platforms. */ - - if (*ptr == CHAR_LEFT_SQUARE_BRACKET) - { - BOOL negate_class = FALSE; - for (;;) - { - if (ptr[1] == CHAR_BACKSLASH) - { - if (ptr[2] == CHAR_E) - ptr+= 2; - else if (STRNCMP_UC_C8(ptr + 2, - STR_Q STR_BACKSLASH STR_E, 3) == 0) - ptr += 4; - else - break; - } - else if (!negate_class && ptr[1] == CHAR_CIRCUMFLEX_ACCENT) - { - negate_class = TRUE; - ptr++; - } - else break; - } - - /* If the next character is ']', it is a data character that must be - skipped, except in JavaScript compatibility mode. */ - - if (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET && - (cd->external_options & PCRE_JAVASCRIPT_COMPAT) == 0) - ptr++; - - while (*(++ptr) != CHAR_RIGHT_SQUARE_BRACKET) - { - if (*ptr == CHAR_NULL) return -1; - if (*ptr == CHAR_BACKSLASH) - { - if (*(++ptr) == CHAR_NULL) goto FAIL_EXIT; - if (*ptr == CHAR_Q) for (;;) - { - while (*(++ptr) != CHAR_NULL && *ptr != CHAR_BACKSLASH) {}; - if (*ptr == CHAR_NULL) goto FAIL_EXIT; - if (*(++ptr) == CHAR_E) break; - } - continue; - } - } - continue; - } - - /* Skip comments in /x mode */ - - if (xmode && *ptr == CHAR_NUMBER_SIGN) - { - ptr++; - while (*ptr != CHAR_NULL) - { - if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } - ptr++; -#ifdef SUPPORT_UTF - if (utf) FORWARDCHAR(ptr); -#endif - } - if (*ptr == CHAR_NULL) goto FAIL_EXIT; - continue; - } - - /* Check for the special metacharacters */ - - if (*ptr == CHAR_LEFT_PARENTHESIS) - { - int rc = find_parens_sub(&ptr, cd, name, lorn, xmode, utf, count); - if (rc > 0) return rc; - if (*ptr == CHAR_NULL) goto FAIL_EXIT; - } - - else if (*ptr == CHAR_RIGHT_PARENTHESIS) - { - if (dup_parens && *count < hwm_count) *count = hwm_count; - goto FAIL_EXIT; - } - - else if (*ptr == CHAR_VERTICAL_LINE && dup_parens) - { - if (*count > hwm_count) hwm_count = *count; - *count = start_count; - } - } - -FAIL_EXIT: -*ptrptr = ptr; -return -1; -} - - - - -/************************************************* -* Find forward referenced subpattern * -*************************************************/ - -/* This function scans along a pattern's text looking for capturing -subpatterns, and counting them. If it finds a named pattern that matches the -name it is given, it returns its number. Alternatively, if the name is NULL, it -returns when it reaches a given numbered subpattern. This is used for forward -references to subpatterns. We used to be able to start this scan from the -current compiling point, using the current count value from cd->bracount, and -do it all in a single loop, but the addition of the possibility of duplicate -subpattern numbers means that we have to scan from the very start, in order to -take account of such duplicates, and to use a recursive function to keep track -of the different types of group. - -Arguments: - cd compile background data - name name to seek, or NULL if seeking a numbered subpattern - lorn name length, or subpattern number if name is NULL - xmode TRUE if we are in /x mode - utf TRUE if we are in UTF-8 / UTF-16 / UTF-32 mode - -Returns: the number of the found subpattern, or -1 if not found -*/ - -static int -find_parens(compile_data *cd, const pcre_uchar *name, int lorn, BOOL xmode, - BOOL utf) -{ -pcre_uchar *ptr = (pcre_uchar *)cd->start_pattern; -int count = 0; -int rc; - -/* If the pattern does not start with an opening parenthesis, the first call -to find_parens_sub() will scan right to the end (if necessary). However, if it -does start with a parenthesis, find_parens_sub() will return when it hits the -matching closing parens. That is why we have to have a loop. */ - -for (;;) - { - rc = find_parens_sub(&ptr, cd, name, lorn, xmode, utf, &count); - if (rc > 0 || *ptr++ == CHAR_NULL) break; - } - -return rc; -} - - - - -/************************************************* * Find first significant op code * *************************************************/ @@ -1690,9 +1662,9 @@ for (;;) case OP_CALLOUT: case OP_CREF: - case OP_NCREF: + case OP_DNCREF: case OP_RREF: - case OP_NRREF: + case OP_DNRREF: case OP_DEF: code += PRIV(OP_lengths)[*code]; break; @@ -1706,7 +1678,6 @@ for (;;) - /************************************************* * Find the fixed length of a branch * *************************************************/ @@ -1830,13 +1801,13 @@ for (;;) case OP_COMMIT: case OP_CREF: case OP_DEF: + case OP_DNCREF: + case OP_DNRREF: case OP_DOLL: case OP_DOLLM: case OP_EOD: case OP_EODN: case OP_FAIL: - case OP_NCREF: - case OP_NRREF: case OP_NOT_WORD_BOUNDARY: case OP_PRUNE: case OP_REVERSE: @@ -1931,16 +1902,20 @@ for (;;) switch (*cc) { - case OP_CRPLUS: - case OP_CRMINPLUS: case OP_CRSTAR: case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: return -1; case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: if (GET2(cc,1) != GET2(cc,1+IMM2_SIZE)) return -1; branchlength += (int)GET2(cc,1); cc += 1 + 2 * IMM2_SIZE; @@ -2009,6 +1984,8 @@ for (;;) case OP_QUERYI: case OP_REF: case OP_REFI: + case OP_DNREF: + case OP_DNREFI: case OP_SBRA: case OP_SBRAPOS: case OP_SCBRA: @@ -2045,7 +2022,6 @@ for (;;) - /************************************************* * Scan compiled regex for specific bracket * *************************************************/ @@ -2129,9 +2105,6 @@ for (;;) case OP_MARK: case OP_PRUNE_ARG: case OP_SKIP_ARG: - code += code[1]; - break; - case OP_THEN_ARG: code += code[1]; break; @@ -2249,9 +2222,6 @@ for (;;) case OP_MARK: case OP_PRUNE_ARG: case OP_SKIP_ARG: - code += code[1]; - break; - case OP_THEN_ARG: code += code[1]; break; @@ -2353,15 +2323,23 @@ Arguments: endcode points to where to stop utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode cd contains pointers to tables etc. + recurses chain of recurse_check to catch mutual recursion Returns: TRUE if what is matched could be empty */ +typedef struct recurse_check { + struct recurse_check *prev; + const pcre_uchar *group; +} recurse_check; + static BOOL could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode, - BOOL utf, compile_data *cd) + BOOL utf, compile_data *cd, recurse_check *recurses) { register pcre_uchar c; +recurse_check this_recurse; + for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); code < endcode; code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE)) @@ -2389,25 +2367,50 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); if (c == OP_RECURSE) { - const pcre_uchar *scode; + const pcre_uchar *scode = cd->start_code + GET(code, 1); BOOL empty_branch; - /* Test for forward reference */ + /* Test for forward reference or uncompleted reference. This is disabled + when called to scan a completed pattern by setting cd->start_workspace to + NULL. */ - for (scode = cd->start_workspace; scode < cd->hwm; scode += LINK_SIZE) - if ((int)GET(scode, 0) == (int)(code + 1 - cd->start_code)) return TRUE; + if (cd->start_workspace != NULL) + { + const pcre_uchar *tcode; + for (tcode = cd->start_workspace; tcode < cd->hwm; tcode += LINK_SIZE) + if ((int)GET(tcode, 0) == (int)(code + 1 - cd->start_code)) return TRUE; + if (GET(scode, 1) == 0) return TRUE; /* Unclosed */ + } - /* Not a forward reference, test for completed backward reference */ + /* If we are scanning a completed pattern, there are no forward references + and all groups are complete. We need to detect whether this is a recursive + call, as otherwise there will be an infinite loop. If it is a recursion, + just skip over it. Simple recursions are easily detected. For mutual + recursions we keep a chain on the stack. */ - empty_branch = FALSE; - scode = cd->start_code + GET(code, 1); - if (GET(scode, 1) == 0) return TRUE; /* Unclosed */ + else + { + recurse_check *r = recurses; + const pcre_uchar *endgroup = scode; - /* Completed backwards reference */ + do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT); + if (code >= scode && code <= endgroup) continue; /* Simple recursion */ + + for (r = recurses; r != NULL; r = r->prev) + if (r->group == scode) break; + if (r != NULL) continue; /* Mutual recursion */ + } + + /* Completed reference; scan the referenced group, remembering it on the + stack chain to detect mutual recursions. */ + + empty_branch = FALSE; + this_recurse.prev = recurses; + this_recurse.group = scode; do { - if (could_be_empty_branch(scode, endcode, utf, cd)) + if (could_be_empty_branch(scode, endcode, utf, cd, &this_recurse)) { empty_branch = TRUE; break; @@ -2463,7 +2466,7 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); empty_branch = FALSE; do { - if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd)) + if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd, NULL)) empty_branch = TRUE; code += GET(code, 1); } @@ -2505,15 +2508,19 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: break; default: /* Non-repeat => class must match */ case OP_CRPLUS: /* These repeats aren't empty */ case OP_CRMINPLUS: + case OP_CRPOSPLUS: return FALSE; case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ break; } @@ -2521,34 +2528,57 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); /* Opcodes that must match a character */ + case OP_ANY: + case OP_ALLANY: + case OP_ANYBYTE: + case OP_PROP: case OP_NOTPROP: + case OP_ANYNL: + + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: case OP_EXTUNI: + case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: - case OP_ANY: - case OP_ALLANY: - case OP_ANYBYTE: + case OP_CHAR: case OP_CHARI: case OP_NOT: case OP_NOTI: + case OP_PLUS: + case OP_PLUSI: case OP_MINPLUS: - case OP_POSPLUS: - case OP_EXACT: + case OP_MINPLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + + case OP_POSPLUS: + case OP_POSPLUSI: case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + + case OP_EXACT: + case OP_EXACTI: case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEPOSPLUS: case OP_TYPEEXACT: + return FALSE; /* These are going to continue, as they may be empty, but we have to @@ -2582,30 +2612,58 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); return TRUE; /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO, - MINUPTO, and POSUPTO may be followed by a multibyte character */ + MINUPTO, and POSUPTO and their caseless and negative versions may be + followed by a multibyte character. */ #if defined SUPPORT_UTF && !defined COMPILE_PCRE32 case OP_STAR: case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_QUERY: case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]); break; case OP_UPTO: case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]); break; #endif @@ -2616,9 +2674,6 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); case OP_MARK: case OP_PRUNE_ARG: case OP_SKIP_ARG: - code += code[1]; - break; - case OP_THEN_ARG: code += code[1]; break; @@ -2662,7 +2717,7 @@ could_be_empty(const pcre_uchar *code, const pcre_uchar *endcode, { while (bcptr != NULL && bcptr->current_branch >= code) { - if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd)) + if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd, NULL)) return FALSE; bcptr = bcptr->outer; } @@ -2672,6 +2727,1072 @@ return TRUE; /************************************************* +* Base opcode of repeated opcodes * +*************************************************/ + +/* Returns the base opcode for repeated single character type opcodes. If the +opcode is not a repeated character type, it returns with the original value. + +Arguments: c opcode +Returns: base opcode for the type +*/ + +static pcre_uchar +get_repeat_base(pcre_uchar c) +{ +return (c > OP_TYPEPOSUPTO)? c : + (c >= OP_TYPESTAR)? OP_TYPESTAR : + (c >= OP_NOTSTARI)? OP_NOTSTARI : + (c >= OP_NOTSTAR)? OP_NOTSTAR : + (c >= OP_STARI)? OP_STARI : + OP_STAR; +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Check a character and a property * +*************************************************/ + +/* This function is called by check_auto_possessive() when a property item +is adjacent to a fixed character. + +Arguments: + c the character + ptype the property type + pdata the data for the type + negated TRUE if it's a negated property (\P or \p{^) + +Returns: TRUE if auto-possessifying is OK +*/ + +static BOOL +check_char_prop(pcre_uint32 c, unsigned int ptype, unsigned int pdata, + BOOL negated) +{ +const pcre_uint32 *p; +const ucd_record *prop = GET_UCD(c); + +switch(ptype) + { + case PT_LAMP: + return (prop->chartype == ucp_Lu || + prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt) == negated; + + case PT_GC: + return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated; + + case PT_PC: + return (pdata == prop->chartype) == negated; + + case PT_SC: + return (pdata == prop->script) == negated; + + /* These are specials */ + + case PT_ALNUM: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, which + means that Perl space and POSIX space are now identical. PCRE was changed + at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + return negated; + + default: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == negated; + } + break; /* Control never reaches here */ + + case PT_WORD: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE) == negated; + + case PT_CLIST: + p = PRIV(ucd_caseless_sets) + prop->caseset; + for (;;) + { + if (c < *p) return !negated; + if (c == *p++) return negated; + } + break; /* Control never reaches here */ + } + +return FALSE; +} +#endif /* SUPPORT_UCP */ + + + +/************************************************* +* Fill the character property list * +*************************************************/ + +/* Checks whether the code points to an opcode that can take part in auto- +possessification, and if so, fills a list with its properties. + +Arguments: + code points to start of expression + utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode + fcc points to case-flipping table + list points to output list + list[0] will be filled with the opcode + list[1] will be non-zero if this opcode + can match an empty character string + list[2..7] depends on the opcode + +Returns: points to the start of the next opcode if *code is accepted + NULL if *code is not accepted +*/ + +static const pcre_uchar * +get_chr_property_list(const pcre_uchar *code, BOOL utf, + const pcre_uint8 *fcc, pcre_uint32 *list) +{ +pcre_uchar c = *code; +pcre_uchar base; +const pcre_uchar *end; +pcre_uint32 chr; + +#ifdef SUPPORT_UCP +pcre_uint32 *clist_dest; +const pcre_uint32 *clist_src; +#else +utf = utf; /* Suppress "unused parameter" compiler warning */ +#endif + +list[0] = c; +list[1] = FALSE; +code++; + +if (c >= OP_STAR && c <= OP_TYPEPOSUPTO) + { + base = get_repeat_base(c); + c -= (base - OP_STAR); + + if (c == OP_UPTO || c == OP_MINUPTO || c == OP_EXACT || c == OP_POSUPTO) + code += IMM2_SIZE; + + list[1] = (c != OP_PLUS && c != OP_MINPLUS && c != OP_EXACT && c != OP_POSPLUS); + + switch(base) + { + case OP_STAR: + list[0] = OP_CHAR; + break; + + case OP_STARI: + list[0] = OP_CHARI; + break; + + case OP_NOTSTAR: + list[0] = OP_NOT; + break; + + case OP_NOTSTARI: + list[0] = OP_NOTI; + break; + + case OP_TYPESTAR: + list[0] = *code; + code++; + break; + } + c = list[0]; + } + +switch(c) + { + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_DOLL: + case OP_DOLLM: + return code; + + case OP_CHAR: + case OP_NOT: + GETCHARINCTEST(chr, code); + list[2] = chr; + list[3] = NOTACHAR; + return code; + + case OP_CHARI: + case OP_NOTI: + list[0] = (c == OP_CHARI) ? OP_CHAR : OP_NOT; + GETCHARINCTEST(chr, code); + list[2] = chr; + +#ifdef SUPPORT_UCP + if (chr < 128 || (chr < 256 && !utf)) + list[3] = fcc[chr]; + else + list[3] = UCD_OTHERCASE(chr); +#elif defined SUPPORT_UTF || !defined COMPILE_PCRE8 + list[3] = (chr < 256) ? fcc[chr] : chr; +#else + list[3] = fcc[chr]; +#endif + + /* The othercase might be the same value. */ + + if (chr == list[3]) + list[3] = NOTACHAR; + else + list[4] = NOTACHAR; + return code; + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (code[0] != PT_CLIST) + { + list[2] = code[0]; + list[3] = code[1]; + return code + 2; + } + + /* Convert only if we have enough space. */ + + clist_src = PRIV(ucd_caseless_sets) + code[1]; + clist_dest = list + 2; + code += 2; + + do { + if (clist_dest >= list + 8) + { + /* Early return if there is not enough space. This should never + happen, since all clists are shorter than 5 character now. */ + list[2] = code[0]; + list[3] = code[1]; + return code; + } + *clist_dest++ = *clist_src; + } + while(*clist_src++ != NOTACHAR); + + /* All characters are stored. The terminating NOTACHAR + is copied form the clist itself. */ + + list[0] = (c == OP_PROP) ? OP_CHAR : OP_NOT; + return code; +#endif + + case OP_NCLASS: + case OP_CLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + if (c == OP_XCLASS) + end = code + GET(code, 0) - 1; + else +#endif + end = code + 32 / sizeof(pcre_uchar); + + switch(*end) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + list[1] = TRUE; + end++; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + end++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + list[1] = (GET2(end, 1) == 0); + end += 1 + 2 * IMM2_SIZE; + break; + } + list[2] = end - code; + return end; + } +return NULL; /* Opcode not accepted */ +} + + + +/************************************************* +* Scan further character sets for match * +*************************************************/ + +/* Checks whether the base and the current opcode have a common character, in +which case the base cannot be possessified. + +Arguments: + code points to the byte code + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + cd static compile data + base_list the data list of the base opcode + +Returns: TRUE if the auto-possessification is possible +*/ + +static BOOL +compare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd, + const pcre_uint32 *base_list, const pcre_uchar *base_end) +{ +pcre_uchar c; +pcre_uint32 list[8]; +const pcre_uint32 *chr_ptr; +const pcre_uint32 *ochr_ptr; +const pcre_uint32 *list_ptr; +const pcre_uchar *next_code; +const pcre_uint8 *class_bitset; +const pcre_uint32 *set1, *set2, *set_end; +pcre_uint32 chr; +BOOL accepted, invert_bits; + +/* Note: the base_list[1] contains whether the current opcode has greedy +(represented by a non-zero value) quantifier. This is a different from +other character type lists, which stores here that the character iterator +matches to an empty string (also represented by a non-zero value). */ + +for(;;) + { + /* All operations move the code pointer forward. + Therefore infinite recursions are not possible. */ + + c = *code; + + /* Skip over callouts */ + + if (c == OP_CALLOUT) + { + code += PRIV(OP_lengths)[c]; + continue; + } + + if (c == OP_ALT) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + } + + switch(c) + { + case OP_END: + case OP_KETRPOS: + /* TRUE only in greedy case. The non-greedy case could be replaced by + an OP_EXACT, but it is probably not worth it. (And note that OP_EXACT + uses more memory, which we cannot get at this stage.) */ + + return base_list[1] != 0; + + case OP_KET: + /* If the bracket is capturing, and referenced by an OP_RECURSE, or + it is an atomic sub-pattern (assert, once, etc.) the non-greedy case + cannot be converted to a possessive form. */ + + if (base_list[1] == 0) return FALSE; + + switch(*(code - GET(code, 1))) + { + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + /* Atomic sub-patterns and assertions can always auto-possessify their + last iterator. */ + return TRUE; + } + + code += PRIV(OP_lengths)[c]; + continue; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + next_code = code + GET(code, 1); + code += PRIV(OP_lengths)[c]; + + while (*next_code == OP_ALT) + { + if (!compare_opcodes(code, utf, cd, base_list, base_end)) return FALSE; + code = next_code + 1 + LINK_SIZE; + next_code += GET(next_code, 1); + } + continue; + + case OP_BRAZERO: + case OP_BRAMINZERO: + + next_code = code + 1; + if (*next_code != OP_BRA && *next_code != OP_CBRA + && *next_code != OP_ONCE && *next_code != OP_ONCE_NC) return FALSE; + + do next_code += GET(next_code, 1); while (*next_code == OP_ALT); + + /* The bracket content will be checked by the + OP_BRA/OP_CBRA case above. */ + next_code += 1 + LINK_SIZE; + if (!compare_opcodes(next_code, utf, cd, base_list, base_end)) + return FALSE; + + code += PRIV(OP_lengths)[c]; + continue; + } + + /* Check for a supported opcode, and load its properties. */ + + code = get_chr_property_list(code, utf, cd->fcc, list); + if (code == NULL) return FALSE; /* Unsupported */ + + /* If either opcode is a small character list, set pointers for comparing + characters from that list with another list, or with a property. */ + + if (base_list[0] == OP_CHAR) + { + chr_ptr = base_list + 2; + list_ptr = list; + } + else if (list[0] == OP_CHAR) + { + chr_ptr = list + 2; + list_ptr = base_list; + } + + /* Character bitsets can also be compared to certain opcodes. */ + + else if (base_list[0] == OP_CLASS || list[0] == OP_CLASS +#ifdef COMPILE_PCRE8 + /* In 8 bit, non-UTF mode, OP_CLASS and OP_NCLASS are the same. */ + || (!utf && (base_list[0] == OP_NCLASS || list[0] == OP_NCLASS)) +#endif + ) + { +#ifdef COMPILE_PCRE8 + if (base_list[0] == OP_CLASS || (!utf && base_list[0] == OP_NCLASS)) +#else + if (base_list[0] == OP_CLASS) +#endif + { + set1 = (pcre_uint32 *)(base_end - base_list[2]); + list_ptr = list; + } + else + { + set1 = (pcre_uint32 *)(code - list[2]); + list_ptr = base_list; + } + + invert_bits = FALSE; + switch(list_ptr[0]) + { + case OP_CLASS: + case OP_NCLASS: + set2 = (pcre_uint32 *) + ((list_ptr == list ? code : base_end) - list_ptr[2]); + break; + + /* OP_XCLASS cannot be supported here, because its bitset + is not necessarily complete. E.g: [a-\0x{200}] is stored + as a character range, and the appropriate bits are not set. */ + + case OP_NOT_DIGIT: + invert_bits = TRUE; + /* Fall through */ + case OP_DIGIT: + set2 = (pcre_uint32 *)(cd->cbits + cbit_digit); + break; + + case OP_NOT_WHITESPACE: + invert_bits = TRUE; + /* Fall through */ + case OP_WHITESPACE: + set2 = (pcre_uint32 *)(cd->cbits + cbit_space); + break; + + case OP_NOT_WORDCHAR: + invert_bits = TRUE; + /* Fall through */ + case OP_WORDCHAR: + set2 = (pcre_uint32 *)(cd->cbits + cbit_word); + break; + + default: + return FALSE; + } + + /* Compare 4 bytes to improve speed. */ + set_end = set1 + (32 / 4); + if (invert_bits) + { + do + { + if ((*set1++ & ~(*set2++)) != 0) return FALSE; + } + while (set1 < set_end); + } + else + { + do + { + if ((*set1++ & *set2++) != 0) return FALSE; + } + while (set1 < set_end); + } + + if (list[1] == 0) return TRUE; + /* Might be an empty repeat. */ + continue; + } + + /* Some property combinations also acceptable. Unicode property opcodes are + processed specially; the rest can be handled with a lookup table. */ + + else + { + pcre_uint32 leftop, rightop; + + leftop = base_list[0]; + rightop = list[0]; + +#ifdef SUPPORT_UCP + accepted = FALSE; /* Always set in non-unicode case. */ + if (leftop == OP_PROP || leftop == OP_NOTPROP) + { + if (rightop == OP_EOD) + accepted = TRUE; + else if (rightop == OP_PROP || rightop == OP_NOTPROP) + { + int n; + const pcre_uint8 *p; + BOOL same = leftop == rightop; + BOOL lisprop = leftop == OP_PROP; + BOOL risprop = rightop == OP_PROP; + BOOL bothprop = lisprop && risprop; + + /* There's a table that specifies how each combination is to be + processed: + 0 Always return FALSE (never auto-possessify) + 1 Character groups are distinct (possessify if both are OP_PROP) + 2 Check character categories in the same group (general or particular) + 3 Return TRUE if the two opcodes are not the same + ... see comments below + */ + + n = propposstab[base_list[2]][list[2]]; + switch(n) + { + case 0: break; + case 1: accepted = bothprop; break; + case 2: accepted = (base_list[3] == list[3]) != same; break; + case 3: accepted = !same; break; + + case 4: /* Left general category, right particular category */ + accepted = risprop && catposstab[base_list[3]][list[3]] == same; + break; + + case 5: /* Right general category, left particular category */ + accepted = lisprop && catposstab[list[3]][base_list[3]] == same; + break; + + /* This code is logically tricky. Think hard before fiddling with it. + The posspropstab table has four entries per row. Each row relates to + one of PCRE's special properties such as ALNUM or SPACE or WORD. + Only WORD actually needs all four entries, but using repeats for the + others means they can all use the same code below. + + The first two entries in each row are Unicode general categories, and + apply always, because all the characters they include are part of the + PCRE character set. The third and fourth entries are a general and a + particular category, respectively, that include one or more relevant + characters. One or the other is used, depending on whether the check + is for a general or a particular category. However, in both cases the + category contains more characters than the specials that are defined + for the property being tested against. Therefore, it cannot be used + in a NOTPROP case. + + Example: the row for WORD contains ucp_L, ucp_N, ucp_P, ucp_Po. + Underscore is covered by ucp_P or ucp_Po. */ + + case 6: /* Left alphanum vs right general category */ + case 7: /* Left space vs right general category */ + case 8: /* Left word vs right general category */ + p = posspropstab[n-6]; + accepted = risprop && lisprop == + (list[3] != p[0] && + list[3] != p[1] && + (list[3] != p[2] || !lisprop)); + break; + + case 9: /* Right alphanum vs left general category */ + case 10: /* Right space vs left general category */ + case 11: /* Right word vs left general category */ + p = posspropstab[n-9]; + accepted = lisprop && risprop == + (base_list[3] != p[0] && + base_list[3] != p[1] && + (base_list[3] != p[2] || !risprop)); + break; + + case 12: /* Left alphanum vs right particular category */ + case 13: /* Left space vs right particular category */ + case 14: /* Left word vs right particular category */ + p = posspropstab[n-12]; + accepted = risprop && lisprop == + (catposstab[p[0]][list[3]] && + catposstab[p[1]][list[3]] && + (list[3] != p[3] || !lisprop)); + break; + + case 15: /* Right alphanum vs left particular category */ + case 16: /* Right space vs left particular category */ + case 17: /* Right word vs left particular category */ + p = posspropstab[n-15]; + accepted = lisprop && risprop == + (catposstab[p[0]][base_list[3]] && + catposstab[p[1]][base_list[3]] && + (base_list[3] != p[3] || !risprop)); + break; + } + } + } + + else +#endif /* SUPPORT_UCP */ + + accepted = leftop >= FIRST_AUTOTAB_OP && leftop <= LAST_AUTOTAB_LEFT_OP && + rightop >= FIRST_AUTOTAB_OP && rightop <= LAST_AUTOTAB_RIGHT_OP && + autoposstab[leftop - FIRST_AUTOTAB_OP][rightop - FIRST_AUTOTAB_OP]; + + if (!accepted) + return FALSE; + + if (list[1] == 0) return TRUE; + /* Might be an empty repeat. */ + continue; + } + + /* Control reaches here only if one of the items is a small character list. + All characters are checked against the other side. */ + + do + { + chr = *chr_ptr; + + switch(list_ptr[0]) + { + case OP_CHAR: + ochr_ptr = list_ptr + 2; + do + { + if (chr == *ochr_ptr) return FALSE; + ochr_ptr++; + } + while(*ochr_ptr != NOTACHAR); + break; + + case OP_NOT: + ochr_ptr = list_ptr + 2; + do + { + if (chr == *ochr_ptr) + break; + ochr_ptr++; + } + while(*ochr_ptr != NOTACHAR); + if (*ochr_ptr == NOTACHAR) return FALSE; /* Not found */ + break; + + /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* + set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ + + case OP_DIGIT: + if (chr < 256 && (cd->ctypes[chr] & ctype_digit) != 0) return FALSE; + break; + + case OP_NOT_DIGIT: + if (chr > 255 || (cd->ctypes[chr] & ctype_digit) == 0) return FALSE; + break; + + case OP_WHITESPACE: + if (chr < 256 && (cd->ctypes[chr] & ctype_space) != 0) return FALSE; + break; + + case OP_NOT_WHITESPACE: + if (chr > 255 || (cd->ctypes[chr] & ctype_space) == 0) return FALSE; + break; + + case OP_WORDCHAR: + if (chr < 255 && (cd->ctypes[chr] & ctype_word) != 0) return FALSE; + break; + + case OP_NOT_WORDCHAR: + if (chr > 255 || (cd->ctypes[chr] & ctype_word) == 0) return FALSE; + break; + + case OP_HSPACE: + switch(chr) + { + HSPACE_CASES: return FALSE; + default: break; + } + break; + + case OP_NOT_HSPACE: + switch(chr) + { + HSPACE_CASES: break; + default: return FALSE; + } + break; + + case OP_ANYNL: + case OP_VSPACE: + switch(chr) + { + VSPACE_CASES: return FALSE; + default: break; + } + break; + + case OP_NOT_VSPACE: + switch(chr) + { + VSPACE_CASES: break; + default: return FALSE; + } + break; + + case OP_DOLL: + case OP_EODN: + switch (chr) + { + case CHAR_CR: + case CHAR_LF: + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + return FALSE; + } + break; + + case OP_EOD: /* Can always possessify before \z */ + break; + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (!check_char_prop(chr, list_ptr[2], list_ptr[3], + list_ptr[0] == OP_NOTPROP)) + return FALSE; + break; +#endif + + case OP_NCLASS: + if (chr > 255) return FALSE; + /* Fall through */ + + case OP_CLASS: + if (chr > 255) break; + class_bitset = (pcre_uint8 *) + ((list_ptr == list ? code : base_end) - list_ptr[2]); + if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE; + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + if (PRIV(xclass)(chr, (list_ptr == list ? code : base_end) - + list_ptr[2] + LINK_SIZE, utf)) return FALSE; + break; +#endif + + default: + return FALSE; + } + + chr_ptr++; + } + while(*chr_ptr != NOTACHAR); + + /* At least one character must be matched from this opcode. */ + + if (list[1] == 0) return TRUE; + } + +return FALSE; +} + + + +/************************************************* +* Scan compiled regex for auto-possession * +*************************************************/ + +/* Replaces single character iterations with their possessive alternatives +if appropriate. This function modifies the compiled opcode! + +Arguments: + code points to start of the byte code + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + cd static compile data + +Returns: nothing +*/ + +static void +auto_possessify(pcre_uchar *code, BOOL utf, const compile_data *cd) +{ +register pcre_uchar c; +const pcre_uchar *end; +pcre_uchar *repeat_opcode; +pcre_uint32 list[8]; + +for (;;) + { + c = *code; + + if (c >= OP_STAR && c <= OP_TYPEPOSUPTO) + { + c -= get_repeat_base(c) - OP_STAR; + end = (c <= OP_MINUPTO) ? + get_chr_property_list(code, utf, cd->fcc, list) : NULL; + list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO; + + if (end != NULL && compare_opcodes(end, utf, cd, list, end)) + { + switch(c) + { + case OP_STAR: + *code += OP_POSSTAR - OP_STAR; + break; + + case OP_MINSTAR: + *code += OP_POSSTAR - OP_MINSTAR; + break; + + case OP_PLUS: + *code += OP_POSPLUS - OP_PLUS; + break; + + case OP_MINPLUS: + *code += OP_POSPLUS - OP_MINPLUS; + break; + + case OP_QUERY: + *code += OP_POSQUERY - OP_QUERY; + break; + + case OP_MINQUERY: + *code += OP_POSQUERY - OP_MINQUERY; + break; + + case OP_UPTO: + *code += OP_POSUPTO - OP_UPTO; + break; + + case OP_MINUPTO: + *code += OP_MINUPTO - OP_UPTO; + break; + } + } + c = *code; + } + else if (c == OP_CLASS || c == OP_NCLASS || c == OP_XCLASS) + { +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (c == OP_XCLASS) + repeat_opcode = code + GET(code, 1); + else +#endif + repeat_opcode = code + 1 + (32 / sizeof(pcre_uchar)); + + c = *repeat_opcode; + if (c >= OP_CRSTAR && c <= OP_CRMINRANGE) + { + /* end must not be NULL. */ + end = get_chr_property_list(code, utf, cd->fcc, list); + + list[1] = (c & 1) == 0; + + if (compare_opcodes(end, utf, cd, list, end)) + { + switch (c) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + *repeat_opcode = OP_CRPOSSTAR; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + *repeat_opcode = OP_CRPOSPLUS; + break; + + case OP_CRQUERY: + case OP_CRMINQUERY: + *repeat_opcode = OP_CRPOSQUERY; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + *repeat_opcode = OP_CRPOSRANGE; + break; + } + } + } + c = *code; + } + + switch(c) + { + case OP_END: + return; + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSUPTO: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + code += 2; + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + code += GET(code, 1); + break; +#endif + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(OP_lengths)[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed by + a multi-byte character. The length in the table is a minimum, so we have to + arrange to skip the extra bytes. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* Keep compiler happy by referencing function argument */ +#endif + } +} + + + +/************************************************* * Check for POSIX class syntax * *************************************************/ @@ -2692,7 +3813,7 @@ class, but [abc[:x\]pqr:]] is (so that an error can be generated). The code below handles the special case of \], but does not try to do any other escape processing. This makes it different from Perl for cases such as [:l\ower:] where Perl recognizes it as the POSIX class "lower" but PCRE does not recognize -"l\ower". This is a lesser evil that not diagnosing bad classes when Perl does, +"l\ower". This is a lesser evil than not diagnosing bad classes when Perl does, I think. A user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not. @@ -2954,476 +4075,11 @@ for (++c; c <= d; c++) *cptr = c; /* Rest of input range */ return 0; } - - - -/************************************************* -* Check a character and a property * -*************************************************/ - -/* This function is called by check_auto_possessive() when a property item -is adjacent to a fixed character. - -Arguments: - c the character - ptype the property type - pdata the data for the type - negated TRUE if it's a negated property (\P or \p{^) - -Returns: TRUE if auto-possessifying is OK -*/ - -static BOOL -check_char_prop(pcre_uint32 c, unsigned int ptype, unsigned int pdata, BOOL negated) -{ -#ifdef SUPPORT_UCP -const pcre_uint32 *p; -#endif - -const ucd_record *prop = GET_UCD(c); - -switch(ptype) - { - case PT_LAMP: - return (prop->chartype == ucp_Lu || - prop->chartype == ucp_Ll || - prop->chartype == ucp_Lt) == negated; - - case PT_GC: - return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated; - - case PT_PC: - return (pdata == prop->chartype) == negated; - - case PT_SC: - return (pdata == prop->script) == negated; - - /* These are specials */ - - case PT_ALNUM: - return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || - PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated; - - case PT_SPACE: /* Perl space */ - return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) - == negated; - - case PT_PXSPACE: /* POSIX space */ - return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || - c == CHAR_FF || c == CHAR_CR) - == negated; - - case PT_WORD: - return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || - PRIV(ucp_gentype)[prop->chartype] == ucp_N || - c == CHAR_UNDERSCORE) == negated; - -#ifdef SUPPORT_UCP - case PT_CLIST: - p = PRIV(ucd_caseless_sets) + prop->caseset; - for (;;) - { - if (c < *p) return !negated; - if (c == *p++) return negated; - } - break; /* Control never reaches here */ -#endif - } - -return FALSE; -} #endif /* SUPPORT_UCP */ /************************************************* -* Check if auto-possessifying is possible * -*************************************************/ - -/* This function is called for unlimited repeats of certain items, to see -whether the next thing could possibly match the repeated item. If not, it makes -sense to automatically possessify the repeated item. - -Arguments: - previous pointer to the repeated opcode - utf TRUE in UTF-8 / UTF-16 / UTF-32 mode - ptr next character in pattern - options options bits - cd contains pointers to tables etc. - -Returns: TRUE if possessifying is wanted -*/ - -static BOOL -check_auto_possessive(const pcre_uchar *previous, BOOL utf, - const pcre_uchar *ptr, int options, compile_data *cd) -{ -pcre_uint32 c = NOTACHAR; -pcre_uint32 next; -int escape; -pcre_uchar op_code = *previous++; - -/* Skip whitespace and comments in extended mode */ - -if ((options & PCRE_EXTENDED) != 0) - { - for (;;) - { - while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_space) != 0) ptr++; - if (*ptr == CHAR_NUMBER_SIGN) - { - ptr++; - while (*ptr != CHAR_NULL) - { - if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } - ptr++; -#ifdef SUPPORT_UTF - if (utf) FORWARDCHAR(ptr); -#endif - } - } - else break; - } - } - -/* If the next item is one that we can handle, get its value. A non-negative -value is a character, a negative value is an escape value. */ - -if (*ptr == CHAR_BACKSLASH) - { - int temperrorcode = 0; - escape = check_escape(&ptr, &next, &temperrorcode, cd->bracount, options, FALSE); - if (temperrorcode != 0) return FALSE; - ptr++; /* Point after the escape sequence */ - } -else if (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_meta) == 0) - { - escape = 0; -#ifdef SUPPORT_UTF - if (utf) { GETCHARINC(next, ptr); } else -#endif - next = *ptr++; - } -else return FALSE; - -/* Skip whitespace and comments in extended mode */ - -if ((options & PCRE_EXTENDED) != 0) - { - for (;;) - { - while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_space) != 0) ptr++; - if (*ptr == CHAR_NUMBER_SIGN) - { - ptr++; - while (*ptr != CHAR_NULL) - { - if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } - ptr++; -#ifdef SUPPORT_UTF - if (utf) FORWARDCHAR(ptr); -#endif - } - } - else break; - } - } - -/* If the next thing is itself optional, we have to give up. */ - -if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || - STRNCMP_UC_C8(ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) - return FALSE; - -/* If the previous item is a character, get its value. */ - -if (op_code == OP_CHAR || op_code == OP_CHARI || - op_code == OP_NOT || op_code == OP_NOTI) - { -#ifdef SUPPORT_UTF - GETCHARTEST(c, previous); -#else - c = *previous; -#endif - } - -/* Now compare the next item with the previous opcode. First, handle cases when -the next item is a character. */ - -if (escape == 0) - { - /* For a caseless UTF match, the next character may have more than one other - case, which maps to the special PT_CLIST property. Check this first. */ - -#ifdef SUPPORT_UCP - if (utf && c != NOTACHAR && (options & PCRE_CASELESS) != 0) - { - unsigned int ocs = UCD_CASESET(next); - if (ocs > 0) return check_char_prop(c, PT_CLIST, ocs, op_code >= OP_NOT); - } -#endif - - switch(op_code) - { - case OP_CHAR: - return c != next; - - /* For CHARI (caseless character) we must check the other case. If we have - Unicode property support, we can use it to test the other case of - high-valued characters. We know that next can have only one other case, - because multi-other-case characters are dealt with above. */ - - case OP_CHARI: - if (c == next) return FALSE; -#ifdef SUPPORT_UTF - if (utf) - { - pcre_uint32 othercase; - if (next < 128) othercase = cd->fcc[next]; else -#ifdef SUPPORT_UCP - othercase = UCD_OTHERCASE(next); -#else - othercase = NOTACHAR; -#endif - return c != othercase; - } - else -#endif /* SUPPORT_UTF */ - return (c != TABLE_GET(next, cd->fcc, next)); /* Not UTF */ - - case OP_NOT: - return c == next; - - case OP_NOTI: - if (c == next) return TRUE; -#ifdef SUPPORT_UTF - if (utf) - { - pcre_uint32 othercase; - if (next < 128) othercase = cd->fcc[next]; else -#ifdef SUPPORT_UCP - othercase = UCD_OTHERCASE(next); -#else - othercase = NOTACHAR; -#endif - return c == othercase; - } - else -#endif /* SUPPORT_UTF */ - return (c == TABLE_GET(next, cd->fcc, next)); /* Not UTF */ - - /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* set. - When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ - - case OP_DIGIT: - return next > 255 || (cd->ctypes[next] & ctype_digit) == 0; - - case OP_NOT_DIGIT: - return next <= 255 && (cd->ctypes[next] & ctype_digit) != 0; - - case OP_WHITESPACE: - return next > 255 || (cd->ctypes[next] & ctype_space) == 0; - - case OP_NOT_WHITESPACE: - return next <= 255 && (cd->ctypes[next] & ctype_space) != 0; - - case OP_WORDCHAR: - return next > 255 || (cd->ctypes[next] & ctype_word) == 0; - - case OP_NOT_WORDCHAR: - return next <= 255 && (cd->ctypes[next] & ctype_word) != 0; - - case OP_HSPACE: - case OP_NOT_HSPACE: - switch(next) - { - HSPACE_CASES: - return op_code == OP_NOT_HSPACE; - - default: - return op_code != OP_NOT_HSPACE; - } - - case OP_ANYNL: - case OP_VSPACE: - case OP_NOT_VSPACE: - switch(next) - { - VSPACE_CASES: - return op_code == OP_NOT_VSPACE; - - default: - return op_code != OP_NOT_VSPACE; - } - -#ifdef SUPPORT_UCP - case OP_PROP: - return check_char_prop(next, previous[0], previous[1], FALSE); - - case OP_NOTPROP: - return check_char_prop(next, previous[0], previous[1], TRUE); -#endif - - default: - return FALSE; - } - } - -/* Handle the case when the next item is \d, \s, etc. Note that when PCRE_UCP -is set, \d turns into ESC_du rather than ESC_d, etc., so ESC_d etc. are -generated only when PCRE_UCP is *not* set, that is, when only ASCII -characteristics are recognized. Similarly, the opcodes OP_DIGIT etc. are -replaced by OP_PROP codes when PCRE_UCP is set. */ - -switch(op_code) - { - case OP_CHAR: - case OP_CHARI: - switch(escape) - { - case ESC_d: - return c > 255 || (cd->ctypes[c] & ctype_digit) == 0; - - case ESC_D: - return c <= 255 && (cd->ctypes[c] & ctype_digit) != 0; - - case ESC_s: - return c > 255 || (cd->ctypes[c] & ctype_space) == 0; - - case ESC_S: - return c <= 255 && (cd->ctypes[c] & ctype_space) != 0; - - case ESC_w: - return c > 255 || (cd->ctypes[c] & ctype_word) == 0; - - case ESC_W: - return c <= 255 && (cd->ctypes[c] & ctype_word) != 0; - - case ESC_h: - case ESC_H: - switch(c) - { - HSPACE_CASES: - return escape != ESC_h; - - default: - return escape == ESC_h; - } - - case ESC_v: - case ESC_V: - switch(c) - { - VSPACE_CASES: - return escape != ESC_v; - - default: - return escape == ESC_v; - } - - /* When PCRE_UCP is set, these values get generated for \d etc. Find - their substitutions and process them. The result will always be either - ESC_p or ESC_P. Then fall through to process those values. */ - -#ifdef SUPPORT_UCP - case ESC_du: - case ESC_DU: - case ESC_wu: - case ESC_WU: - case ESC_su: - case ESC_SU: - { - int temperrorcode = 0; - ptr = substitutes[escape - ESC_DU]; - escape = check_escape(&ptr, &next, &temperrorcode, 0, options, FALSE); - if (temperrorcode != 0) return FALSE; - ptr++; /* For compatibility */ - } - /* Fall through */ - - case ESC_p: - case ESC_P: - { - unsigned int ptype = 0, pdata = 0; - int errorcodeptr; - BOOL negated; - - ptr--; /* Make ptr point at the p or P */ - if (!get_ucp(&ptr, &negated, &ptype, &pdata, &errorcodeptr)) - return FALSE; - ptr++; /* Point past the final curly ket */ - - /* If the property item is optional, we have to give up. (When generated - from \d etc by PCRE_UCP, this test will have been applied much earlier, - to the original \d etc. At this point, ptr will point to a zero byte. */ - - if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || - STRNCMP_UC_C8(ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) - return FALSE; - - /* Do the property check. */ - - return check_char_prop(c, ptype, pdata, (escape == ESC_P) != negated); - } -#endif - - default: - return FALSE; - } - - /* In principle, support for Unicode properties should be integrated here as - well. It means re-organizing the above code so as to get hold of the property - values before switching on the op-code. However, I wonder how many patterns - combine ASCII \d etc with Unicode properties? (Note that if PCRE_UCP is set, - these op-codes are never generated.) */ - - case OP_DIGIT: - return escape == ESC_D || escape == ESC_s || escape == ESC_W || - escape == ESC_h || escape == ESC_v || escape == ESC_R; - - case OP_NOT_DIGIT: - return escape == ESC_d; - - case OP_WHITESPACE: - return escape == ESC_S || escape == ESC_d || escape == ESC_w; - - case OP_NOT_WHITESPACE: - return escape == ESC_s || escape == ESC_h || escape == ESC_v || escape == ESC_R; - - case OP_HSPACE: - return escape == ESC_S || escape == ESC_H || escape == ESC_d || - escape == ESC_w || escape == ESC_v || escape == ESC_R; - - case OP_NOT_HSPACE: - return escape == ESC_h; - - /* Can't have \S in here because VT matches \S (Perl anomaly) */ - case OP_ANYNL: - case OP_VSPACE: - return escape == ESC_V || escape == ESC_d || escape == ESC_w; - - case OP_NOT_VSPACE: - return escape == ESC_v || escape == ESC_R; - - case OP_WORDCHAR: - return escape == ESC_W || escape == ESC_s || escape == ESC_h || - escape == ESC_v || escape == ESC_R; - - case OP_NOT_WORDCHAR: - return escape == ESC_w || escape == ESC_d; - - default: - return FALSE; - } - -/* Control does not reach here */ -} - - - -/************************************************* * Add a character or range to a class * *************************************************/ @@ -3672,22 +4328,22 @@ to find out the amount of memory needed, as well as during the real compile phase. The value of lengthptr distinguishes the two phases. Arguments: - optionsptr pointer to the option bits - codeptr points to the pointer to the current code point - ptrptr points to the current pattern pointer - errorcodeptr points to error code variable - firstcharptr place to put the first required character + optionsptr pointer to the option bits + codeptr points to the pointer to the current code point + ptrptr points to the current pattern pointer + errorcodeptr points to error code variable + firstcharptr place to put the first required character firstcharflagsptr place to put the first character flags, or a negative number - reqcharptr place to put the last required character - reqcharflagsptr place to put the last required character flags, or a negative number - bcptr points to current branch chain - cond_depth conditional nesting depth - cd contains pointers to tables etc. - lengthptr NULL during the real compile phase - points to length accumulator during pre-compile phase - -Returns: TRUE on success - FALSE, with *errorcodeptr set non-zero on error + reqcharptr place to put the last required character + reqcharflagsptr place to put the last required character flags, or a negative number + bcptr points to current branch chain + cond_depth conditional nesting depth + cd contains pointers to tables etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success + FALSE, with *errorcodeptr set non-zero on error */ static BOOL @@ -3910,58 +4566,67 @@ for (;; ptr++) } goto NORMAL_CHAR; } + /* Control does not reach here. */ } - /* Fill in length of a previous callout, except when the next thing is - a quantifier. */ - - is_quantifier = - c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK || - (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1)); - - if (!is_quantifier && previous_callout != NULL && - after_manual_callout-- <= 0) - { - if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ - complete_callout(previous_callout, ptr, cd); - previous_callout = NULL; - } - - /* In extended mode, skip white space and comments. */ + /* In extended mode, skip white space and comments. We need a loop in order + to check for more white space and more comments after a comment. */ if ((options & PCRE_EXTENDED) != 0) { - if (MAX_255(*ptr) && (cd->ctypes[c] & ctype_space) != 0) continue; - if (c == CHAR_NUMBER_SIGN) + for (;;) { + while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr); + if (c != CHAR_NUMBER_SIGN) break; ptr++; while (*ptr != CHAR_NULL) { - if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } + if (IS_NEWLINE(ptr)) /* For non-fixed-length newline cases, */ + { /* IS_NEWLINE sets cd->nllen. */ + ptr += cd->nllen; + break; + } ptr++; #ifdef SUPPORT_UTF if (utf) FORWARDCHAR(ptr); #endif } - if (*ptr != CHAR_NULL) continue; - - /* Else fall through to handle end of string */ - c = 0; + c = *ptr; /* Either NULL or the char after a newline */ } } - /* No auto callout for quantifiers. */ + /* See if the next thing is a quantifier. */ - if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier) + is_quantifier = + c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK || + (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1)); + + /* Fill in length of a previous callout, except when the next thing is a + quantifier or when processing a property substitution string in UCP mode. */ + + if (!is_quantifier && previous_callout != NULL && nestptr == NULL && + after_manual_callout-- <= 0) + { + if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ + complete_callout(previous_callout, ptr, cd); + previous_callout = NULL; + } + + /* Create auto callout, except for quantifiers, or while processing property + strings that are substituted for \w etc in UCP mode. */ + + if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier && nestptr == NULL) { previous_callout = code; code = auto_callout(code, ptr, cd); } + /* Process the next pattern item. */ + switch(c) { /* ===================================================================*/ - case 0: /* The branch terminates at string end */ + case CHAR_NULL: /* The branch terminates at string end */ case CHAR_VERTICAL_LINE: /* or | or ) */ case CHAR_RIGHT_PARENTHESIS: *firstcharptr = firstchar; @@ -4039,7 +4704,29 @@ for (;; ptr++) } goto NORMAL_CHAR; + /* In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is + used for "start of word" and "end of word". As these are otherwise illegal + sequences, we don't break anything by recognizing them. They are replaced + by \b(?=\w) and \b(?<=\w) respectively. Sequences like [a[:<:]] are + erroneous and are handled by the normal code below. */ + case CHAR_LEFT_SQUARE_BRACKET: + if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0) + { + nestptr = ptr + 7; + ptr = sub_start_of_word - 1; + continue; + } + + if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0) + { + nestptr = ptr + 7; + ptr = sub_end_of_word - 1; + continue; + } + + /* Handle a real character class. */ + previous = code; /* PCRE supports POSIX class stuff inside a class. Perl gives an error if @@ -4204,24 +4891,58 @@ for (;; ptr++) posix_class = 0; /* When PCRE_UCP is set, some of the POSIX classes are converted to - different escape sequences that use Unicode properties. */ + different escape sequences that use Unicode properties \p or \P. Others + that are not available via \p or \P generate XCL_PROP/XCL_NOTPROP + directly. */ #ifdef SUPPORT_UCP if ((options & PCRE_UCP) != 0) { + unsigned int ptype = 0; int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0); + + /* The posix_substitutes table specifies which POSIX classes can be + converted to \p or \P items. */ + if (posix_substitutes[pc] != NULL) { nestptr = tempptr + 1; ptr = posix_substitutes[pc] - 1; continue; } + + /* There are three other classes that generate special property calls + that are recognized only in an XCLASS. */ + + else switch(posix_class) + { + case PC_GRAPH: + ptype = PT_PXGRAPH; + /* Fall through */ + case PC_PRINT: + if (ptype == 0) ptype = PT_PXPRINT; + /* Fall through */ + case PC_PUNCT: + if (ptype == 0) ptype = PT_PXPUNCT; + *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP; + *class_uchardata++ = ptype; + *class_uchardata++ = 0; + ptr = tempptr + 1; + continue; + + /* For all other POSIX classes, no special action is taken in UCP + mode. Fall through to the non_UCP case. */ + + default: + break; + } } #endif - /* In the non-UCP case, we build the bit map for the POSIX class in a - chunk of local store because we may be adding and subtracting from it, - and we don't want to subtract bits that may be in the main map already. - At the end we or the result into the bit map that is being built. */ + /* In the non-UCP case, or when UCP makes no difference, we build the + bit map for the POSIX class in a chunk of local store because we may be + adding and subtracting from it, and we don't want to subtract bits that + may be in the main map already. At the end we or the result into the + bit map that is being built. */ posix_class *= 3; @@ -4277,14 +4998,12 @@ for (;; ptr++) if (c == CHAR_BACKSLASH) { - escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, TRUE); - + escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, + TRUE); if (*errorcodeptr != 0) goto FAILED; - - if (escape == 0) - c = ec; + if (escape == 0) c = ec; else if (escape == ESC_b) c = CHAR_BS; /* \b is backspace in a class */ - else if (escape == ESC_N) /* \N is not supported in a class */ + else if (escape == ESC_N) /* \N is not supported in a class */ { *errorcodeptr = ERR71; goto FAILED; @@ -4340,21 +5059,20 @@ for (;; ptr++) for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word]; continue; - /* Perl 5.004 onwards omits VT from \s, but we must preserve it - if it was previously set by something earlier in the character - class. Luckily, the value of CHAR_VT is 0x0b in both ASCII and - EBCDIC, so we lazily just adjust the appropriate bit. */ + /* Perl 5.004 onwards omitted VT from \s, but restored it at Perl + 5.18. Before PCRE 8.34, we had to preserve the VT bit if it was + previously set by something earlier in the character class. + Luckily, the value of CHAR_VT is 0x0b in both ASCII and EBCDIC, so + we could just adjust the appropriate bit. From PCRE 8.34 we no + longer treat \s and \S specially. */ case ESC_s: - classbits[0] |= cbits[cbit_space]; - classbits[1] |= cbits[cbit_space+1] & ~0x08; - for (c = 2; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; continue; case ESC_S: should_flip_negation = TRUE; for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space]; - classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */ continue; /* The rest apply in both UCP and non-UCP cases. */ @@ -4476,26 +5194,43 @@ for (;; ptr++) #endif d = *ptr; /* Not UTF-8 mode */ - /* The second part of a range can be a single-character escape, but - not any of the other escapes. Perl 5.6 treats a hyphen as a literal - in such circumstances. */ + /* The second part of a range can be a single-character escape + sequence, but not any of the other escapes. Perl treats a hyphen as a + literal in such circumstances. However, in Perl's warning mode, a + warning is given, so PCRE now faults it as it is almost certainly a + mistake on the user's part. */ - if (!inescq && d == CHAR_BACKSLASH) + if (!inescq) { - int descape; - descape = check_escape(&ptr, &d, errorcodeptr, cd->bracount, options, TRUE); - if (*errorcodeptr != 0) goto FAILED; + if (d == CHAR_BACKSLASH) + { + int descape; + descape = check_escape(&ptr, &d, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; - /* \b is backspace; any other special means the '-' was literal. */ + /* 0 means a character was put into d; \b is backspace; any other + special causes an error. */ - if (descape != 0) - { - if (descape == ESC_b) d = CHAR_BS; else + if (descape != 0) { - ptr = oldptr; - goto CLASS_SINGLE_CHARACTER; /* A few lines below */ + if (descape == ESC_b) d = CHAR_BS; else + { + *errorcodeptr = ERR83; + goto FAILED; + } } } + + /* A hyphen followed by a POSIX class is treated in the same way. */ + + else if (d == CHAR_LEFT_SQUARE_BRACKET && + (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && + check_posix_syntax(ptr, &tempptr)) + { + *errorcodeptr = ERR83; + goto FAILED; + } } /* Check that the two values are in the correct order. Optimize @@ -4759,6 +5494,34 @@ for (;; ptr++) tempcode = previous; + /* Before checking for a possessive quantifier, we must skip over + whitespace and comments in extended mode because Perl allows white space at + this point. */ + + if ((options & PCRE_EXTENDED) != 0) + { + const pcre_uchar *p = ptr + 1; + for (;;) + { + while (MAX_255(*p) && (cd->ctypes[*p] & ctype_space) != 0) p++; + if (*p != CHAR_NUMBER_SIGN) break; + p++; + while (*p != CHAR_NULL) + { + if (IS_NEWLINE(p)) /* For non-fixed-length newline cases, */ + { /* IS_NEWLINE sets cd->nllen. */ + p += cd->nllen; + break; + } + p++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(p); +#endif + } /* Loop for comment characters */ + } /* Loop for multiple comments */ + ptr = p - 1; /* Character before the next significant one. */ + } + /* If the next character is '+', we have a possessive quantifier. This implies greediness, whatever the setting of the PCRE_UNGREEDY option. If the next character is '?' this is a minimizing repeat, by default, @@ -4853,19 +5616,6 @@ for (;; ptr++) } } - /* If the repetition is unlimited, it pays to see if the next thing on - the line is something that cannot possibly match this character. If so, - automatically possessifying this item gains some performance in the case - where the match fails. */ - - if (!possessive_quantifier && - repeat_max < 0 && - check_auto_possessive(previous, utf, ptr + 1, options, cd)) - { - repeat_type = 0; /* Force greedy */ - possessive_quantifier = TRUE; - } - goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ } @@ -4883,14 +5633,6 @@ for (;; ptr++) op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ c = *previous; - if (!possessive_quantifier && - repeat_max < 0 && - check_auto_possessive(previous, utf, ptr + 1, options, cd)) - { - repeat_type = 0; /* Force greedy */ - possessive_quantifier = TRUE; - } - OUTPUT_SINGLE_REPEAT: if (*previous == OP_PROP || *previous == OP_NOTPROP) { @@ -4907,16 +5649,6 @@ for (;; ptr++) if (repeat_max == 0) goto END_REPEAT; - /*--------------------------------------------------------------------*/ - /* This code is obsolete from release 8.00; the restriction was finally - removed: */ - - /* All real repeats make it impossible to handle partial matching (maybe - one day we will be able to remove this restriction). */ - - /* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ - /*--------------------------------------------------------------------*/ - /* Combine the op_type with the repeat_type */ repeat_type += op_type; @@ -5049,13 +5781,12 @@ for (;; ptr++) /* If previous was a character class or a back reference, we put the repeat stuff after it, but just skip the item if the repeat was {0,0}. */ - else if (*previous == OP_CLASS || - *previous == OP_NCLASS || + else if (*previous == OP_CLASS || *previous == OP_NCLASS || #if defined SUPPORT_UTF || !defined COMPILE_PCRE8 *previous == OP_XCLASS || #endif - *previous == OP_REF || - *previous == OP_REFI) + *previous == OP_REF || *previous == OP_REFI || + *previous == OP_DNREF || *previous == OP_DNREFI) { if (repeat_max == 0) { @@ -5063,16 +5794,6 @@ for (;; ptr++) goto END_REPEAT; } - /*--------------------------------------------------------------------*/ - /* This code is obsolete from release 8.00; the restriction was finally - removed: */ - - /* All real repeats make it impossible to handle partial matching (maybe - one day we will be able to remove this restriction). */ - - /* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ - /*--------------------------------------------------------------------*/ - if (repeat_min == 0 && repeat_max == -1) *code++ = OP_CRSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) @@ -5093,8 +5814,9 @@ for (;; ptr++) opcodes such as BRA and CBRA, as this is the place where they get converted into the more special varieties such as BRAPOS and SBRA. A test for >= OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK, - ASSERTBACK_NOT, ONCE, BRA, CBRA, and COND. Originally, PCRE did not allow - repetition of assertions, but now it does, for Perl compatibility. */ + ASSERTBACK_NOT, ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND. + Originally, PCRE did not allow repetition of assertions, but now it does, + for Perl compatibility. */ else if (*previous >= OP_ASSERT && *previous <= OP_COND) { @@ -5112,7 +5834,7 @@ for (;; ptr++) /* There is no sense in actually repeating assertions. The only potential use of repetition is in cases when the assertion is optional. Therefore, if the minimum is greater than zero, just ignore the repeat. If the - maximum is not not zero or one, set it to 1. */ + maximum is not zero or one, set it to 1. */ if (*previous < OP_ONCE) /* Assertion */ { @@ -5415,7 +6137,7 @@ for (;; ptr++) pcre_uchar *scode = bracode; do { - if (could_be_empty_branch(scode, ketcode, utf, cd)) + if (could_be_empty_branch(scode, ketcode, utf, cd, NULL)) { *bracode += OP_SBRA - OP_BRA; break; @@ -5485,43 +6207,105 @@ for (;; ptr++) goto FAILED; } - /* If the character following a repeat is '+', or if certain optimization - tests above succeeded, possessive_quantifier is TRUE. For some opcodes, - there are special alternative opcodes for this case. For anything else, we - wrap the entire repeated item inside OP_ONCE brackets. Logically, the '+' - notation is just syntactic sugar, taken from Sun's Java package, but the - special opcodes can optimize it. + /* If the character following a repeat is '+', possessive_quantifier is + TRUE. For some opcodes, there are special alternative opcodes for this + case. For anything else, we wrap the entire repeated item inside OP_ONCE + brackets. Logically, the '+' notation is just syntactic sugar, taken from + Sun's Java package, but the special opcodes can optimize it. Some (but not all) possessively repeated subpatterns have already been completely handled in the code just above. For them, possessive_quantifier - is always FALSE at this stage. - - Note that the repeated item starts at tempcode, not at previous, which - might be the first part of a string whose (former) last char we repeated. - - Possessifying an 'exact' quantifier has no effect, so we can ignore it. But - an 'upto' may follow. We skip over an 'exact' item, and then test the - length of what remains before proceeding. */ + is always FALSE at this stage. Note that the repeated item starts at + tempcode, not at previous, which might be the first part of a string whose + (former) last char we repeated. */ if (possessive_quantifier) { int len; - if (*tempcode == OP_TYPEEXACT) + /* Possessifying an EXACT quantifier has no effect, so we can ignore it. + However, QUERY, STAR, or UPTO may follow (for quantifiers such as {5,6}, + {5,}, or {5,10}). We skip over an EXACT item; if the length of what + remains is greater than zero, there's a further opcode that can be + handled. If not, do nothing, leaving the EXACT alone. */ + + switch(*tempcode) + { + case OP_TYPEEXACT: tempcode += PRIV(OP_lengths)[*tempcode] + ((tempcode[1 + IMM2_SIZE] == OP_PROP || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0); + break; - else if (*tempcode == OP_EXACT || *tempcode == OP_NOTEXACT) - { + /* CHAR opcodes are used for exacts whose count is 1. */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: tempcode += PRIV(OP_lengths)[*tempcode]; #ifdef SUPPORT_UTF if (utf && HAS_EXTRALEN(tempcode[-1])) tempcode += GET_EXTRALEN(tempcode[-1]); #endif + break; + + /* For the class opcodes, the repeat operator appears at the end; + adjust tempcode to point to it. */ + + case OP_CLASS: + case OP_NCLASS: + tempcode += 1 + 32/sizeof(pcre_uchar); + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + tempcode += GET(tempcode, 1); + break; +#endif } + /* If tempcode is equal to code (which points to the end of the repeated + item), it means we have skipped an EXACT item but there is no following + QUERY, STAR, or UPTO; the value of len will be 0, and we do nothing. In + all other cases, tempcode will be pointing to the repeat opcode, and will + be less than code, so the value of len will be greater than 0. */ + len = (int)(code - tempcode); + if (len > 0) + { + unsigned int repcode = *tempcode; + + /* There is a table for possessifying opcodes, all of which are less + than OP_CALLOUT. A zero entry means there is no possessified version. + */ + + if (repcode < OP_CALLOUT && opcode_possessify[repcode] > 0) + *tempcode = opcode_possessify[repcode]; + + /* For opcode without a special possessified version, wrap the item in + ONCE brackets. Because we are moving code along, we must ensure that any + pending recursive references are updated. */ + + else + { + *code = OP_END; + adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm); + memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len)); + code += 1 + LINK_SIZE; + len += 1 + LINK_SIZE; + tempcode[0] = OP_ONCE; + *code++ = OP_KET; + PUTINC(code, 0, len); + PUT(tempcode, 1, len); + } + } + +#ifdef NEVER if (len > 0) switch (*tempcode) { case OP_STAR: *tempcode = OP_POSSTAR; break; @@ -5549,6 +6333,11 @@ for (;; ptr++) case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break; case OP_TYPEUPTO: *tempcode = OP_TYPEPOSUPTO; break; + case OP_CRSTAR: *tempcode = OP_CRPOSSTAR; break; + case OP_CRPLUS: *tempcode = OP_CRPOSPLUS; break; + case OP_CRQUERY: *tempcode = OP_CRPOSQUERY; break; + case OP_CRRANGE: *tempcode = OP_CRPOSRANGE; break; + /* Because we are moving code along, we must ensure that any pending recursive references are updated. */ @@ -5564,6 +6353,7 @@ for (;; ptr++) PUT(tempcode, 1, len); break; } +#endif } /* In all case we no longer have a previous item. We also set the @@ -5749,30 +6539,44 @@ for (;; ptr++) /* ------------------------------------------------------------ */ case CHAR_LEFT_PARENTHESIS: bravalue = OP_COND; /* Conditional group */ + tempptr = ptr; /* A condition can be an assertion, a number (referring to a numbered - group), a name (referring to a named group), or 'R', referring to - recursion. R<digits> and R&name are also permitted for recursion tests. + group's having been set), a name (referring to a named group), or 'R', + referring to recursion. R<digits> and R&name are also permitted for + recursion tests. + + There are ways of testing a named group: (?(name)) is used by Python; + Perl 5.10 onwards uses (?(<name>) or (?('name')). - There are several syntaxes for testing a named group: (?(name)) is used - by Python; Perl 5.10 onwards uses (?(<name>) or (?('name')). + There is one unfortunate ambiguity, caused by history. 'R' can be the + recursive thing or the name 'R' (and similarly for 'R' followed by + digits). We look for a name first; if not found, we try the other case. - There are two unfortunate ambiguities, caused by history. (a) 'R' can - be the recursive thing or the name 'R' (and similarly for 'R' followed - by digits), and (b) a number could be a name that consists of digits. - In both cases, we look for a name first; if not found, we try the other - cases. */ + For compatibility with auto-callouts, we allow a callout to be + specified before a condition that is an assertion. First, check for the + syntax of a callout; if found, adjust the temporary pointer that is + used to check for an assertion condition. That's all that is needed! */ + + if (ptr[1] == CHAR_QUESTION_MARK && ptr[2] == CHAR_C) + { + for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break; + if (ptr[i] == CHAR_RIGHT_PARENTHESIS) + tempptr += i + 1; + } /* For conditions that are assertions, check the syntax, and then exit the switch. This will take control down to where bracketed groups, including assertions, are processed. */ - if (ptr[1] == CHAR_QUESTION_MARK && (ptr[2] == CHAR_EQUALS_SIGN || - ptr[2] == CHAR_EXCLAMATION_MARK || ptr[2] == CHAR_LESS_THAN_SIGN)) + if (tempptr[1] == CHAR_QUESTION_MARK && + (tempptr[2] == CHAR_EQUALS_SIGN || + tempptr[2] == CHAR_EXCLAMATION_MARK || + tempptr[2] == CHAR_LESS_THAN_SIGN)) break; - /* Most other conditions use OP_CREF (a couple change to OP_RREF - below), and all need to skip 1+IMM2_SIZE bytes at the start of the group. */ + /* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all + need to skip at least 1+IMM2_SIZE bytes at the start of the group. */ code[1+LINK_SIZE] = OP_CREF; skipbytes = 1+IMM2_SIZE; @@ -5780,7 +6584,8 @@ for (;; ptr++) /* Check for a test for recursion in a named group. */ - if (ptr[1] == CHAR_R && ptr[2] == CHAR_AMPERSAND) + ptr++; + if (*ptr == CHAR_R && ptr[1] == CHAR_AMPERSAND) { terminator = -1; ptr += 2; @@ -5788,14 +6593,15 @@ for (;; ptr++) } /* Check for a test for a named group's having been set, using the Perl - syntax (?(<name>) or (?('name') */ + syntax (?(<name>) or (?('name'), and also allow for the original PCRE + syntax of (?(name) or for (?(+n), (?(-n), and just (?(n). */ - else if (ptr[1] == CHAR_LESS_THAN_SIGN) + else if (*ptr == CHAR_LESS_THAN_SIGN) { terminator = CHAR_GREATER_THAN_SIGN; ptr++; } - else if (ptr[1] == CHAR_APOSTROPHE) + else if (*ptr == CHAR_APOSTROPHE) { terminator = CHAR_APOSTROPHE; ptr++; @@ -5803,35 +6609,55 @@ for (;; ptr++) else { terminator = CHAR_NULL; - if (ptr[1] == CHAR_MINUS || ptr[1] == CHAR_PLUS) refsign = *(++ptr); + if (*ptr == CHAR_MINUS || *ptr == CHAR_PLUS) refsign = *ptr++; + else if (IS_DIGIT(*ptr)) refsign = 0; } - /* We now expect to read a name; any thing else is an error */ + /* Handle a number */ - if (!MAX_255(ptr[1]) || (cd->ctypes[ptr[1]] & ctype_word) == 0) + if (refsign >= 0) { - ptr += 1; /* To get the right offset */ - *errorcodeptr = ERR28; - goto FAILED; + recno = 0; + while (IS_DIGIT(*ptr)) + { + recno = recno * 10 + (int)(*ptr - CHAR_0); + ptr++; + } } - /* Read the name, but also get it as a number if it's all digits */ + /* Otherwise we expect to read a name; anything else is an error. When + a name is one of a number of duplicates, a different opcode is used and + it needs more memory. Unfortunately we cannot tell whether a name is a + duplicate in the first pass, so we have to allow for more memory. */ - recno = 0; - name = ++ptr; - while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) + else { - if (recno >= 0) - recno = (IS_DIGIT(*ptr))? recno * 10 + (int)(*ptr - CHAR_0) : -1; - ptr++; + if (IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR84; + goto FAILED; + } + if (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_word) == 0) + { + *errorcodeptr = ERR28; /* Assertion expected */ + goto FAILED; + } + name = ptr++; + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) + { + ptr++; + } + namelen = (int)(ptr - name); + if (lengthptr != NULL) *lengthptr += IMM2_SIZE; } - namelen = (int)(ptr - name); + + /* Check the terminator */ if ((terminator > 0 && *ptr++ != (pcre_uchar)terminator) || *ptr++ != CHAR_RIGHT_PARENTHESIS) { - ptr--; /* Error offset */ - *errorcodeptr = ERR26; + ptr--; /* Error offset */ + *errorcodeptr = ERR26; /* Malformed number or name */ goto FAILED; } @@ -5840,18 +6666,18 @@ for (;; ptr++) if (lengthptr != NULL) break; /* In the real compile we do the work of looking for the actual - reference. If the string started with "+" or "-" we require the rest to - be digits, in which case recno will be set. */ + reference. If refsign is not negative, it means we have a number in + recno. */ - if (refsign > 0) + if (refsign >= 0) { if (recno <= 0) { - *errorcodeptr = ERR58; + *errorcodeptr = ERR35; goto FAILED; } - recno = (refsign == CHAR_MINUS)? - cd->bracount - recno + 1 : recno +cd->bracount; + if (refsign != 0) recno = (refsign == CHAR_MINUS)? + cd->bracount - recno + 1 : recno + cd->bracount; if (recno <= 0 || recno > cd->final_bracount) { *errorcodeptr = ERR15; @@ -5861,11 +6687,7 @@ for (;; ptr++) break; } - /* Otherwise (did not start with "+" or "-"), start by looking for the - name. If we find a name, add one to the opcode to change OP_CREF or - OP_RREF into OP_NCREF or OP_NRREF. These behave exactly the same, - except they record that the reference was originally to a name. The - information is used to check duplicate names. */ + /* Otherwise look for the name. */ slot = cd->name_table; for (i = 0; i < cd->names_found; i++) @@ -5874,29 +6696,40 @@ for (;; ptr++) slot += cd->name_entry_size; } - /* Found a previous named subpattern */ + /* Found the named subpattern. If the name is duplicated, add one to + the opcode to change CREF/RREF into DNCREF/DNRREF and insert + appropriate data values. Otherwise, just insert the unique subpattern + number. */ if (i < cd->names_found) { - recno = GET2(slot, 0); - PUT2(code, 2+LINK_SIZE, recno); - code[1+LINK_SIZE]++; - } - - /* Search the pattern for a forward reference */ - - else if ((i = find_parens(cd, name, namelen, - (options & PCRE_EXTENDED) != 0, utf)) > 0) - { - PUT2(code, 2+LINK_SIZE, i); - code[1+LINK_SIZE]++; + int offset = i++; + int count = 1; + recno = GET2(slot, 0); /* Number from first found */ + for (; i < cd->names_found; i++) + { + slot += cd->name_entry_size; + if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) != 0) break; + count++; + } + if (count > 1) + { + PUT2(code, 2+LINK_SIZE, offset); + PUT2(code, 2+LINK_SIZE+IMM2_SIZE, count); + skipbytes += IMM2_SIZE; + code[1+LINK_SIZE]++; + } + else /* Not a duplicated name */ + { + PUT2(code, 2+LINK_SIZE, recno); + } } /* If terminator == CHAR_NULL it means that the name followed directly after the opening parenthesis [e.g. (?(abc)...] and in this case there are some further alternatives to try. For the cases where terminator != - 0 [things like (?(<name>... or (?('name')... or (?(R&name)... ] we have - now checked all the possibilities, so give an error. */ + CHAR_NULL [things like (?(<name>... or (?('name')... or (?(R&name)... ] + we have now checked all the possibilities, so give an error. */ else if (terminator != CHAR_NULL) { @@ -5933,19 +6766,11 @@ for (;; ptr++) skipbytes = 1; } - /* Check for the "name" actually being a subpattern number. We are - in the second pass here, so final_bracount is set. */ - - else if (recno > 0 && recno <= cd->final_bracount) - { - PUT2(code, 2+LINK_SIZE, recno); - } - - /* Either an unidentified subpattern, or a reference to (?(0) */ + /* Reference to an unidentified subpattern. */ else { - *errorcodeptr = (recno == 0)? ERR35: ERR15; + *errorcodeptr = ERR15; goto FAILED; } break; @@ -5958,11 +6783,18 @@ for (;; ptr++) ptr++; break; + /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird + thing to do, but Perl allows all assertions to be quantified, and when + they contain capturing parentheses there may be a potential use for + this feature. Not that that applies to a quantified (?!) but we allow + it for uniformity. */ /* ------------------------------------------------------------ */ case CHAR_EXCLAMATION_MARK: /* Negative lookahead */ ptr++; - if (*ptr == CHAR_RIGHT_PARENTHESIS) /* Optimize (?!) */ + if (*ptr == CHAR_RIGHT_PARENTHESIS && ptr[1] != CHAR_ASTERISK && + ptr[1] != CHAR_PLUS && ptr[1] != CHAR_QUESTION_MARK && + (ptr[1] != CHAR_LEFT_CURLY_BRACKET || !is_counted_repeat(ptr+2))) { *code++ = OP_FAIL; previous = NULL; @@ -6055,124 +6887,110 @@ for (;; ptr++) /* ------------------------------------------------------------ */ DEFINE_NAME: /* Come here from (?< handling */ case CHAR_APOSTROPHE: + terminator = (*ptr == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; + name = ++ptr; + if (IS_DIGIT(*ptr)) { - terminator = (*ptr == CHAR_LESS_THAN_SIGN)? - CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; - name = ++ptr; + *errorcodeptr = ERR84; /* Group name must start with non-digit */ + goto FAILED; + } + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = (int)(ptr - name); - while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; - namelen = (int)(ptr - name); + /* In the pre-compile phase, do a syntax check, remember the longest + name, and then remember the group in a vector, expanding it if + necessary. Duplicates for the same number are skipped; other duplicates + are checked for validity. In the actual compile, there is nothing to + do. */ + + if (lengthptr != NULL) + { + named_group *ng; + pcre_uint32 number = cd->bracount + 1; - /* In the pre-compile phase, just do a syntax check. */ + if (*ptr != (pcre_uchar)terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } - if (lengthptr != NULL) + if (cd->names_found >= MAX_NAME_COUNT) { - if (*ptr != (pcre_uchar)terminator) - { - *errorcodeptr = ERR42; - goto FAILED; - } - if (cd->names_found >= MAX_NAME_COUNT) + *errorcodeptr = ERR49; + goto FAILED; + } + + if (namelen + IMM2_SIZE + 1 > cd->name_entry_size) + { + cd->name_entry_size = namelen + IMM2_SIZE + 1; + if (namelen > MAX_NAME_SIZE) { - *errorcodeptr = ERR49; + *errorcodeptr = ERR48; goto FAILED; } - if (namelen + IMM2_SIZE + 1 > cd->name_entry_size) + } + + /* Scan the list to check for duplicates. For duplicate names, if the + number is the same, break the loop, which causes the name to be + discarded; otherwise, if DUPNAMES is not set, give an error. + If it is set, allow the name with a different number, but continue + scanning in case this is a duplicate with the same number. For + non-duplicate names, give an error if the number is duplicated. */ + + ng = cd->named_groups; + for (i = 0; i < cd->names_found; i++, ng++) + { + if (namelen == ng->length && + STRNCMP_UC_UC(name, ng->name, namelen) == 0) { - cd->name_entry_size = namelen + IMM2_SIZE + 1; - if (namelen > MAX_NAME_SIZE) + if (ng->number == number) break; + if ((options & PCRE_DUPNAMES) == 0) { - *errorcodeptr = ERR48; + *errorcodeptr = ERR43; goto FAILED; } + cd->dupnames = TRUE; /* Duplicate names exist */ + } + else if (ng->number == number) + { + *errorcodeptr = ERR65; + goto FAILED; } } - /* In the real compile, create the entry in the table, maintaining - alphabetical order. Duplicate names for different numbers are - permitted only if PCRE_DUPNAMES is set. Duplicate names for the same - number are always OK. (An existing number can be re-used if (?| - appears in the pattern.) In either event, a duplicate name results in - a duplicate entry in the table, even if the number is the same. This - is because the number of names, and hence the table size, is computed - in the pre-compile, and it affects various numbers and pointers which - would all have to be modified, and the compiled code moved down, if - duplicates with the same number were omitted from the table. This - doesn't seem worth the hassle. However, *different* names for the - same number are not permitted. */ - - else + if (i >= cd->names_found) /* Not a duplicate with same number */ { - BOOL dupname = FALSE; - slot = cd->name_table; + /* Increase the list size if necessary */ - for (i = 0; i < cd->names_found; i++) + if (cd->names_found >= cd->named_group_list_size) { - int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(namelen)); - if (crc == 0) - { - if (slot[IMM2_SIZE+namelen] == 0) - { - if (GET2(slot, 0) != cd->bracount + 1 && - (options & PCRE_DUPNAMES) == 0) - { - *errorcodeptr = ERR43; - goto FAILED; - } - else dupname = TRUE; - } - else crc = -1; /* Current name is a substring */ - } - - /* Make space in the table and break the loop for an earlier - name. For a duplicate or later name, carry on. We do this for - duplicates so that in the simple case (when ?(| is not used) they - are in order of their numbers. */ + int newsize = cd->named_group_list_size * 2; + named_group *newspace = (PUBL(malloc)) + (newsize * sizeof(named_group)); - if (crc < 0) + if (newspace == NULL) { - memmove(slot + cd->name_entry_size, slot, - IN_UCHARS((cd->names_found - i) * cd->name_entry_size)); - break; + *errorcodeptr = ERR21; + goto FAILED; } - /* Continue the loop for a later or duplicate name */ - - slot += cd->name_entry_size; - } - - /* For non-duplicate names, check for a duplicate number before - adding the new name. */ - - if (!dupname) - { - pcre_uchar *cslot = cd->name_table; - for (i = 0; i < cd->names_found; i++) - { - if (cslot != slot) - { - if (GET2(cslot, 0) == cd->bracount + 1) - { - *errorcodeptr = ERR65; - goto FAILED; - } - } - else i--; - cslot += cd->name_entry_size; - } + memcpy(newspace, cd->named_groups, + cd->named_group_list_size * sizeof(named_group)); + if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) + (PUBL(free))((void *)cd->named_groups); + cd->named_groups = newspace; + cd->named_group_list_size = newsize; } - PUT2(slot, 0, cd->bracount + 1); - memcpy(slot + IMM2_SIZE, name, IN_UCHARS(namelen)); - slot[IMM2_SIZE + namelen] = 0; + cd->named_groups[cd->names_found].name = name; + cd->named_groups[cd->names_found].length = namelen; + cd->named_groups[cd->names_found].number = number; + cd->names_found++; } } - /* In both pre-compile and compile, count the number of names we've - encountered. */ - - cd->names_found++; - ptr++; /* Move past > or ' */ + ptr++; /* Move past > or ' in both passes. */ goto NUMBERED_GROUP; @@ -6190,6 +7008,11 @@ for (;; ptr++) NAMED_REF_OR_RECURSE: name = ++ptr; + if (IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR84; /* Group name must start with non-digit */ + goto FAILED; + } while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; namelen = (int)(ptr - name); @@ -6202,7 +7025,7 @@ for (;; ptr++) if (lengthptr != NULL) { - const pcre_uchar *temp; + named_group *ng; if (namelen == 0) { @@ -6220,27 +7043,29 @@ for (;; ptr++) goto FAILED; } - /* The name table does not exist in the first pass, so we cannot - do a simple search as in the code below. Instead, we have to scan the - pattern to find the number. It is important that we scan it only as - far as we have got because the syntax of named subpatterns has not - been checked for the rest of the pattern, and find_parens() assumes - correct syntax. In any case, it's a waste of resources to scan - further. We stop the scan at the current point by temporarily - adjusting the value of cd->endpattern. */ - - temp = cd->end_pattern; - cd->end_pattern = ptr; - recno = find_parens(cd, name, namelen, - (options & PCRE_EXTENDED) != 0, utf); - cd->end_pattern = temp; - if (recno < 0) recno = 0; /* Forward ref; set dummy number */ + /* The name table does not exist in the first pass; instead we must + scan the list of names encountered so far in order to get the + number. If the name is not found, set the value to 0 for a forward + reference. */ + + ng = cd->named_groups; + for (i = 0; i < cd->names_found; i++, ng++) + { + if (namelen == ng->length && + STRNCMP_UC_UC(name, ng->name, namelen) == 0) + break; + } + recno = (i < cd->names_found)? ng->number : 0; + + /* Count named back references. */ + + if (!is_recurse) cd->namedrefcount++; } - /* In the real compile, seek the name in the table. We check the name + /* In the real compile, search the name table. We check the name first, and then check that we have reached the end of the name in the - table. That way, if the name that is longer than any in the table, - the comparison will fail without reading beyond the table entry. */ + table. That way, if the name is longer than any in the table, the + comparison will fail without reading beyond the table entry. */ else { @@ -6253,24 +7078,76 @@ for (;; ptr++) slot += cd->name_entry_size; } - if (i < cd->names_found) /* Back reference */ + if (i < cd->names_found) { recno = GET2(slot, 0); } - else if ((recno = /* Forward back reference */ - find_parens(cd, name, namelen, - (options & PCRE_EXTENDED) != 0, utf)) <= 0) + else { *errorcodeptr = ERR15; goto FAILED; } } - /* In both phases, we can now go to the code than handles numerical - recursion or backreferences. */ + /* In both phases, for recursions, we can now go to the code than + handles numerical recursion. */ if (is_recurse) goto HANDLE_RECURSION; - else goto HANDLE_REFERENCE; + + /* In the second pass we must see if the name is duplicated. If so, we + generate a different opcode. */ + + if (lengthptr == NULL && cd->dupnames) + { + int count = 1; + unsigned int index = i; + pcre_uchar *cslot = slot + cd->name_entry_size; + + for (i++; i < cd->names_found; i++) + { + if (STRCMP_UC_UC(slot + IMM2_SIZE, cslot + IMM2_SIZE) != 0) break; + count++; + cslot += cd->name_entry_size; + } + + if (count > 1) + { + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + previous = code; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_DNREFI : OP_DNREF; + PUT2INC(code, 0, index); + PUT2INC(code, 0, count); + + /* Process each potentially referenced group. */ + + for (; slot < cslot; slot += cd->name_entry_size) + { + open_capitem *oc; + recno = GET2(slot, 0); + cd->backref_map |= (recno < 32)? (1 << recno) : 1; + if (recno > cd->top_backref) cd->top_backref = recno; + + /* Check to see if this back reference is recursive, that it, it + is inside the group that it references. A flag is set so that the + group can be made atomic. */ + + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (oc->number == recno) + { + oc->flag = TRUE; + break; + } + } + } + + continue; /* End of back ref handling */ + } + } + + /* First pass, or a non-duplicated name. */ + + goto HANDLE_REFERENCE; /* ------------------------------------------------------------ */ @@ -6369,8 +7246,7 @@ for (;; ptr++) if (called == NULL) { - if (find_parens(cd, NULL, recno, - (options & PCRE_EXTENDED) != 0, utf) < 0) + if (recno > cd->final_bracount) { *errorcodeptr = ERR15; goto FAILED; @@ -6529,10 +7405,19 @@ for (;; ptr++) skipbytes = IMM2_SIZE; } - /* Process nested bracketed regex. Assertions used not to be repeatable, - but this was changed for Perl compatibility, so all kinds can now be - repeated. We copy code into a non-register variable (tempcode) in order to - be able to pass its address because some compilers complain otherwise. */ + /* Process nested bracketed regex. First check for parentheses nested too + deeply. */ + + if ((cd->parens_depth += 1) > PARENS_NEST_LIMIT) + { + *errorcodeptr = ERR82; + goto FAILED; + } + + /* Assertions used not to be repeatable, but this was changed for Perl + compatibility, so all kinds can now be repeated. We copy code into a + non-register variable (tempcode) in order to be able to pass its address + because some compilers complain otherwise. */ previous = code; /* For handling repetition */ *code = bravalue; @@ -6563,6 +7448,8 @@ for (;; ptr++) )) goto FAILED; + cd->parens_depth -= 1; + /* If this was an atomic group and there are no capturing groups within it, generate OP_ONCE_NC instead of OP_ONCE. */ @@ -6738,10 +7625,9 @@ for (;; ptr++) case CHAR_BACKSLASH: tempptr = ptr; escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, FALSE); - if (*errorcodeptr != 0) goto FAILED; - if (escape == 0) + if (escape == 0) /* The escape coded a single character */ c = ec; else { @@ -6778,44 +7664,31 @@ for (;; ptr++) if (escape == ESC_g) { const pcre_uchar *p; + pcre_uint32 cf; + save_hwm = cd->hwm; /* Normally this is set when '(' is read */ terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)? CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; /* These two statements stop the compiler for warning about possibly unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In - fact, because we actually check for a number below, the paths that + fact, because we do the check for a number below, the paths that would actually be in error are never taken. */ skipbytes = 0; reset_bracount = FALSE; - /* Test for a name */ + /* If it's not a signed or unsigned number, treat it as a name. */ - if (ptr[1] != CHAR_PLUS && ptr[1] != CHAR_MINUS) + cf = ptr[1]; + if (cf != CHAR_PLUS && cf != CHAR_MINUS && !IS_DIGIT(cf)) { - BOOL is_a_number = TRUE; - for (p = ptr + 1; *p != CHAR_NULL && *p != (pcre_uchar)terminator; p++) - { - if (!MAX_255(*p)) { is_a_number = FALSE; break; } - if ((cd->ctypes[*p] & ctype_digit) == 0) is_a_number = FALSE; - if ((cd->ctypes[*p] & ctype_word) == 0) break; - } - if (*p != (pcre_uchar)terminator) - { - *errorcodeptr = ERR57; - break; - } - if (is_a_number) - { - ptr++; - goto HANDLE_NUMERICAL_RECURSION; - } is_recurse = TRUE; goto NAMED_REF_OR_RECURSE; } - /* Test a signed number in angle brackets or quotes. */ + /* Signed or unsigned number (cf = ptr[1]) is known to be plus or minus + or a digit. */ p = ptr + 2; while (IS_DIGIT(*p)) p++; @@ -6855,7 +7728,10 @@ for (;; ptr++) open_capitem *oc; recno = -escape; - HANDLE_REFERENCE: /* Come here from named backref handling */ + /* Come here from named backref handling when the reference is to a + single group (i.e. not to a duplicated name. */ + + HANDLE_REFERENCE: if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; previous = code; *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF; @@ -6907,11 +7783,12 @@ for (;; ptr++) can obtain the OP value by negating the escape value in the default situation when PCRE_UCP is not set. When it *is* set, we substitute Unicode property tests. Note that \b and \B do a one-character - lookbehind. */ + lookbehind, and \A also behaves as if it does. */ else { - if ((escape == ESC_b || escape == ESC_B) && cd->max_lookbehind == 0) + if ((escape == ESC_b || escape == ESC_B || escape == ESC_A) && + cd->max_lookbehind == 0) cd->max_lookbehind = 1; #ifdef SUPPORT_UCP if (escape >= ESC_DU && escape <= ESC_wu) @@ -6951,8 +7828,8 @@ for (;; ptr++) /* ===================================================================*/ /* Handle a literal character. It is guaranteed not to be whitespace or # - when the extended flag is set. If we are in UTF-8 mode, it may be a - multi-byte literal character. */ + when the extended flag is set. If we are in a UTF mode, it may be a + multi-unit literal character. */ default: NORMAL_CHAR: @@ -6983,7 +7860,8 @@ for (;; ptr++) *code++ = OP_PROP; *code++ = PT_CLIST; *code++ = c; - if (firstcharflags == REQ_UNSET) firstcharflags = zerofirstcharflags = REQ_NONE; + if (firstcharflags == REQ_UNSET) + firstcharflags = zerofirstcharflags = REQ_NONE; break; } } @@ -7072,24 +7950,24 @@ out the amount of memory needed, as well as during the real compile phase. The value of lengthptr distinguishes the two phases. Arguments: - options option bits, including any changes for this subpattern - codeptr -> the address of the current code pointer - ptrptr -> the address of the current pattern pointer - errorcodeptr -> pointer to error code variable - lookbehind TRUE if this is a lookbehind assertion - reset_bracount TRUE to reset the count for each branch - skipbytes skip this many bytes at start (for brackets and OP_COND) - cond_depth depth of nesting for conditional subpatterns - firstcharptr place to put the first required character + options option bits, including any changes for this subpattern + codeptr -> the address of the current code pointer + ptrptr -> the address of the current pattern pointer + errorcodeptr -> pointer to error code variable + lookbehind TRUE if this is a lookbehind assertion + reset_bracount TRUE to reset the count for each branch + skipbytes skip this many bytes at start (for brackets and OP_COND) + cond_depth depth of nesting for conditional subpatterns + firstcharptr place to put the first required character firstcharflagsptr place to put the first character flags, or a negative number - reqcharptr place to put the last required character - reqcharflagsptr place to put the last required character flags, or a negative number - bcptr pointer to the chain of currently open branches - cd points to the data block with tables pointers etc. - lengthptr NULL during the real compile phase - points to length accumulator during pre-compile phase - -Returns: TRUE on success + reqcharptr place to put the last required character + reqcharflagsptr place to put the last required character flags, or a negative number + bcptr pointer to the chain of currently open branches + cd points to the data block with tables pointers etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success */ static BOOL @@ -7540,9 +8418,9 @@ do { switch (*scode) { case OP_CREF: - case OP_NCREF: + case OP_DNCREF: case OP_RREF: - case OP_NRREF: + case OP_DNRREF: case OP_DEF: return FALSE; @@ -7626,13 +8504,14 @@ return TRUE; discarded, because they can cause conflicts with actual literals that follow. However, if we end up without a first char setting for an unanchored pattern, it is worth scanning the regex to see if there is an initial asserted first -char. If all branches start with the same asserted char, or with a bracket all -of whose alternatives start with the same asserted char (recurse ad lib), then -we return that char, otherwise -1. +char. If all branches start with the same asserted char, or with a +non-conditional bracket all of whose alternatives start with the same asserted +char (recurse ad lib), then we return that char, with the flags set to zero or +REQ_CASELESS; otherwise return zero with REQ_NONE in the flags. Arguments: code points to start of expression (the bracket) - flags points to the first char flags, or to REQ_NONE + flags points to the first char flags, or to REQ_NONE inassert TRUE if in an assertion Returns: the fixed first char, or 0 with REQ_NONE in flags @@ -7669,7 +8548,6 @@ do { case OP_ASSERT: case OP_ONCE: case OP_ONCE_NC: - case OP_COND: d = find_firstassertedchar(scode, &dflags, op == OP_ASSERT); if (dflags < 0) return 0; @@ -7714,6 +8592,61 @@ return c; /************************************************* +* Add an entry to the name/number table * +*************************************************/ + +/* This function is called between compiling passes to add an entry to the +name/number table, maintaining alphabetical order. Checking for permitted +and forbidden duplicates has already been done. + +Arguments: + cd the compile data block + name the name to add + length the length of the name + groupno the group number + +Returns: nothing +*/ + +static void +add_name(compile_data *cd, const pcre_uchar *name, int length, + unsigned int groupno) +{ +int i; +pcre_uchar *slot = cd->name_table; + +for (i = 0; i < cd->names_found; i++) + { + int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(length)); + if (crc == 0 && slot[IMM2_SIZE+length] != 0) + crc = -1; /* Current name is a substring */ + + /* Make space in the table and break the loop for an earlier name. For a + duplicate or later name, carry on. We do this for duplicates so that in the + simple case (when ?(| is not used) they are in order of their numbers. In all + cases they are in the order in which they appear in the pattern. */ + + if (crc < 0) + { + memmove(slot + cd->name_entry_size, slot, + IN_UCHARS((cd->names_found - i) * cd->name_entry_size)); + break; + } + + /* Continue the loop for a later or duplicate name */ + + slot += cd->name_entry_size; + } + +PUT2(slot, 0, groupno); +memcpy(slot + IMM2_SIZE, name, IN_UCHARS(length)); +slot[IMM2_SIZE + length] = 0; +cd->names_found++; +} + + + +/************************************************* * Compile a Regular Expression * *************************************************/ @@ -7775,12 +8708,15 @@ pcre32_compile2(PCRE_SPTR32 pattern, int options, int *errorcodeptr, { REAL_PCRE *re; int length = 1; /* For final END opcode */ -pcre_uint32 firstchar, reqchar; pcre_int32 firstcharflags, reqcharflags; +pcre_uint32 firstchar, reqchar; +pcre_uint32 limit_match = PCRE_UINT32_MAX; +pcre_uint32 limit_recursion = PCRE_UINT32_MAX; int newline; int errorcode = 0; int skipatstart = 0; BOOL utf; +BOOL never_utf = FALSE; size_t size; pcre_uchar *code; const pcre_uchar *codestart; @@ -7797,6 +8733,11 @@ new memory is obtained from malloc(). */ pcre_uchar cworkspace[COMPILE_WORK_SIZE]; +/* This vector is used for remembering name groups during the pre-compile. In a +similar way to cworkspace, it can be expanded using malloc() if necessary. */ + +named_group named_groups[NAMED_GROUP_LIST_SIZE]; + /* Set this early so that early errors get offset 0. */ ptr = (const pcre_uchar *)pattern; @@ -7840,9 +8781,15 @@ if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0) goto PCRE_EARLY_ERROR_RETURN; } +/* If PCRE_NEVER_UTF is set, remember it. */ + +if ((options & PCRE_NEVER_UTF) != 0) never_utf = TRUE; + /* Check for global one-time settings at the start of the pattern, and remember the offset for later. */ +cd->external_flags = 0; /* Initialize here for LIMIT_MATCH/RECURSION */ + while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS && ptr[skipatstart+1] == CHAR_ASTERISK) { @@ -7870,9 +8817,49 @@ PCRE_UTF8 == PCRE_UTF16 == PCRE_UTF32. */ { skipatstart += 6; options |= PCRE_UTF8; continue; } else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UCP_RIGHTPAR, 4) == 0) { skipatstart += 6; options |= PCRE_UCP; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_AUTO_POSSESS_RIGHTPAR, 16) == 0) + { skipatstart += 18; options |= PCRE_NO_AUTO_POSSESS; continue; } else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_START_OPT_RIGHTPAR, 13) == 0) { skipatstart += 15; options |= PCRE_NO_START_OPTIMIZE; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_MATCH_EQ, 12) == 0) + { + pcre_uint32 c = 0; + int p = skipatstart + 14; + while (isdigit(ptr[p])) + { + if (c > PCRE_UINT32_MAX / 10 - 1) break; /* Integer overflow */ + c = c*10 + ptr[p++] - CHAR_0; + } + if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break; + if (c < limit_match) + { + limit_match = c; + cd->external_flags |= PCRE_MLSET; + } + skipatstart = p; + continue; + } + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_RECURSION_EQ, 16) == 0) + { + pcre_uint32 c = 0; + int p = skipatstart + 18; + while (isdigit(ptr[p])) + { + if (c > PCRE_UINT32_MAX / 10 - 1) break; /* Integer overflow check */ + c = c*10 + ptr[p++] - CHAR_0; + } + if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break; + if (c < limit_recursion) + { + limit_recursion = c; + cd->external_flags |= PCRE_RLSET; + } + skipatstart = p; + continue; + } + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CR_RIGHTPAR, 3) == 0) { skipatstart += 5; newnl = PCRE_NEWLINE_CR; } else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LF_RIGHTPAR, 3) == 0) @@ -7898,6 +8885,11 @@ PCRE_UTF8 == PCRE_UTF16 == PCRE_UTF32. */ /* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */ utf = (options & PCRE_UTF8) != 0; +if (utf && never_utf) + { + errorcode = ERR78; + goto PCRE_EARLY_ERROR_RETURN2; + } /* Can't support UTF unless PCRE has been compiled to include the code. The return of an error code from PRIV(valid_utf)() is a new feature, introduced in @@ -8010,17 +9002,21 @@ cd->bracount = cd->final_bracount = 0; cd->names_found = 0; cd->name_entry_size = 0; cd->name_table = NULL; +cd->dupnames = FALSE; +cd->namedrefcount = 0; cd->start_code = cworkspace; cd->hwm = cworkspace; cd->start_workspace = cworkspace; cd->workspace_size = COMPILE_WORK_SIZE; +cd->named_groups = named_groups; +cd->named_group_list_size = NAMED_GROUP_LIST_SIZE; cd->start_pattern = (const pcre_uchar *)pattern; cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern)); cd->req_varyopt = 0; +cd->parens_depth = 0; cd->assert_depth = 0; cd->max_lookbehind = 0; cd->external_options = options; -cd->external_flags = 0; cd->open_caps = NULL; /* Now do the pre-compile. On error, errorcode will be set non-zero, so we @@ -8032,6 +9028,7 @@ outside can help speed up starting point checks. */ ptr += skipatstart; code = cworkspace; *code = OP_BRA; + (void)compile_regex(cd->external_options, &code, &ptr, &errorcode, FALSE, FALSE, 0, 0, &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL, cd, &length); @@ -8046,14 +9043,23 @@ if (length > MAX_PATTERN_SIZE) goto PCRE_EARLY_ERROR_RETURN; } -/* Compute the size of data block needed and get it, either from malloc or -externally provided function. Integer overflow should no longer be possible -because nowadays we limit the maximum value of cd->names_found and -cd->name_entry_size. */ +/* If there are groups with duplicate names and there are also references by +name, we must allow for the possibility of named references to duplicated +groups. These require an extra data item each. */ -size = sizeof(REAL_PCRE) + (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar); -re = (REAL_PCRE *)(PUBL(malloc))(size); +if (cd->dupnames && cd->namedrefcount > 0) + length += cd->namedrefcount * IMM2_SIZE * sizeof(pcre_uchar); + +/* Compute the size of the data block for storing the compiled pattern. Integer +overflow should no longer be possible because nowadays we limit the maximum +value of cd->names_found and cd->name_entry_size. */ + +size = sizeof(REAL_PCRE) + + (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar); + +/* Get the memory. */ +re = (REAL_PCRE *)(PUBL(malloc))(size); if (re == NULL) { errorcode = ERR21; @@ -8070,6 +9076,8 @@ re->magic_number = MAGIC_NUMBER; re->size = (int)size; re->options = cd->external_options; re->flags = cd->external_flags; +re->limit_match = limit_match; +re->limit_recursion = limit_recursion; re->first_char = 0; re->req_char = 0; re->name_table_offset = sizeof(REAL_PCRE) / sizeof(pcre_uchar); @@ -8079,7 +9087,9 @@ re->ref_count = 0; re->tables = (tables == PRIV(default_tables))? NULL : tables; re->nullpad = NULL; #ifdef COMPILE_PCRE32 -re->dummy1 = re->dummy2 = 0; +re->dummy = 0; +#else +re->dummy1 = re->dummy2 = re->dummy3 = 0; #endif /* The starting points of the name/number translation table and of the code are @@ -8090,10 +9100,10 @@ field; this time it's used for remembering forward references to subpatterns. */ cd->final_bracount = cd->bracount; /* Save for checking forward references */ +cd->parens_depth = 0; cd->assert_depth = 0; cd->bracount = 0; cd->max_lookbehind = 0; -cd->names_found = 0; cd->name_table = (pcre_uchar *)re + re->name_table_offset; codestart = cd->name_table + re->name_entry_size * re->name_count; cd->start_code = codestart; @@ -8104,6 +9114,20 @@ cd->had_pruneorskip = FALSE; cd->check_lookbehind = FALSE; cd->open_caps = NULL; +/* If any named groups were found, create the name/number table from the list +created in the first pass. */ + +if (cd->names_found > 0) + { + int i = cd->names_found; + named_group *ng = cd->named_groups; + cd->names_found = 0; + for (; i > 0; i--, ng++) + add_name(cd, ng->name, ng->length, ng->number); + if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) + (PUBL(free))((void *)cd->named_groups); + } + /* Set up a starting, non-extracting bracket, then compile the expression. On error, errorcode will be set non-zero, so we don't need to look at the result of the function here. */ @@ -8167,16 +9191,24 @@ if (cd->hwm > cd->start_workspace) } } -/* If the workspace had to be expanded, free the new memory. */ +/* If the workspace had to be expanded, free the new memory. Set the pointer to +NULL to indicate that forward references have been filled in. */ if (cd->workspace_size > COMPILE_WORK_SIZE) (PUBL(free))((void *)cd->start_workspace); +cd->start_workspace = NULL; /* Give an error if there's back reference to a non-existent capturing subpattern. */ if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; +/* Unless disabled, check whether single character iterators can be +auto-possessified. The function overwrites the appropriate opcode values. */ + +if ((options & PCRE_NO_AUTO_POSSESS) == 0) + auto_possessify((pcre_uchar *)codestart, utf, cd); + /* If there were any lookbehind assertions that contained OP_RECURSE (recursions or subroutine calls), a flag is set for them to be checked here, because they may contain forward references. Actual recursions cannot be fixed @@ -8374,6 +9406,20 @@ if (code - codestart > length) } #endif /* PCRE_DEBUG */ +/* Check for a pattern than can match an empty string, so that this information +can be provided to applications. */ + +do + { + if (could_be_empty_branch(codestart, code, utf, cd, NULL)) + { + re->flags |= PCRE_MATCH_EMPTY; + break; + } + codestart += GET(codestart, 1); + } +while (*codestart == OP_ALT); + #if defined COMPILE_PCRE8 return (pcre *)re; #elif defined COMPILE_PCRE16 @@ -8384,3 +9430,4 @@ return (pcre32 *)re; } /* End of pcre_compile.c */ + diff --git a/ext/pcre/pcrelib/pcre_config.c b/ext/pcre/pcrelib/pcre_config.c index 3d5689f62..1cbdd9c96 100644 --- a/ext/pcre/pcrelib/pcre_config.c +++ b/ext/pcre/pcrelib/pcre_config.c @@ -161,6 +161,10 @@ switch (what) *((int *)where) = POSIX_MALLOC_THRESHOLD; break; + case PCRE_CONFIG_PARENS_LIMIT: + *((unsigned long int *)where) = PARENS_NEST_LIMIT; + break; + case PCRE_CONFIG_MATCH_LIMIT: *((unsigned long int *)where) = MATCH_LIMIT; break; diff --git a/ext/pcre/pcrelib/pcre_exec.c b/ext/pcre/pcrelib/pcre_exec.c index 05d0e52d3..a3f0c1923 100644 --- a/ext/pcre/pcrelib/pcre_exec.c +++ b/ext/pcre/pcrelib/pcre_exec.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -56,6 +56,20 @@ possible. There are also some static supporting functions. */ #undef min #undef max +/* The md->capture_last field uses the lower 16 bits for the last captured +substring (which can never be greater than 65535) and a bit in the top half +to mean "capture vector overflowed". This odd way of doing things was +implemented when it was realized that preserving and restoring the overflow bit +whenever the last capture number was saved/restored made for a neater +interface, and doing it this way saved on (a) another variable, which would +have increased the stack frame size (a big NO-NO in PCRE) and (b) another +separate set of save/restore instructions. The following defines are used in +implementing this. */ + +#define CAPLMASK 0x0000ffff /* The bits used for last_capture */ +#define OVFLMASK 0xffff0000 /* The bits used for the overflow flag */ +#define OVFLBIT 0x00010000 /* The bit that is set for overflow */ + /* Values for setting in md->match_function_type to indicate two special types of call to match(). We do it this way to save on using another stack variable, as stack usage is to be discouraged. */ @@ -73,13 +87,17 @@ defined PCRE_ERROR_xxx codes, which are all negative. */ negative to avoid the external error codes. */ #define MATCH_ACCEPT (-999) -#define MATCH_COMMIT (-998) -#define MATCH_KETRPOS (-997) -#define MATCH_ONCE (-996) +#define MATCH_KETRPOS (-998) +#define MATCH_ONCE (-997) +/* The next 5 must be kept together and in sequence so that a test that checks +for any one of them can use a range. */ +#define MATCH_COMMIT (-996) #define MATCH_PRUNE (-995) #define MATCH_SKIP (-994) #define MATCH_SKIP_ARG (-993) #define MATCH_THEN (-992) +#define MATCH_BACKTRACK_MAX MATCH_THEN +#define MATCH_BACKTRACK_MIN MATCH_COMMIT /* Maximum number of ints of offset to save on the stack for recursive calls. If the offset vector is bigger, malloc is used. This should be a multiple of 3, @@ -89,8 +107,8 @@ because the offset vector is always a multiple of 3 long. */ /* Min and max values for the common repeats; for the maxima, 0 => infinity */ -static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; -static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; +static const char rep_min[] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, }; +static const char rep_max[] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, }; #ifdef PCRE_DEBUG /************************************************* @@ -149,7 +167,7 @@ match_ref(int offset, register PCRE_PUCHAR eptr, int length, match_data *md, { PCRE_PUCHAR eptr_start = eptr; register PCRE_PUCHAR p = md->start_subject + md->offset_vector[offset]; -#ifdef SUPPORT_UTF +#if defined SUPPORT_UTF && defined SUPPORT_UCP BOOL utf = md->utf; #endif @@ -177,8 +195,7 @@ ASCII characters. */ if (caseless) { -#ifdef SUPPORT_UTF -#ifdef SUPPORT_UCP +#if defined SUPPORT_UTF && defined SUPPORT_UCP if (utf) { /* Match characters up to the end of the reference. NOTE: the number of @@ -212,14 +229,13 @@ if (caseless) } else #endif -#endif /* The same code works when not in UTF-8 mode and in UTF-8 mode when there is no UCP support. */ { while (length-- > 0) { - pcre_uchar cc, cp; + pcre_uint32 cc, cp; if (eptr >= md->end_subject) return -2; /* Partial match */ cc = RAWUCHARTEST(eptr); cp = RAWUCHARTEST(p); @@ -416,10 +432,10 @@ typedef struct heapframe { int Xlength; int Xmax; int Xmin; - int Xnumber; + unsigned int Xnumber; int Xoffset; - int Xop; - int Xsave_capture_last; + unsigned int Xop; + pcre_int32 Xsave_capture_last; int Xsave_offset1, Xsave_offset2, Xsave_offset3; int Xstacksave[REC_STACK_SAVE_MAX]; @@ -634,8 +650,8 @@ int max; int min; unsigned int number; int offset; -pcre_uchar op; -int save_capture_last; +unsigned int op; +pcre_int32 save_capture_last; int save_offset1, save_offset2, save_offset3; int stacksave[REC_STACK_SAVE_MAX]; @@ -763,23 +779,16 @@ for (;;) case OP_FAIL: RRETURN(MATCH_NOMATCH); - /* COMMIT overrides PRUNE, SKIP, and THEN */ - case OP_COMMIT: RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, RM52); - if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && - rrc != MATCH_SKIP && rrc != MATCH_SKIP_ARG && - rrc != MATCH_THEN) - RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_COMMIT); - /* PRUNE overrides THEN */ - case OP_PRUNE: RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, RM51); - if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_PRUNE); case OP_PRUNE_ARG: @@ -789,38 +798,39 @@ for (;;) eptrb, RM56); if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && md->mark == NULL) md->mark = ecode + 2; - if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_PRUNE); - /* SKIP overrides PRUNE and THEN */ - case OP_SKIP: RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, RM53); - if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) - RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); md->start_match_ptr = eptr; /* Pass back current position */ RRETURN(MATCH_SKIP); /* Note that, for Perl compatibility, SKIP with an argument does NOT set - nomatch_mark. There is a flag that disables this opcode when re-matching a - pattern that ended with a SKIP for which there was not a matching MARK. */ + nomatch_mark. When a pattern match ends with a SKIP_ARG for which there was + not a matching mark, we have to re-run the match, ignoring the SKIP_ARG + that failed and any that precede it (either they also failed, or were not + triggered). To do this, we maintain a count of executed SKIP_ARGs. If a + SKIP_ARG gets to top level, the match is re-run with md->ignore_skip_arg + set to the count of the one that failed. */ case OP_SKIP_ARG: - if (md->ignore_skip_arg) + md->skip_arg_count++; + if (md->skip_arg_count <= md->ignore_skip_arg) { ecode += PRIV(OP_lengths)[*ecode] + ecode[1]; break; } RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, eptrb, RM57); - if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) - RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); /* Pass back the current skip name by overloading md->start_match_ptr and returning the special MATCH_SKIP_ARG return code. This will either be caught by a matching MARK, or get to the top, where it causes a rematch - with the md->ignore_skip_arg flag set. */ + with md->ignore_skip_arg set to the value of md->skip_arg_count. */ md->start_match_ptr = ecode + 2; RRETURN(MATCH_SKIP_ARG); @@ -1066,6 +1076,7 @@ for (;;) /* In all other cases, we have to make another call to match(). */ save_mark = md->mark; + save_capture_last = md->capture_last; RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, RM2); @@ -1097,6 +1108,7 @@ for (;;) ecode += GET(ecode, 1); md->mark = save_mark; if (*ecode != OP_ALT) break; + md->capture_last = save_capture_last; } RRETURN(MATCH_NOMATCH); @@ -1159,6 +1171,7 @@ for (;;) ecode = md->start_code + code_offset; save_capture_last = md->capture_last; matched_once = TRUE; + mstart = md->start_match_ptr; /* In case \K changed it */ continue; } @@ -1218,6 +1231,7 @@ for (;;) POSSESSIVE_NON_CAPTURE: matched_once = FALSE; code_offset = (int)(ecode - md->start_code); + save_capture_last = md->capture_last; for (;;) { @@ -1230,6 +1244,7 @@ for (;;) eptr = md->end_match_ptr; ecode = md->start_code + code_offset; matched_once = TRUE; + mstart = md->start_match_ptr; /* In case \K reset it */ continue; } @@ -1247,6 +1262,7 @@ for (;;) if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode, 1); if (*ecode != OP_ALT) break; + md->capture_last = save_capture_last; } if (matched_once || allow_zero) @@ -1258,25 +1274,32 @@ for (;;) /* Control never reaches here. */ - /* Conditional group: compilation checked that there are no more than - two branches. If the condition is false, skipping the first branch takes us - past the end if there is only one branch, but that's OK because that is - exactly what going to the ket would do. */ + /* Conditional group: compilation checked that there are no more than two + branches. If the condition is false, skipping the first branch takes us + past the end of the item if there is only one branch, but that's exactly + what we want. */ case OP_COND: case OP_SCOND: - codelink = GET(ecode, 1); + + /* The variable codelink will be added to ecode when the condition is + false, to get to the second branch. Setting it to the offset to the ALT + or KET, then incrementing ecode achieves this effect. We now have ecode + pointing to the condition or callout. */ + + codelink = GET(ecode, 1); /* Offset to the second branch */ + ecode += 1 + LINK_SIZE; /* From this opcode */ /* Because of the way auto-callout works during compile, a callout item is inserted between OP_COND and an assertion condition. */ - if (ecode[LINK_SIZE+1] == OP_CALLOUT) + if (*ecode == OP_CALLOUT) { if (PUBL(callout) != NULL) { PUBL(callout_block) cb; cb.version = 2; /* Version 1 of the callout block */ - cb.callout_number = ecode[LINK_SIZE+2]; + cb.callout_number = ecode[1]; cb.offset_vector = md->offset_vector; #if defined COMPILE_PCRE8 cb.subject = (PCRE_SPTR)md->start_subject; @@ -1288,215 +1311,130 @@ for (;;) cb.subject_length = (int)(md->end_subject - md->start_subject); cb.start_match = (int)(mstart - md->start_subject); cb.current_position = (int)(eptr - md->start_subject); - cb.pattern_position = GET(ecode, LINK_SIZE + 3); - cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE); + cb.pattern_position = GET(ecode, 2); + cb.next_item_length = GET(ecode, 2 + LINK_SIZE); cb.capture_top = offset_top/2; - cb.capture_last = md->capture_last; + cb.capture_last = md->capture_last & CAPLMASK; + /* Internal change requires this for API compatibility. */ + if (cb.capture_last == 0) cb.capture_last = -1; cb.callout_data = md->callout_data; cb.mark = md->nomatch_mark; if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH); if (rrc < 0) RRETURN(rrc); } + + /* Advance ecode past the callout, so it now points to the condition. We + must adjust codelink so that the value of ecode+codelink is unchanged. */ + ecode += PRIV(OP_lengths)[OP_CALLOUT]; + codelink -= PRIV(OP_lengths)[OP_CALLOUT]; } - condcode = ecode[LINK_SIZE+1]; + /* Test the various possible conditions */ - /* Now see what the actual condition is */ - - if (condcode == OP_RREF || condcode == OP_NRREF) /* Recursion test */ + condition = FALSE; + switch(condcode = *ecode) { - if (md->recursive == NULL) /* Not recursing => FALSE */ - { - condition = FALSE; - ecode += GET(ecode, 1); - } - else + case OP_RREF: /* Numbered group recursion test */ + if (md->recursive != NULL) /* Not recursing => FALSE */ { - unsigned int recno = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ + unsigned int recno = GET2(ecode, 1); /* Recursion group number*/ condition = (recno == RREF_ANY || recno == md->recursive->group_num); + } + break; - /* If the test is for recursion into a specific subpattern, and it is - false, but the test was set up by name, scan the table to see if the - name refers to any other numbers, and test them. The condition is true - if any one is set. */ - - if (!condition && condcode == OP_NRREF) + case OP_DNRREF: /* Duplicate named group recursion test */ + if (md->recursive != NULL) + { + int count = GET2(ecode, 1 + IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + while (count-- > 0) { - pcre_uchar *slotA = md->name_table; - for (i = 0; i < md->name_count; i++) - { - if (GET2(slotA, 0) == recno) break; - slotA += md->name_entry_size; - } - - /* Found a name for the number - there can be only one; duplicate - names for different numbers are allowed, but not vice versa. First - scan down for duplicates. */ - - if (i < md->name_count) - { - pcre_uchar *slotB = slotA; - while (slotB > md->name_table) - { - slotB -= md->name_entry_size; - if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) - { - condition = GET2(slotB, 0) == md->recursive->group_num; - if (condition) break; - } - else break; - } - - /* Scan up for duplicates */ - - if (!condition) - { - slotB = slotA; - for (i++; i < md->name_count; i++) - { - slotB += md->name_entry_size; - if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) - { - condition = GET2(slotB, 0) == md->recursive->group_num; - if (condition) break; - } - else break; - } - } - } + unsigned int recno = GET2(slot, 0); + condition = recno == md->recursive->group_num; + if (condition) break; + slot += md->name_entry_size; } - - /* Chose branch according to the condition */ - - ecode += condition? 1 + IMM2_SIZE : GET(ecode, 1); } - } + break; - else if (condcode == OP_CREF || condcode == OP_NCREF) /* Group used test */ - { - offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ + case OP_CREF: /* Numbered group used test */ + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ condition = offset < offset_top && md->offset_vector[offset] >= 0; + break; - /* If the numbered capture is unset, but the reference was by name, - scan the table to see if the name refers to any other numbers, and test - them. The condition is true if any one is set. This is tediously similar - to the code above, but not close enough to try to amalgamate. */ - - if (!condition && condcode == OP_NCREF) + case OP_DNCREF: /* Duplicate named group used test */ { - unsigned int refno = offset >> 1; - pcre_uchar *slotA = md->name_table; - - for (i = 0; i < md->name_count; i++) + int count = GET2(ecode, 1 + IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + while (count-- > 0) { - if (GET2(slotA, 0) == refno) break; - slotA += md->name_entry_size; - } - - /* Found a name for the number - there can be only one; duplicate names - for different numbers are allowed, but not vice versa. First scan down - for duplicates. */ - - if (i < md->name_count) - { - pcre_uchar *slotB = slotA; - while (slotB > md->name_table) - { - slotB -= md->name_entry_size; - if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) - { - offset = GET2(slotB, 0) << 1; - condition = offset < offset_top && - md->offset_vector[offset] >= 0; - if (condition) break; - } - else break; - } - - /* Scan up for duplicates */ - - if (!condition) - { - slotB = slotA; - for (i++; i < md->name_count; i++) - { - slotB += md->name_entry_size; - if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) - { - offset = GET2(slotB, 0) << 1; - condition = offset < offset_top && - md->offset_vector[offset] >= 0; - if (condition) break; - } - else break; - } - } + offset = GET2(slot, 0) << 1; + condition = offset < offset_top && md->offset_vector[offset] >= 0; + if (condition) break; + slot += md->name_entry_size; } } + break; - /* Chose branch according to the condition */ - - ecode += condition? 1 + IMM2_SIZE : GET(ecode, 1); - } - - else if (condcode == OP_DEF) /* DEFINE - always false */ - { - condition = FALSE; - ecode += GET(ecode, 1); - } + case OP_DEF: /* DEFINE - always false */ + break; - /* The condition is an assertion. Call match() to evaluate it - setting - md->match_function_type to MATCH_CONDASSERT causes it to stop at the end of - an assertion. */ + /* The condition is an assertion. Call match() to evaluate it - setting + md->match_function_type to MATCH_CONDASSERT causes it to stop at the end + of an assertion. */ - else - { + default: md->match_function_type = MATCH_CONDASSERT; - RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM3); + RMATCH(eptr, ecode, offset_top, md, NULL, RM3); if (rrc == MATCH_MATCH) { if (md->end_offset_top > offset_top) offset_top = md->end_offset_top; /* Captures may have happened */ condition = TRUE; - ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE + 2); + + /* Advance ecode past the assertion to the start of the first branch, + but adjust it so that the general choosing code below works. */ + + ecode += GET(ecode, 1); while (*ecode == OP_ALT) ecode += GET(ecode, 1); + ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode]; } /* PCRE doesn't allow the effect of (*THEN) to escape beyond an - assertion; it is therefore treated as NOMATCH. */ + assertion; it is therefore treated as NOMATCH. Any other return is an + error. */ else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) { RRETURN(rrc); /* Need braces because of following else */ } - else - { - condition = FALSE; - ecode += codelink; - } + break; } - /* We are now at the branch that is to be obeyed. As there is only one, can - use tail recursion to avoid using another stack frame, except when there is - unlimited repeat of a possibly empty group. In the latter case, a recursive - call to match() is always required, unless the second alternative doesn't - exist, in which case we can just plough on. Note that, for compatibility - with Perl, the | in a conditional group is NOT treated as creating two - alternatives. If a THEN is encountered in the branch, it propagates out to - the enclosing alternative (unless nested in a deeper set of alternatives, - of course). */ - - if (condition || *ecode == OP_ALT) + /* Choose branch according to the condition */ + + ecode += condition? PRIV(OP_lengths)[condcode] : codelink; + + /* We are now at the branch that is to be obeyed. As there is only one, we + can use tail recursion to avoid using another stack frame, except when + there is unlimited repeat of a possibly empty group. In the latter case, a + recursive call to match() is always required, unless the second alternative + doesn't exist, in which case we can just plough on. Note that, for + compatibility with Perl, the | in a conditional group is NOT treated as + creating two alternatives. If a THEN is encountered in the branch, it + propagates out to the enclosing alternative (unless nested in a deeper set + of alternatives, of course). */ + + if (condition || ecode[-(1+LINK_SIZE)] == OP_ALT) { if (op != OP_SCOND) { - ecode += 1 + LINK_SIZE; goto TAIL_RECURSE; } md->match_function_type = MATCH_CBEGROUP; - RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM49); + RMATCH(eptr, ecode, offset_top, md, eptrb, RM49); RRETURN(rrc); } @@ -1504,7 +1442,6 @@ for (;;) else { - ecode += 1 + LINK_SIZE; } break; @@ -1513,7 +1450,7 @@ for (;;) to close any currently open capturing brackets. */ case OP_CLOSE: - number = GET2(ecode, 1); + number = GET2(ecode, 1); /* Must be less than 65536 */ offset = number << 1; #ifdef PCRE_DEBUG @@ -1521,8 +1458,8 @@ for (;;) printf("\n"); #endif - md->capture_last = number; - if (offset >= md->offset_max) md->offset_overflow = TRUE; else + md->capture_last = (md->capture_last & OVFLMASK) | number; + if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else { md->offset_vector[offset] = md->offset_vector[md->offset_end - number]; @@ -1584,28 +1521,49 @@ for (;;) } else condassert = FALSE; + /* Loop for each branch */ + do { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4); + + /* A match means that the assertion is true; break out of the loop + that matches its alternatives. */ + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) { mstart = md->start_match_ptr; /* In case \K reset it */ break; } + + /* If not matched, restore the previous mark setting. */ + md->mark = save_mark; - /* A COMMIT failure must fail the entire assertion, without trying any - subsequent branches. */ + /* See comment in the code for capturing groups above about handling + THEN. */ - if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH); + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } - /* PCRE does not allow THEN to escape beyond an assertion; it - is treated as NOMATCH. */ + /* Anything other than NOMATCH causes the entire assertion to fail, + passing back the return code. This includes COMMIT, SKIP, PRUNE and an + uncaptured THEN, which means they take their normal effect. This + consistent approach does not always have exactly the same effect as in + Perl. */ - if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode, 1); } - while (*ecode == OP_ALT); + while (*ecode == OP_ALT); /* Continue for next alternative */ + + /* If we have tried all the alternative branches, the assertion has + failed. If not, we broke out after a match. */ if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); @@ -1613,17 +1571,16 @@ for (;;) if (condassert) RRETURN(MATCH_MATCH); - /* Continue from after the assertion, updating the offsets high water - mark, since extracts may have been taken during the assertion. */ + /* Continue from after a successful assertion, updating the offsets high + water mark, since extracts may have been taken during the assertion. */ do ecode += GET(ecode,1); while (*ecode == OP_ALT); ecode += 1 + LINK_SIZE; offset_top = md->end_offset_top; continue; - /* Negative assertion: all branches must fail to match. Encountering SKIP, - PRUNE, or COMMIT means we must assume failure without checking subsequent - branches. */ + /* Negative assertion: all branches must fail to match for the assertion to + succeed. */ case OP_ASSERT_NOT: case OP_ASSERTBACK_NOT: @@ -1635,28 +1592,64 @@ for (;;) } else condassert = FALSE; + /* Loop for each alternative branch. */ + do { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5); - md->mark = save_mark; - if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH); - if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT) + md->mark = save_mark; /* Always restore the mark setting */ + + switch(rrc) { - do ecode += GET(ecode,1); while (*ecode == OP_ALT); + case MATCH_MATCH: /* A successful match means */ + case MATCH_ACCEPT: /* the assertion has failed. */ + RRETURN(MATCH_NOMATCH); + + case MATCH_NOMATCH: /* Carry on with next branch */ break; + + /* See comment in the code for capturing groups above about handling + THEN. */ + + case MATCH_THEN: + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + { + rrc = MATCH_NOMATCH; + break; + } + /* Otherwise fall through. */ + + /* COMMIT, SKIP, PRUNE, and an uncaptured THEN cause the whole + assertion to fail to match, without considering any more alternatives. + Failing to match means the assertion is true. This is a consistent + approach, but does not always have the same effect as in Perl. */ + + case MATCH_COMMIT: + case MATCH_SKIP: + case MATCH_SKIP_ARG: + case MATCH_PRUNE: + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + goto NEG_ASSERT_TRUE; /* Break out of alternation loop */ + + /* Anything else is an error */ + + default: + RRETURN(rrc); } - /* PCRE does not allow THEN to escape beyond an assertion; it is treated - as NOMATCH. */ + /* Continue with next branch */ - if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); ecode += GET(ecode,1); } while (*ecode == OP_ALT); - if (condassert) RRETURN(MATCH_MATCH); /* Condition assertion */ + /* All branches in the assertion failed to match. */ - ecode += 1 + LINK_SIZE; + NEG_ASSERT_TRUE: + if (condassert) RRETURN(MATCH_MATCH); /* Condition assertion */ + ecode += 1 + LINK_SIZE; /* Continue with current branch */ continue; /* Move the subject pointer back. This occurs only at the start of @@ -1716,7 +1709,9 @@ for (;;) cb.pattern_position = GET(ecode, 2); cb.next_item_length = GET(ecode, 2 + LINK_SIZE); cb.capture_top = offset_top/2; - cb.capture_last = md->capture_last; + cb.capture_last = md->capture_last & CAPLMASK; + /* Internal change requires this for API compatibility. */ + if (cb.capture_last == 0) cb.capture_last = -1; cb.callout_data = md->callout_data; cb.mark = md->nomatch_mark; if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH); @@ -1762,6 +1757,7 @@ for (;;) /* Add to "recursing stack" */ new_recursive.group_num = recno; + new_recursive.saved_capture_last = md->capture_last; new_recursive.subject_position = eptr; new_recursive.prevrec = md->recursive; md->recursive = &new_recursive; @@ -1785,8 +1781,9 @@ for (;;) new_recursive.saved_max * sizeof(int)); /* OK, now we can do the recursion. After processing each alternative, - restore the offset data. If there were nested recursions, md->recursive - might be changed, so reset it before looping. */ + restore the offset data and the last captured value. If there were nested + recursions, md->recursive might be changed, so reset it before looping. + */ DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); cbegroup = (*callpat >= OP_SBRA); @@ -1797,6 +1794,7 @@ for (;;) md, eptrb, RM6); memcpy(md->offset_vector, new_recursive.offset_save, new_recursive.saved_max * sizeof(int)); + md->capture_last = new_recursive.saved_capture_last; md->recursive = new_recursive.prevrec; if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) { @@ -1813,11 +1811,16 @@ for (;;) goto RECURSION_MATCHED; /* Exit loop; end processing */ } - /* PCRE does not allow THEN or COMMIT to escape beyond a recursion; it - is treated as NOMATCH. */ + /* PCRE does not allow THEN, SKIP, PRUNE or COMMIT to escape beyond a + recursion; they cause a NOMATCH for the entire recursion. These codes + are defined in a range that can be tested for. */ + + if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX) + RRETURN(MATCH_NOMATCH); - else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN && - rrc != MATCH_COMMIT) + /* Any return code other than NOMATCH is an error. */ + + if (rrc != MATCH_NOMATCH) { DPRINTF(("Recursion gave error %d\n", rrc)); if (new_recursive.offset_save != stacksave) @@ -1947,8 +1950,8 @@ for (;;) /* Deal with capturing */ - md->capture_last = number; - if (offset >= md->offset_max) md->offset_overflow = TRUE; else + md->capture_last = (md->capture_last & OVFLMASK) | number; + if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else { /* If offset is greater than offset_top, it means that we are "skipping" a capturing group, and that group's offsets must be marked @@ -2004,6 +2007,7 @@ for (;;) if (*ecode == OP_KETRPOS) { + md->start_match_ptr = mstart; /* In case \K reset it */ md->end_match_ptr = eptr; md->end_offset_top = offset_top; RRETURN(MATCH_KETRPOS); @@ -2571,19 +2575,24 @@ for (;;) RRETURN(MATCH_NOMATCH); break; - case PT_SPACE: /* Perl space */ - if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) - == (op == OP_NOTPROP)) - RRETURN(MATCH_NOMATCH); - break; + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + case PT_SPACE: /* Perl space */ case PT_PXSPACE: /* POSIX space */ - if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || - c == CHAR_FF || c == CHAR_CR) - == (op == OP_NOTPROP)) - RRETURN(MATCH_NOMATCH); + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == + (op == OP_NOTPROP)) RRETURN(MATCH_NOMATCH); + break; + } break; case PT_WORD: @@ -2604,6 +2613,13 @@ for (;;) } break; + case PT_UCNC: + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + /* This should never occur */ default: @@ -2650,15 +2666,7 @@ for (;;) similar code to character type repeats - written out again for speed. However, if the referenced string is the empty string, always treat it as matched, any number of times (otherwise there could be infinite - loops). */ - - case OP_REF: - case OP_REFI: - caseless = op == OP_REFI; - offset = GET2(ecode, 1) << 1; /* Doubled ref number */ - ecode += 1 + IMM2_SIZE; - - /* If the reference is unset, there are two possibilities: + loops). If the reference is unset, there are two possibilities: (a) In the default, Perl-compatible state, set the length negative; this ensures that every attempt at a match fails. We can't just fail @@ -2668,8 +2676,39 @@ for (;;) so that the back reference matches an empty string. Otherwise, set the length to the length of what was matched by the - referenced subpattern. */ + referenced subpattern. + + The OP_REF and OP_REFI opcodes are used for a reference to a numbered group + or to a non-duplicated named group. For a duplicated named group, OP_DNREF + and OP_DNREFI are used. In this case we must scan the list of groups to + which the name refers, and use the first one that is set. */ + + case OP_DNREF: + case OP_DNREFI: + caseless = op == OP_DNREFI; + { + int count = GET2(ecode, 1+IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + ecode += 1 + 2*IMM2_SIZE; + + while (count-- > 0) + { + offset = GET2(slot, 0) << 1; + if (offset < offset_top && md->offset_vector[offset] >= 0) break; + slot += md->name_entry_size; + } + if (count < 0) + length = (md->jscript_compat)? 0 : -1; + else + length = md->offset_vector[offset+1] - md->offset_vector[offset]; + } + goto REF_REPEAT; + case OP_REF: + case OP_REFI: + caseless = op == OP_REFI; + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ + ecode += 1 + IMM2_SIZE; if (offset >= offset_top || md->offset_vector[offset] < 0) length = (md->jscript_compat)? 0 : -1; else @@ -2677,6 +2716,7 @@ for (;;) /* Set up for repetition, or handle the non-repeated case */ + REF_REPEAT: switch (*ecode) { case OP_CRSTAR: @@ -2825,8 +2865,12 @@ for (;;) case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; + if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0; + else possessive = TRUE; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; @@ -2834,7 +2878,9 @@ for (;;) case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: minimize = (*ecode == OP_CRMINRANGE); + possessive = (*ecode == OP_CRPOSRANGE); min = GET2(ecode, 1); max = GET2(ecode, 1 + IMM2_SIZE); if (max == 0) max = INT_MAX; @@ -2976,6 +3022,9 @@ for (;;) if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; eptr += len; } + + if (possessive) continue; /* No backtracking */ + for (;;) { RMATCH(eptr, ecode, offset_top, md, eptrb, RM18); @@ -3006,6 +3055,9 @@ for (;;) if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; eptr++; } + + if (possessive) continue; /* No backtracking */ + while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, eptrb, RM19); @@ -3021,9 +3073,10 @@ for (;;) /* Control never gets here */ - /* Match an extended character class. This opcode is encountered only - when UTF-8 mode mode is supported. Nevertheless, we may not be in UTF-8 - mode, because Unicode properties are supported in non-UTF-8 mode. */ + /* Match an extended character class. In the 8-bit library, this opcode is + encountered only when UTF-8 mode mode is supported. In the 16-bit and + 32-bit libraries, codepoints greater than 255 may be encountered even when + UTF is not supported. */ #if defined SUPPORT_UTF || !defined COMPILE_PCRE8 case OP_XCLASS: @@ -3039,8 +3092,12 @@ for (;;) case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; + if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0; + else possessive = TRUE; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; @@ -3048,7 +3105,9 @@ for (;;) case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: minimize = (*ecode == OP_CRMINRANGE); + possessive = (*ecode == OP_CRPOSRANGE); min = GET2(ecode, 1); max = GET2(ecode, 1 + IMM2_SIZE); if (max == 0) max = INT_MAX; @@ -3120,6 +3179,9 @@ for (;;) if (!PRIV(xclass)(c, data, utf)) break; eptr += len; } + + if (possessive) continue; /* No backtracking */ + for(;;) { RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); @@ -3190,7 +3252,7 @@ for (;;) if (fc < 128) { - pcre_uchar cc = RAWUCHAR(eptr); + pcre_uint32 cc = RAWUCHAR(eptr); if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH); ecode++; eptr++; @@ -3295,7 +3357,22 @@ for (;;) max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; - /* Common code for all repeated single-character matches. */ + /* Common code for all repeated single-character matches. We first check + for the minimum number of characters. If the minimum equals the maximum, we + are done. Otherwise, if minimizing, check the rest of the pattern for a + match; if there isn't one, advance up to the maximum, one character at a + time. + + If maximizing, advance up to the maximum number of matching characters, + until eptr is past the end of the maximum run. If possessive, we are + then done (no backing up). Otherwise, match at this position; anything + other than no match is immediately returned. For nomatch, back up one + character, unless we are matching \R and the last thing matched was + \r\n, in which case, back up two bytes. When we reach the first optional + character position, we can save stack by doing a tail recurse. + + The various UTF/non-UTF and caseful/caseless cases are handled separately, + for speed. */ REPEATCHAR: #ifdef SUPPORT_UTF @@ -3379,13 +3456,12 @@ for (;;) } } - if (possessive) continue; - + if (possessive) continue; /* No backtracking */ for(;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM23); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr == pp) { RRETURN(MATCH_NOMATCH); } #ifdef SUPPORT_UCP eptr--; BACKCHAR(eptr); @@ -3439,8 +3515,7 @@ for (;;) for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; /* Faster than pcre_uchar */ if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -3455,8 +3530,7 @@ for (;;) { for (fi = min;; fi++) { - pcre_uchar cc; - + pcre_uint32 cc; /* Faster than pcre_uchar */ RMATCH(eptr, ecode, offset_top, md, eptrb, RM24); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max) RRETURN(MATCH_NOMATCH); @@ -3476,8 +3550,7 @@ for (;;) pp = eptr; for (i = min; i < max; i++) { - pcre_uchar cc; - + pcre_uint32 cc; /* Faster than pcre_uchar */ if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -3487,18 +3560,16 @@ for (;;) if (fc != cc && foc != cc) break; eptr++; } - - if (possessive) continue; - - while (eptr >= pp) + if (possessive) continue; /* No backtracking */ + for (;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM25); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } - RRETURN(MATCH_NOMATCH); + /* Control never gets here */ } - /* Control never gets here */ } /* Caseful comparisons (includes all multi-byte characters) */ @@ -3546,15 +3617,15 @@ for (;;) if (fc != RAWUCHARTEST(eptr)) break; eptr++; } - if (possessive) continue; - - while (eptr >= pp) + if (possessive) continue; /* No backtracking */ + for (;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM27); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } - RRETURN(MATCH_NOMATCH); + /* Control never gets here */ } } /* Control never gets here */ @@ -3726,7 +3797,7 @@ for (;;) } } else -#endif +#endif /* SUPPORT_UTF */ /* Not UTF mode */ { for (i = 1; i <= min; i++) @@ -3764,7 +3835,7 @@ for (;;) } } else -#endif +#endif /*SUPPORT_UTF */ /* Not UTF mode */ { for (fi = min;; fi++) @@ -3806,17 +3877,18 @@ for (;;) if (fc == d || (unsigned int)foc == d) break; eptr += len; } - if (possessive) continue; + if (possessive) continue; /* No backtracking */ for(;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM30); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + eptr--; BACKCHAR(eptr); } } else -#endif +#endif /* SUPPORT_UTF */ /* Not UTF mode */ { for (i = min; i < max; i++) @@ -3829,18 +3901,17 @@ for (;;) if (fc == *eptr || foc == *eptr) break; eptr++; } - if (possessive) continue; - while (eptr >= pp) + if (possessive) continue; /* No backtracking */ + for (;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM31); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } - - RRETURN(MATCH_NOMATCH); + /* Control never gets here */ } - /* Control never gets here */ } /* Caseful comparisons */ @@ -3941,12 +4012,13 @@ for (;;) if (fc == d) break; eptr += len; } - if (possessive) continue; + if (possessive) continue; /* No backtracking */ for(;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM34); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + eptr--; BACKCHAR(eptr); } } @@ -3964,16 +4036,16 @@ for (;;) if (fc == *eptr) break; eptr++; } - if (possessive) continue; - while (eptr >= pp) + if (possessive) continue; /* No backtracking */ + for (;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM35); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } - - RRETURN(MATCH_NOMATCH); + /* Control never gets here */ } } /* Control never gets here */ @@ -4155,7 +4227,12 @@ for (;;) } break; + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) @@ -4164,26 +4241,18 @@ for (;;) RRETURN(MATCH_NOMATCH); } GETCHARINCTEST(c, eptr); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) - RRETURN(MATCH_NOMATCH); - } - break; - - case PT_PXSPACE: /* POSIX space */ - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) + switch(c) { - SCHECK_PARTIAL(); - RRETURN(MATCH_NOMATCH); + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + break; } - GETCHARINCTEST(c, eptr); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) - RRETURN(MATCH_NOMATCH); } break; @@ -4225,6 +4294,22 @@ for (;;) } break; + case PT_UCNC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + /* This should not occur */ default: @@ -4430,8 +4515,7 @@ for (;;) case OP_DIGIT: for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -4448,8 +4532,7 @@ for (;;) case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -4466,8 +4549,7 @@ for (;;) case OP_WHITESPACE: for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -4484,8 +4566,7 @@ for (;;) case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -4502,8 +4583,7 @@ for (;;) case OP_WORDCHAR: for (i = 1; i <= min; i++) { - pcre_uchar cc; - + pcre_uint32 cc; if (eptr >= md->end_subject) { SCHECK_PARTIAL(); @@ -4892,25 +4972,11 @@ for (;;) } /* Control never gets here */ - case PT_SPACE: /* Perl space */ - for (fi = min;; fi++) - { - RMATCH(eptr, ecode, offset_top, md, eptrb, RM60); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max) RRETURN(MATCH_NOMATCH); - if (eptr >= md->end_subject) - { - SCHECK_PARTIAL(); - RRETURN(MATCH_NOMATCH); - } - GETCHARINCTEST(c, eptr); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + case PT_SPACE: /* Perl space */ case PT_PXSPACE: /* POSIX space */ for (fi = min;; fi++) { @@ -4923,10 +4989,18 @@ for (;;) RRETURN(MATCH_NOMATCH); } GETCHARINCTEST(c, eptr); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) - RRETURN(MATCH_NOMATCH); + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + break; + } } /* Control never gets here */ @@ -4976,6 +5050,25 @@ for (;;) } /* Control never gets here */ + case PT_UCNC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM60); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + /* This should never occur */ default: RRETURN(PCRE_ERROR_INTERNAL); @@ -5391,7 +5484,12 @@ for (;;) } break; + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ for (i = min; i < max; i++) { int len = 1; @@ -5401,30 +5499,21 @@ for (;;) break; } GETCHARLENTEST(c, eptr, len); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) goto ENDLOOP99; /* Break the loop */ break; - eptr+= len; - } - break; - case PT_PXSPACE: /* POSIX space */ - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) - { - SCHECK_PARTIAL(); + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + goto ENDLOOP99; /* Break the loop */ break; } - GETCHARLENTEST(c, eptr, len); - if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || - c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) - == prop_fail_result) - break; eptr+= len; } + ENDLOOP99: break; case PT_WORD: @@ -5470,23 +5559,42 @@ for (;;) GOT_MAX: break; + case PT_UCNC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + break; + eptr += len; + } + break; + default: RRETURN(PCRE_ERROR_INTERNAL); } /* eptr is now past the end of the maximum run */ - if (possessive) continue; + if (possessive) continue; /* No backtracking */ for(;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM44); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + eptr--; if (utf) BACKCHAR(eptr); } } - /* Match extended Unicode sequences. We will get here only if the + /* Match extended Unicode grapheme clusters. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ else if (ctype == OP_EXTUNI) @@ -5518,22 +5626,42 @@ for (;;) /* eptr is now past the end of the maximum run */ - if (possessive) continue; + if (possessive) continue; /* No backtracking */ for(;;) { + int lgb, rgb; + PCRE_PUCHAR fptr; + + if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */ RMATCH(eptr, ecode, offset_top, md, eptrb, RM45); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - for (;;) /* Move back over one extended */ + + /* Backtracking over an extended grapheme cluster involves inspecting + the previous two characters (if present) to see if a break is + permitted between them. */ + + eptr--; + if (!utf) c = *eptr; else + { + BACKCHAR(eptr); + GETCHAR(c, eptr); + } + rgb = UCD_GRAPHBREAK(c); + + for (;;) { - if (!utf) c = *eptr; else + if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */ + fptr = eptr - 1; + if (!utf) c = *fptr; else { - BACKCHAR(eptr); - GETCHAR(c, eptr); + BACKCHAR(fptr); + GETCHAR(c, fptr); } - if (UCD_CATEGORY(c) != ucp_M) break; - eptr--; + lgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + eptr = fptr; + rgb = lgb; } } } @@ -5799,18 +5927,13 @@ for (;;) RRETURN(PCRE_ERROR_INTERNAL); } - /* eptr is now past the end of the maximum run. If possessive, we are - done (no backing up). Otherwise, match at this position; anything other - than no match is immediately returned. For nomatch, back up one - character, unless we are matching \R and the last thing matched was - \r\n, in which case, back up two bytes. */ - - if (possessive) continue; + if (possessive) continue; /* No backtracking */ for(;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM46); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + eptr--; BACKCHAR(eptr); if (ctype == OP_ANYNL && eptr > pp && RAWUCHAR(eptr) == CHAR_NL && RAWUCHAR(eptr - 1) == CHAR_CR) eptr--; @@ -6048,15 +6171,10 @@ for (;;) RRETURN(PCRE_ERROR_INTERNAL); } - /* eptr is now past the end of the maximum run. If possessive, we are - done (no backing up). Otherwise, match at this position; anything other - than no match is immediately returned. For nomatch, back up one - character (byte), unless we are matching \R and the last thing matched - was \r\n, in which case, back up two bytes. */ - - if (possessive) continue; - while (eptr >= pp) + if (possessive) continue; /* No backtracking */ + for (;;) { + if (eptr == pp) goto TAIL_RECURSE; RMATCH(eptr, ecode, offset_top, md, eptrb, RM47); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; @@ -6065,11 +6183,8 @@ for (;;) } } - /* Get here if we can't make it match with any permitted repetitions */ - - RRETURN(MATCH_NOMATCH); + /* Control never gets here */ } - /* Control never gets here */ /* There's been some horrible disaster. Arrival here can only mean there is something seriously wrong in the code above or the OP_xxx definitions. */ @@ -6103,10 +6218,10 @@ switch (frame->Xwhere) LBL(53) LBL(54) LBL(55) LBL(56) LBL(57) LBL(58) LBL(63) LBL(64) LBL(65) LBL(66) #if defined SUPPORT_UTF || !defined COMPILE_PCRE8 - LBL(21) + LBL(20) LBL(21) #endif #ifdef SUPPORT_UTF - LBL(16) LBL(18) LBL(20) + LBL(16) LBL(18) LBL(22) LBL(23) LBL(28) LBL(30) LBL(32) LBL(34) LBL(42) LBL(46) #ifdef SUPPORT_UCP @@ -6264,6 +6379,7 @@ const pcre_uint8 *start_bits = NULL; PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset; PCRE_PUCHAR end_subject; PCRE_PUCHAR start_partial = NULL; +PCRE_PUCHAR match_partial = NULL; PCRE_PUCHAR req_char_ptr = start_match - 1; const pcre_study_data *study; @@ -6393,6 +6509,8 @@ md->callout_data = NULL; tables = re->tables; +/* The two limit values override the defaults, whatever their value. */ + if (extra_data != NULL) { register unsigned int flags = extra_data->flags; @@ -6407,6 +6525,15 @@ if (extra_data != NULL) if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables; } +/* Limits in the regex override only if they are smaller. */ + +if ((re->flags & PCRE_MLSET) != 0 && re->limit_match < md->match_limit) + md->match_limit = re->limit_match; + +if ((re->flags & PCRE_RLSET) != 0 && + re->limit_recursion < md->match_limit_recursion) + md->match_limit_recursion = re->limit_recursion; + /* If the exec call supplied NULL for tables, use the inbuilt ones. This is a feature that makes it possible to save compiled regex and re-use them in other programs later. */ @@ -6432,7 +6559,7 @@ end_subject = md->end_subject; md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; md->use_ucp = (re->options & PCRE_UCP) != 0; md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; -md->ignore_skip_arg = FALSE; +md->ignore_skip_arg = 0; /* Some options are unpacked into BOOL variables in the hope that testing them will be faster than individual option bits. */ @@ -6542,11 +6669,9 @@ if (re->top_backref > 0 && re->top_backref >= ocount/3) DPRINTF(("Got memory to hold back references\n")); } else md->offset_vector = offsets; - md->offset_end = ocount; md->offset_max = (2*ocount)/3; -md->offset_overflow = FALSE; -md->capture_last = -1; +md->capture_last = 0; /* Reset the working variable associated with each extraction. These should never be used unless previously set, but they get saved and restored, and so we @@ -6816,8 +6941,13 @@ for(;;) md->match_call_count = 0; md->match_function_type = 0; md->end_offset_top = 0; + md->skip_arg_count = 0; rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0); - if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; + if (md->hitend && start_partial == NULL) + { + start_partial = md->start_used_ptr; + match_partial = start_match; + } switch(rc) { @@ -6830,14 +6960,14 @@ for(;;) case MATCH_SKIP_ARG: new_start_match = start_match; - md->ignore_skip_arg = TRUE; + md->ignore_skip_arg = md->skip_arg_count; break; - /* SKIP passes back the next starting point explicitly, but if it is the - same as the match we have just done, treat it as NOMATCH. */ + /* SKIP passes back the next starting point explicitly, but if it is no + greater than the match we have just done, treat it as NOMATCH. */ case MATCH_SKIP: - if (md->start_match_ptr != start_match) + if (md->start_match_ptr > start_match) { new_start_match = md->start_match_ptr; break; @@ -6845,12 +6975,12 @@ for(;;) /* Fall through */ /* NOMATCH and PRUNE advance by one character. THEN at this level acts - exactly like PRUNE. Unset the ignore SKIP-with-argument flag. */ + exactly like PRUNE. Unset ignore SKIP-with-argument. */ case MATCH_NOMATCH: case MATCH_PRUNE: case MATCH_THEN: - md->ignore_skip_arg = FALSE; + md->ignore_skip_arg = 0; new_start_match = start_match + 1; #ifdef SUPPORT_UTF if (utf) @@ -6943,7 +7073,7 @@ if (rc == MATCH_MATCH || rc == MATCH_ACCEPT) (arg_offset_max - 2) * sizeof(int)); DPRINTF(("Copied offsets from temporary memory\n")); } - if (md->end_offset_top > arg_offset_max) md->offset_overflow = TRUE; + if (md->end_offset_top > arg_offset_max) md->capture_last |= OVFLBIT; DPRINTF(("Freeing temporary memory\n")); (PUBL(free))(md->offset_vector); } @@ -6951,7 +7081,8 @@ if (rc == MATCH_MATCH || rc == MATCH_ACCEPT) /* Set the return code to the number of captured strings, or 0 if there were too many to fit into the vector. */ - rc = (md->offset_overflow && md->end_offset_top >= arg_offset_max)? + rc = ((md->capture_last & OVFLBIT) != 0 && + md->end_offset_top >= arg_offset_max)? 0 : md->end_offset_top/2; /* If there is space in the offset vector, set any unused pairs at the end of @@ -7016,7 +7147,7 @@ if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL) /* Handle partial matches - disable any mark data */ -if (start_partial != NULL) +if (match_partial != NULL) { DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); md->mark = NULL; @@ -7024,6 +7155,8 @@ if (start_partial != NULL) { offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject); offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject); + if (offsetcount > 2) + offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject); } rc = PCRE_ERROR_PARTIAL; } diff --git a/ext/pcre/pcrelib/pcre_fullinfo.c b/ext/pcre/pcrelib/pcre_fullinfo.c index 02c9df4a8..a6c2ece6c 100644 --- a/ext/pcre/pcrelib/pcre_fullinfo.c +++ b/ext/pcre/pcrelib/pcre_fullinfo.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -222,6 +222,20 @@ switch (what) *((int *)where) = re->max_lookbehind; break; + case PCRE_INFO_MATCHLIMIT: + if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET; + *((pcre_uint32 *)where) = re->limit_match; + break; + + case PCRE_INFO_RECURSIONLIMIT: + if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET; + *((pcre_uint32 *)where) = re->limit_recursion; + break; + + case PCRE_INFO_MATCH_EMPTY: + *((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0; + break; + default: return PCRE_ERROR_BADOPTION; } diff --git a/ext/pcre/pcrelib/pcre_internal.h b/ext/pcre/pcrelib/pcre_internal.h index 43f536455..0b9798c55 100644 --- a/ext/pcre/pcrelib/pcre_internal.h +++ b/ext/pcre/pcrelib/pcre_internal.h @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -194,23 +194,31 @@ preprocessor time in standard C environments. */ typedef unsigned char pcre_uint8; #if USHRT_MAX == 65535 - typedef unsigned short pcre_uint16; - typedef short pcre_int16; +typedef unsigned short pcre_uint16; +typedef short pcre_int16; +#define PCRE_UINT16_MAX USHRT_MAX +#define PCRE_INT16_MAX SHRT_MAX #elif UINT_MAX == 65535 - typedef unsigned int pcre_uint16; - typedef int pcre_int16; +typedef unsigned int pcre_uint16; +typedef int pcre_int16; +#define PCRE_UINT16_MAX UINT_MAX +#define PCRE_INT16_MAX INT_MAX #else -# error Cannot determine a type for 16-bit unsigned integers +#error Cannot determine a type for 16-bit integers #endif -#if UINT_MAX == 4294967295 - typedef unsigned int pcre_uint32; - typedef int pcre_int32; -#elif ULONG_MAX == 4294967295 - typedef unsigned long int pcre_uint32; - typedef long int pcre_int32; +#if UINT_MAX == 4294967295U +typedef unsigned int pcre_uint32; +typedef int pcre_int32; +#define PCRE_UINT32_MAX UINT_MAX +#define PCRE_INT32_MAX INT_MAX +#elif ULONG_MAX == 4294967295UL +typedef unsigned long int pcre_uint32; +typedef long int pcre_int32; +#define PCRE_UINT32_MAX ULONG_MAX +#define PCRE_INT32_MAX LONG_MAX #else -# error Cannot determine a type for 32-bit unsigned integers +#error Cannot determine a type for 32-bit integers #endif /* When checking for integer overflow in pcre_compile(), we need to handle @@ -221,11 +229,9 @@ stdint.h is available, include it; it may define INT64_MAX. Systems that do not have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set by "configure". */ -#ifdef PHP_WIN32 -#include "win32/php_stdint.h" -#elif HAVE_STDINT_H +#if defined HAVE_STDINT_H #include <stdint.h> -#elif HAVE_INTTYPES_H +#elif defined HAVE_INTTYPES_H #include <inttypes.h> #endif @@ -1123,23 +1129,27 @@ other. NOTE: The values also appear in pcre_jit_compile.c. */ /* Private flags containing information about the compiled regex. They used to -live at the top end of the options word, but that got almost full, so now they -are in a 16-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as -the restrictions on partial matching have been lifted. It remains for backwards +live at the top end of the options word, but that got almost full, so they were +moved to a 16-bit flags word - which got almost full, so now they are in a +32-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as the +restrictions on partial matching have been lifted. It remains for backwards compatibility. */ -#define PCRE_MODE8 0x0001 /* compiled in 8 bit mode */ -#define PCRE_MODE16 0x0002 /* compiled in 16 bit mode */ -#define PCRE_MODE32 0x0004 /* compiled in 32 bit mode */ -#define PCRE_FIRSTSET 0x0010 /* first_char is set */ -#define PCRE_FCH_CASELESS 0x0020 /* caseless first char */ -#define PCRE_REQCHSET 0x0040 /* req_byte is set */ -#define PCRE_RCH_CASELESS 0x0080 /* caseless requested char */ -#define PCRE_STARTLINE 0x0100 /* start after \n for multiline */ -#define PCRE_NOPARTIAL 0x0200 /* can't use partial with this regex */ -#define PCRE_JCHANGED 0x0400 /* j option used in regex */ -#define PCRE_HASCRORLF 0x0800 /* explicit \r or \n in pattern */ -#define PCRE_HASTHEN 0x1000 /* pattern contains (*THEN) */ +#define PCRE_MODE8 0x00000001 /* compiled in 8 bit mode */ +#define PCRE_MODE16 0x00000002 /* compiled in 16 bit mode */ +#define PCRE_MODE32 0x00000004 /* compiled in 32 bit mode */ +#define PCRE_FIRSTSET 0x00000010 /* first_char is set */ +#define PCRE_FCH_CASELESS 0x00000020 /* caseless first char */ +#define PCRE_REQCHSET 0x00000040 /* req_byte is set */ +#define PCRE_RCH_CASELESS 0x00000080 /* caseless requested char */ +#define PCRE_STARTLINE 0x00000100 /* start after \n for multiline */ +#define PCRE_NOPARTIAL 0x00000200 /* can't use partial with this regex */ +#define PCRE_JCHANGED 0x00000400 /* j option used in regex */ +#define PCRE_HASCRORLF 0x00000800 /* explicit \r or \n in pattern */ +#define PCRE_HASTHEN 0x00001000 /* pattern contains (*THEN) */ +#define PCRE_MLSET 0x00002000 /* match limit set by regex */ +#define PCRE_RLSET 0x00004000 /* recursion limit set by regex */ +#define PCRE_MATCH_EMPTY 0x00008000 /* pattern can match empty string */ #if defined COMPILE_PCRE8 #define PCRE_MODE PCRE_MODE8 @@ -1164,9 +1174,10 @@ time, run time, or study time, respectively. */ #define PUBLIC_COMPILE_OPTIONS \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ - PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \ + PCRE_NO_AUTO_CAPTURE|PCRE_NO_AUTO_POSSESS| \ + PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \ PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ - PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE) + PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE|PCRE_NEVER_UTF) #define PUBLIC_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ @@ -1522,20 +1533,25 @@ a positive value. */ #define STRING_xdigit "xdigit" #define STRING_DEFINE "DEFINE" - -#define STRING_CR_RIGHTPAR "CR)" -#define STRING_LF_RIGHTPAR "LF)" -#define STRING_CRLF_RIGHTPAR "CRLF)" -#define STRING_ANY_RIGHTPAR "ANY)" -#define STRING_ANYCRLF_RIGHTPAR "ANYCRLF)" -#define STRING_BSR_ANYCRLF_RIGHTPAR "BSR_ANYCRLF)" -#define STRING_BSR_UNICODE_RIGHTPAR "BSR_UNICODE)" -#define STRING_UTF8_RIGHTPAR "UTF8)" -#define STRING_UTF16_RIGHTPAR "UTF16)" -#define STRING_UTF32_RIGHTPAR "UTF32)" -#define STRING_UTF_RIGHTPAR "UTF)" -#define STRING_UCP_RIGHTPAR "UCP)" -#define STRING_NO_START_OPT_RIGHTPAR "NO_START_OPT)" +#define STRING_WEIRD_STARTWORD "[:<:]]" +#define STRING_WEIRD_ENDWORD "[:>:]]" + +#define STRING_CR_RIGHTPAR "CR)" +#define STRING_LF_RIGHTPAR "LF)" +#define STRING_CRLF_RIGHTPAR "CRLF)" +#define STRING_ANY_RIGHTPAR "ANY)" +#define STRING_ANYCRLF_RIGHTPAR "ANYCRLF)" +#define STRING_BSR_ANYCRLF_RIGHTPAR "BSR_ANYCRLF)" +#define STRING_BSR_UNICODE_RIGHTPAR "BSR_UNICODE)" +#define STRING_UTF8_RIGHTPAR "UTF8)" +#define STRING_UTF16_RIGHTPAR "UTF16)" +#define STRING_UTF32_RIGHTPAR "UTF32)" +#define STRING_UTF_RIGHTPAR "UTF)" +#define STRING_UCP_RIGHTPAR "UCP)" +#define STRING_NO_AUTO_POSSESS_RIGHTPAR "NO_AUTO_POSSESS)" +#define STRING_NO_START_OPT_RIGHTPAR "NO_START_OPT)" +#define STRING_LIMIT_MATCH_EQ "LIMIT_MATCH=" +#define STRING_LIMIT_RECURSION_EQ "LIMIT_RECURSION=" #else /* SUPPORT_UTF */ @@ -1783,20 +1799,25 @@ only. */ #define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t #define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E - -#define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS -#define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS -#define STRING_CRLF_RIGHTPAR STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS -#define STRING_ANY_RIGHTPAR STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS -#define STRING_ANYCRLF_RIGHTPAR STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS -#define STRING_BSR_ANYCRLF_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS -#define STRING_BSR_UNICODE_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS -#define STRING_UTF8_RIGHTPAR STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS -#define STRING_UTF16_RIGHTPAR STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS -#define STRING_UTF32_RIGHTPAR STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS -#define STRING_UTF_RIGHTPAR STR_U STR_T STR_F STR_RIGHT_PARENTHESIS -#define STRING_UCP_RIGHTPAR STR_U STR_C STR_P STR_RIGHT_PARENTHESIS -#define STRING_NO_START_OPT_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS +#define STRING_WEIRD_STARTWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET +#define STRING_WEIRD_ENDWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET + +#define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS +#define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_CRLF_RIGHTPAR STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_ANY_RIGHTPAR STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS +#define STRING_ANYCRLF_RIGHTPAR STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_ANYCRLF_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_UNICODE_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS +#define STRING_UTF8_RIGHTPAR STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS +#define STRING_UTF16_RIGHTPAR STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS +#define STRING_UTF32_RIGHTPAR STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS +#define STRING_UTF_RIGHTPAR STR_U STR_T STR_F STR_RIGHT_PARENTHESIS +#define STRING_UCP_RIGHTPAR STR_U STR_C STR_P STR_RIGHT_PARENTHESIS +#define STRING_NO_AUTO_POSSESS_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS +#define STRING_NO_START_OPT_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS +#define STRING_LIMIT_MATCH_EQ STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN +#define STRING_LIMIT_RECURSION_EQ STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN #endif /* SUPPORT_UTF */ @@ -1837,6 +1858,18 @@ only. */ #define PT_PXSPACE 7 /* POSIX space - Z plus 9,10,11,12,13 */ #define PT_WORD 8 /* Word - L plus N plus underscore */ #define PT_CLIST 9 /* Pseudo-property: match character list */ +#define PT_UCNC 10 /* Universal Character nameable character */ +#define PT_TABSIZE 11 /* Size of square table for autopossessify tests */ + +/* The following special properties are used only in XCLASS items, when POSIX +classes are specified and PCRE_UCP is set - in other words, for Unicode +handling of these classes. They are not available via the \p or \P escapes like +those in the above list, and so they do not take part in the autopossessifying +table. */ + +#define PT_PXGRAPH 11 /* [:graph:] - characters that mark the paper */ +#define PT_PXPRINT 12 /* [:print:] - [:graph:] plus non-control spaces */ +#define PT_PXPUNCT 13 /* [:punct:] - punctuation characters */ /* Flag bits and data types for the extended class (OP_XCLASS) for classes that contain characters with values greater than 255. */ @@ -1851,9 +1884,9 @@ contain characters with values greater than 255. */ #define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */ /* These are escaped items that aren't just an encoding of a particular data -value such as \n. They must have non-zero values, as check_escape() returns -0 for a data character. Also, they must appear in the same order as in the opcode -definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it +value such as \n. They must have non-zero values, as check_escape() returns 0 +for a data character. Also, they must appear in the same order as in the +opcode definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it corresponds to "." in DOTALL mode rather than an escape sequence. It is also used for [^] in JavaScript compatibility mode, and for \C in non-utf mode. In non-DOTALL mode, "." behaves like \N. @@ -1876,12 +1909,31 @@ enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_E, ESC_Q, ESC_g, ESC_k, ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu }; -/* Opcode table: Starting from 1 (i.e. after OP_END), the values up to -OP_EOD must correspond in order to the list of escapes immediately above. -*** NOTE NOTE NOTE *** Whenever this list is updated, the two macro definitions -that follow must also be updated to match. There are also tables called -"coptable" and "poptable" in pcre_dfa_exec.c that must be updated. */ +/********************** Opcode definitions ******************/ + +/****** NOTE NOTE NOTE ****** + +Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in +order to the list of escapes immediately above. Furthermore, values up to +OP_DOLLM must not be changed without adjusting the table called autoposstab in +pcre_compile.c + +Whenever this list is updated, the two macro definitions that follow must be +updated to match. The possessification table called "opcode_possessify" in +pcre_compile.c must also be updated, and also the tables called "coptable" +and "poptable" in pcre_dfa_exec.c. + +****** NOTE NOTE NOTE ******/ + + +/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive, +are used in a table for deciding whether a repeated character type can be +auto-possessified. */ + +#define FIRST_AUTOTAB_OP OP_NOT_DIGIT +#define LAST_AUTOTAB_LEFT_OP OP_EXTUNI +#define LAST_AUTOTAB_RIGHT_OP OP_DOLLM enum { OP_END, /* 0 End of pattern */ @@ -1914,10 +1966,15 @@ enum { OP_EODN, /* 23 End of data or \n at end of data (\Z) */ OP_EOD, /* 24 End of data (\z) */ - OP_CIRC, /* 25 Start of line - not multiline */ - OP_CIRCM, /* 26 Start of line - multiline */ - OP_DOLL, /* 27 End of line - not multiline */ - OP_DOLLM, /* 28 End of line - multiline */ + /* Line end assertions */ + + OP_DOLL, /* 25 End of line - not multiline */ + OP_DOLLM, /* 26 End of line - multiline */ + OP_CIRC, /* 27 Start of line - not multiline */ + OP_CIRCM, /* 28 Start of line - multiline */ + + /* Single characters; caseful must precede the caseless ones */ + OP_CHAR, /* 29 Match one character, casefully */ OP_CHARI, /* 30 Match one character, caselessly */ OP_NOT, /* 31 Match one character, not the given one, casefully */ @@ -1926,7 +1983,7 @@ enum { /* The following sets of 13 opcodes must always be kept in step because the offset from the first one is used to generate the others. */ - /**** Single characters, caseful, must precede the caseless ones ****/ + /* Repeated characters; caseful must precede the caseless ones */ OP_STAR, /* 33 The maximizing and minimizing versions of */ OP_MINSTAR, /* 34 these six opcodes must come in pairs, with */ @@ -1944,7 +2001,7 @@ enum { OP_POSQUERY, /* 44 Posesssified query, caseful */ OP_POSUPTO, /* 45 Possessified upto, caseful */ - /**** Single characters, caseless, must follow the caseful ones */ + /* Repeated characters; caseless must follow the caseful ones */ OP_STARI, /* 46 */ OP_MINSTARI, /* 47 */ @@ -1962,8 +2019,8 @@ enum { OP_POSQUERYI, /* 57 Posesssified query, caseless */ OP_POSUPTOI, /* 58 Possessified upto, caseless */ - /**** The negated ones must follow the non-negated ones, and match them ****/ - /**** Negated single character, caseful; must precede the caseless ones ****/ + /* The negated ones must follow the non-negated ones, and match them */ + /* Negated repeated character, caseful; must precede the caseless ones */ OP_NOTSTAR, /* 59 The maximizing and minimizing versions of */ OP_NOTMINSTAR, /* 60 these six opcodes must come in pairs, with */ @@ -1981,7 +2038,7 @@ enum { OP_NOTPOSQUERY, /* 70 */ OP_NOTPOSUPTO, /* 71 */ - /**** Negated single character, caseless; must follow the caseful ones ****/ + /* Negated repeated character, caseless; must follow the caseful ones */ OP_NOTSTARI, /* 72 */ OP_NOTMINSTARI, /* 73 */ @@ -1999,7 +2056,7 @@ enum { OP_NOTPOSQUERYI, /* 83 */ OP_NOTPOSUPTOI, /* 84 */ - /**** Character types ****/ + /* Character types */ OP_TYPESTAR, /* 85 The maximizing and minimizing versions of */ OP_TYPEMINSTAR, /* 86 these six opcodes must come in pairs, with */ @@ -2030,89 +2087,96 @@ enum { OP_CRRANGE, /* 104 These are different to the three sets above. */ OP_CRMINRANGE, /* 105 */ + OP_CRPOSSTAR, /* 106 Possessified versions */ + OP_CRPOSPLUS, /* 107 */ + OP_CRPOSQUERY, /* 108 */ + OP_CRPOSRANGE, /* 109 */ + /* End of quantifier opcodes */ - OP_CLASS, /* 106 Match a character class, chars < 256 only */ - OP_NCLASS, /* 107 Same, but the bitmap was created from a negative + OP_CLASS, /* 110 Match a character class, chars < 256 only */ + OP_NCLASS, /* 111 Same, but the bitmap was created from a negative class - the difference is relevant only when a character > 255 is encountered. */ - OP_XCLASS, /* 108 Extended class for handling > 255 chars within the + OP_XCLASS, /* 112 Extended class for handling > 255 chars within the class. This does both positive and negative. */ - OP_REF, /* 109 Match a back reference, casefully */ - OP_REFI, /* 110 Match a back reference, caselessly */ - OP_RECURSE, /* 111 Match a numbered subpattern (possibly recursive) */ - OP_CALLOUT, /* 112 Call out to external function if provided */ - - OP_ALT, /* 113 Start of alternation */ - OP_KET, /* 114 End of group that doesn't have an unbounded repeat */ - OP_KETRMAX, /* 115 These two must remain together and in this */ - OP_KETRMIN, /* 116 order. They are for groups the repeat for ever. */ - OP_KETRPOS, /* 117 Possessive unlimited repeat. */ + OP_REF, /* 113 Match a back reference, casefully */ + OP_REFI, /* 114 Match a back reference, caselessly */ + OP_DNREF, /* 115 Match a duplicate name backref, casefully */ + OP_DNREFI, /* 116 Match a duplicate name backref, caselessly */ + OP_RECURSE, /* 117 Match a numbered subpattern (possibly recursive) */ + OP_CALLOUT, /* 118 Call out to external function if provided */ + + OP_ALT, /* 119 Start of alternation */ + OP_KET, /* 120 End of group that doesn't have an unbounded repeat */ + OP_KETRMAX, /* 121 These two must remain together and in this */ + OP_KETRMIN, /* 122 order. They are for groups the repeat for ever. */ + OP_KETRPOS, /* 123 Possessive unlimited repeat. */ /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four asserts must remain in order. */ - OP_REVERSE, /* 118 Move pointer back - used in lookbehind assertions */ - OP_ASSERT, /* 119 Positive lookahead */ - OP_ASSERT_NOT, /* 120 Negative lookahead */ - OP_ASSERTBACK, /* 121 Positive lookbehind */ - OP_ASSERTBACK_NOT, /* 122 Negative lookbehind */ + OP_REVERSE, /* 124 Move pointer back - used in lookbehind assertions */ + OP_ASSERT, /* 125 Positive lookahead */ + OP_ASSERT_NOT, /* 126 Negative lookahead */ + OP_ASSERTBACK, /* 127 Positive lookbehind */ + OP_ASSERTBACK_NOT, /* 128 Negative lookbehind */ /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately after the assertions, with ONCE first, as there's a test for >= ONCE for a subpattern that isn't an assertion. The POS versions must immediately follow the non-POS versions in each case. */ - OP_ONCE, /* 123 Atomic group, contains captures */ - OP_ONCE_NC, /* 124 Atomic group containing no captures */ - OP_BRA, /* 125 Start of non-capturing bracket */ - OP_BRAPOS, /* 126 Ditto, with unlimited, possessive repeat */ - OP_CBRA, /* 127 Start of capturing bracket */ - OP_CBRAPOS, /* 128 Ditto, with unlimited, possessive repeat */ - OP_COND, /* 129 Conditional group */ + OP_ONCE, /* 129 Atomic group, contains captures */ + OP_ONCE_NC, /* 130 Atomic group containing no captures */ + OP_BRA, /* 131 Start of non-capturing bracket */ + OP_BRAPOS, /* 132 Ditto, with unlimited, possessive repeat */ + OP_CBRA, /* 133 Start of capturing bracket */ + OP_CBRAPOS, /* 134 Ditto, with unlimited, possessive repeat */ + OP_COND, /* 135 Conditional group */ /* These five must follow the previous five, in the same order. There's a check for >= SBRA to distinguish the two sets. */ - OP_SBRA, /* 130 Start of non-capturing bracket, check empty */ - OP_SBRAPOS, /* 131 Ditto, with unlimited, possessive repeat */ - OP_SCBRA, /* 132 Start of capturing bracket, check empty */ - OP_SCBRAPOS, /* 133 Ditto, with unlimited, possessive repeat */ - OP_SCOND, /* 134 Conditional group, check empty */ + OP_SBRA, /* 136 Start of non-capturing bracket, check empty */ + OP_SBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */ + OP_SCBRA, /* 138 Start of capturing bracket, check empty */ + OP_SCBRAPOS, /* 139 Ditto, with unlimited, possessive repeat */ + OP_SCOND, /* 140 Conditional group, check empty */ /* The next two pairs must (respectively) be kept together. */ - OP_CREF, /* 135 Used to hold a capture number as condition */ - OP_NCREF, /* 136 Same, but generated by a name reference*/ - OP_RREF, /* 137 Used to hold a recursion number as condition */ - OP_NRREF, /* 138 Same, but generated by a name reference*/ - OP_DEF, /* 139 The DEFINE condition */ + OP_CREF, /* 141 Used to hold a capture number as condition */ + OP_DNCREF, /* 142 Used to point to duplicate names as a condition */ + OP_RREF, /* 143 Used to hold a recursion number as condition */ + OP_DNRREF, /* 144 Used to point to duplicate names as a condition */ + OP_DEF, /* 145 The DEFINE condition */ - OP_BRAZERO, /* 140 These two must remain together and in this */ - OP_BRAMINZERO, /* 141 order. */ - OP_BRAPOSZERO, /* 142 */ + OP_BRAZERO, /* 146 These two must remain together and in this */ + OP_BRAMINZERO, /* 147 order. */ + OP_BRAPOSZERO, /* 148 */ /* These are backtracking control verbs */ - OP_MARK, /* 143 always has an argument */ - OP_PRUNE, /* 144 */ - OP_PRUNE_ARG, /* 145 same, but with argument */ - OP_SKIP, /* 146 */ - OP_SKIP_ARG, /* 147 same, but with argument */ - OP_THEN, /* 148 */ - OP_THEN_ARG, /* 149 same, but with argument */ - OP_COMMIT, /* 150 */ + OP_MARK, /* 149 always has an argument */ + OP_PRUNE, /* 150 */ + OP_PRUNE_ARG, /* 151 same, but with argument */ + OP_SKIP, /* 152 */ + OP_SKIP_ARG, /* 153 same, but with argument */ + OP_THEN, /* 154 */ + OP_THEN_ARG, /* 155 same, but with argument */ + OP_COMMIT, /* 156 */ /* These are forced failure and success verbs */ - OP_FAIL, /* 151 */ - OP_ACCEPT, /* 152 */ - OP_ASSERT_ACCEPT, /* 153 Used inside assertions */ - OP_CLOSE, /* 154 Used before OP_ACCEPT to close open captures */ + OP_FAIL, /* 157 */ + OP_ACCEPT, /* 158 */ + OP_ASSERT_ACCEPT, /* 159 Used inside assertions */ + OP_CLOSE, /* 160 Used before OP_ACCEPT to close open captures */ /* This is used to skip a subpattern with a {0} quantifier */ - OP_SKIPZERO, /* 155 */ + OP_SKIPZERO, /* 161 */ /* This is not an opcode, but is used to check that tables indexed by opcode are the correct length, in order to catch updating errors - there have been @@ -2123,7 +2187,8 @@ enum { /* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro definitions that follow must also be updated to match. There are also tables -called "coptable" and "poptable" in pcre_dfa_exec.c that must be updated. */ +called "opcode_possessify" in pcre_compile.c and "coptable" and "poptable" in +pcre_dfa_exec.c that must be updated. */ /* This macro defines textual names for all the opcodes. These are used only @@ -2136,7 +2201,7 @@ some cases doesn't actually use these names at all). */ "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte", \ "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v", \ "extuni", "\\Z", "\\z", \ - "^", "^", "$", "$", "char", "chari", "not", "noti", \ + "$", "$", "^", "^", "char", "chari", "not", "noti", \ "*", "*?", "+", "+?", "?", "??", \ "{", "{", "{", \ "*+","++", "?+", "{", \ @@ -2152,7 +2217,8 @@ some cases doesn't actually use these names at all). */ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*+","++", "?+", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", \ - "class", "nclass", "xclass", "Ref", "Refi", \ + "*+","++", "?+", "{", \ + "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi", \ "Recurse", "Callout", \ "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \ "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \ @@ -2161,7 +2227,7 @@ some cases doesn't actually use these names at all). */ "Cond", \ "SBra", "SBraPos", "SCBra", "SCBraPos", \ "SCond", \ - "Cond ref", "Cond nref", "Cond rec", "Cond nrec", "Cond def", \ + "Cond ref", "Cond dnref", "Cond rec", "Cond dnrec", "Cond def", \ "Brazero", "Braminzero", "Braposzero", \ "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP", \ "*THEN", "*THEN", "*COMMIT", "*FAIL", \ @@ -2186,7 +2252,7 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 3, 3, /* \P, \p */ \ 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ \ 1, /* \X */ \ - 1, 1, 1, 1, 1, 1, /* \Z, \z, ^, ^M, $, $M */ \ + 1, 1, 1, 1, 1, 1, /* \Z, \z, $, $M ^, ^M */ \ 2, /* Char - the minimum length */ \ 2, /* Chari - the minimum length */ \ 2, /* not */ \ @@ -2217,11 +2283,14 @@ in UTF-8 mode. The code that uses this table must know about such things. */ /* Character class & ref repeats */ \ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ 1+2*IMM2_SIZE, 1+2*IMM2_SIZE, /* CRRANGE, CRMINRANGE */ \ + 1, 1, 1, 1+2*IMM2_SIZE, /* Possessive *+, ++, ?+, CRPOSRANGE */ \ 1+(32/sizeof(pcre_uchar)), /* CLASS */ \ 1+(32/sizeof(pcre_uchar)), /* NCLASS */ \ 0, /* XCLASS - variable length */ \ 1+IMM2_SIZE, /* REF */ \ 1+IMM2_SIZE, /* REFI */ \ + 1+2*IMM2_SIZE, /* DNREF */ \ + 1+2*IMM2_SIZE, /* DNREFI */ \ 1+LINK_SIZE, /* RECURSE */ \ 2+2*LINK_SIZE, /* CALLOUT */ \ 1+LINK_SIZE, /* Alt */ \ @@ -2246,8 +2315,8 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 1+LINK_SIZE+IMM2_SIZE, /* SCBRA */ \ 1+LINK_SIZE+IMM2_SIZE, /* SCBRAPOS */ \ 1+LINK_SIZE, /* SCOND */ \ - 1+IMM2_SIZE, 1+IMM2_SIZE, /* CREF, NCREF */ \ - 1+IMM2_SIZE, 1+IMM2_SIZE, /* RREF, NRREF */ \ + 1+IMM2_SIZE, 1+2*IMM2_SIZE, /* CREF, DNCREF */ \ + 1+IMM2_SIZE, 1+2*IMM2_SIZE, /* RREF, DNRREF */ \ 1, /* DEF */ \ 1, 1, 1, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ \ 3, 1, 3, /* MARK, PRUNE, PRUNE_ARG */ \ @@ -2256,8 +2325,7 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 1, 1, 1, 1, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ \ 1+IMM2_SIZE, 1 /* CLOSE, SKIPZERO */ -/* A magic value for OP_RREF and OP_NRREF to indicate the "any recursion" -condition. */ +/* A magic value for OP_RREF to indicate the "any recursion" condition. */ #define RREF_ANY 0xffff @@ -2272,9 +2340,11 @@ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49, ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, - ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERRCOUNT }; + ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, + ERR80, ERR81, ERR82, ERR83, ERR84, ERRCOUNT }; /* JIT compiling modes. The function list is indexed by them. */ + enum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE, JIT_NUMBER_OF_COMPILE_MODES }; @@ -2282,48 +2352,49 @@ enum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE, code vector run on as long as necessary after the end. We store an explicit offset to the name table so that if a regex is compiled on one host, saved, and then run on another where the size of pointers is different, all might still -be well. For the case of compiled-on-4 and run-on-8, we include an extra -pointer that is always NULL. For future-proofing, a few dummy fields were -originally included - even though you can never get this planning right - but -there is only one left now. - -NOTE NOTE NOTE: -Because people can now save and re-use compiled patterns, any additions to this -structure should be made at the end, and something earlier (e.g. a new -flag in the options or one of the dummy fields) should indicate that the new -fields are present. Currently PCRE always sets the dummy fields to zero. -NOTE NOTE NOTE +be well. + +The size of the structure must be a multiple of 8 bytes. For the case of +compiled-on-4 and run-on-8, we include an extra pointer that is always NULL so +that there are an even number of pointers which therefore are a multiple of 8 +bytes. + +It is necessary to fork the struct for the 32 bit library, since it needs to +use pcre_uint32 for first_char and req_char. We can't put an ifdef inside the +typedef because pcretest needs access to the struct of the 8-, 16- and 32-bit +variants. + +*** WARNING *** +When new fields are added to these structures, remember to adjust the code in +pcre_byte_order.c that is concerned with swapping the byte order of the fields +when a compiled regex is reloaded on a host with different endianness. +*** WARNING *** +There is also similar byte-flipping code in pcretest.c, which is used for +testing the byte-flipping features. It must also be kept in step. +*** WARNING *** */ -#if defined COMPILE_PCRE8 -#define REAL_PCRE real_pcre -#elif defined COMPILE_PCRE16 -#define REAL_PCRE real_pcre16 -#elif defined COMPILE_PCRE32 -#define REAL_PCRE real_pcre32 -#endif - -/* It is necessary to fork the struct for 32 bit, since it needs to use - * pcre_uchar for first_char and req_char. Can't put an ifdef inside the - * typedef since pcretest needs access to the struct of the 8-, 16- - * and 32-bit variants. */ - typedef struct real_pcre8_or_16 { pcre_uint32 magic_number; pcre_uint32 size; /* Total that was malloced */ pcre_uint32 options; /* Public options */ - pcre_uint16 flags; /* Private flags */ + pcre_uint32 flags; /* Private flags */ + pcre_uint32 limit_match; /* Limit set from regex */ + pcre_uint32 limit_recursion; /* Limit set from regex */ + pcre_uint16 first_char; /* Starting character */ + pcre_uint16 req_char; /* This character must be seen */ pcre_uint16 max_lookbehind; /* Longest lookbehind (characters) */ pcre_uint16 top_bracket; /* Highest numbered group */ pcre_uint16 top_backref; /* Highest numbered back reference */ - pcre_uint16 first_char; /* Starting character */ - pcre_uint16 req_char; /* This character must be seen */ pcre_uint16 name_table_offset; /* Offset to name table that follows */ pcre_uint16 name_entry_size; /* Size of any name items */ pcre_uint16 name_count; /* Number of name items */ pcre_uint16 ref_count; /* Reference count */ + pcre_uint16 dummy1; /* To ensure size is a multiple of 8 */ + pcre_uint16 dummy2; /* To ensure size is a multiple of 8 */ + pcre_uint16 dummy3; /* To ensure size is a multiple of 8 */ const pcre_uint8 *tables; /* Pointer to tables or NULL for std */ - const pcre_uint8 *nullpad; /* NULL padding */ + void *nullpad; /* NULL padding */ } real_pcre8_or_16; typedef struct real_pcre8_or_16 real_pcre; @@ -2333,22 +2404,31 @@ typedef struct real_pcre32 { pcre_uint32 magic_number; pcre_uint32 size; /* Total that was malloced */ pcre_uint32 options; /* Public options */ - pcre_uint16 flags; /* Private flags */ + pcre_uint32 flags; /* Private flags */ + pcre_uint32 limit_match; /* Limit set from regex */ + pcre_uint32 limit_recursion; /* Limit set from regex */ + pcre_uint32 first_char; /* Starting character */ + pcre_uint32 req_char; /* This character must be seen */ pcre_uint16 max_lookbehind; /* Longest lookbehind (characters) */ pcre_uint16 top_bracket; /* Highest numbered group */ pcre_uint16 top_backref; /* Highest numbered back reference */ - pcre_uint32 first_char; /* Starting character */ - pcre_uint32 req_char; /* This character must be seen */ pcre_uint16 name_table_offset; /* Offset to name table that follows */ pcre_uint16 name_entry_size; /* Size of any name items */ pcre_uint16 name_count; /* Number of name items */ pcre_uint16 ref_count; /* Reference count */ - pcre_uint16 dummy1; /* for later expansion */ - pcre_uint16 dummy2; /* for later expansion */ + pcre_uint16 dummy; /* To ensure size is a multiple of 8 */ const pcre_uint8 *tables; /* Pointer to tables or NULL for std */ - void *nullpad; /* for later expansion */ + void *nullpad; /* NULL padding */ } real_pcre32; +#if defined COMPILE_PCRE8 +#define REAL_PCRE real_pcre +#elif defined COMPILE_PCRE16 +#define REAL_PCRE real_pcre16 +#elif defined COMPILE_PCRE32 +#define REAL_PCRE real_pcre32 +#endif + /* Assert that the size of REAL_PCRE is divisible by 8 */ typedef int __assert_real_pcre_size_divisible_8[(sizeof(REAL_PCRE) % 8) == 0 ? 1 : -1]; @@ -2382,6 +2462,15 @@ typedef struct open_capitem { pcre_uint16 flag; /* Set TRUE if recursive back ref */ } open_capitem; +/* Structure for building a list of named groups during the first pass of +compiling. */ + +typedef struct named_group { + const pcre_uchar *name; /* Points to the name in the pattern */ + int length; /* Length of the name */ + pcre_uint32 number; /* Group number */ +} named_group; + /* Structure for passing "static" information around between the functions doing the compiling, so that they are thread-safe. */ @@ -2394,24 +2483,29 @@ typedef struct compile_data { const pcre_uchar *start_code; /* The start of the compiled code */ const pcre_uchar *start_pattern; /* The start of the pattern */ const pcre_uchar *end_pattern; /* The end of the pattern */ - open_capitem *open_caps; /* Chain of open capture items */ pcre_uchar *hwm; /* High watermark of workspace */ + open_capitem *open_caps; /* Chain of open capture items */ + named_group *named_groups; /* Points to vector in pre-compile */ pcre_uchar *name_table; /* The name/number table */ int names_found; /* Number of entries so far */ int name_entry_size; /* Size of each entry */ + int named_group_list_size; /* Number of entries in the list */ int workspace_size; /* Size of workspace */ - unsigned int bracount; /* Count of capturing parens as we compile */ + unsigned int bracount; /* Count of capturing parens as we compile */ int final_bracount; /* Saved value after first pass */ int max_lookbehind; /* Maximum lookbehind (characters) */ int top_backref; /* Maximum back reference */ unsigned int backref_map; /* Bitmap of low back refs */ + unsigned int namedrefcount; /* Number of backreferences by name */ + int parens_depth; /* Depth of nested parentheses */ int assert_depth; /* Depth of nested assertions */ - int external_options; /* External (initial) options */ - int external_flags; /* External flag bits to be set */ + pcre_uint32 external_options; /* External (initial) options */ + pcre_uint32 external_flags; /* External flag bits to be set */ int req_varyopt; /* "After variable item" flag for reqbyte */ BOOL had_accept; /* (*ACCEPT) encountered */ BOOL had_pruneorskip; /* (*PRUNE) or (*SKIP) encountered */ BOOL check_lookbehind; /* Lookbehinds need later checking */ + BOOL dupnames; /* Duplicate names exist */ int nltype; /* Newline type */ int nllen; /* Newline string length */ pcre_uchar nl[4]; /* Newline string when fixed length */ @@ -2433,6 +2527,7 @@ typedef struct recursion_info { unsigned int group_num; /* Number of group that was called */ int *offset_save; /* Pointer to start of saved offsets */ int saved_max; /* Number of saved offsets */ + int saved_capture_last; /* Last capture number */ PCRE_PUCHAR subject_position; /* Position at start of recursion */ } recursion_info; @@ -2469,12 +2564,13 @@ typedef struct match_data { int nllen; /* Newline string length */ int name_count; /* Number of names in name table */ int name_entry_size; /* Size of entry in names table */ + unsigned int skip_arg_count; /* For counting SKIP_ARGs */ + unsigned int ignore_skip_arg; /* For re-run when SKIP arg name not found */ pcre_uchar *name_table; /* Table of names */ pcre_uchar nl[4]; /* Newline string when fixed */ const pcre_uint8 *lcc; /* Points to lower casing table */ const pcre_uint8 *fcc; /* Points to case-flipping table */ const pcre_uint8 *ctypes; /* Points to table of type maps */ - BOOL offset_overflow; /* Set if too many extractions */ BOOL notbol; /* NOTBOL flag */ BOOL noteol; /* NOTEOL flag */ BOOL utf; /* UTF-8 / UTF-16 flag */ @@ -2486,7 +2582,6 @@ typedef struct match_data { BOOL hitend; /* Hit the end of the subject at some point */ BOOL bsr_anycrlf; /* \R is just any CRLF, not full Unicode */ BOOL hasthen; /* Pattern contains (*THEN) */ - BOOL ignore_skip_arg; /* For re-run when SKIP name not found */ const pcre_uchar *start_code; /* For use when recursing */ PCRE_PUCHAR start_subject; /* Start of the subject string */ PCRE_PUCHAR end_subject; /* End of the subject string */ @@ -2495,7 +2590,7 @@ typedef struct match_data { PCRE_PUCHAR start_used_ptr; /* Earliest consulted character */ int partial; /* PARTIAL options */ int end_offset_top; /* Highwater mark at end of match */ - int capture_last; /* Most recent capture number */ + pcre_int32 capture_last; /* Most recent capture number + overflow flag */ int start_offset; /* The start offset value */ int match_function_type; /* Set for certain special calls of MATCH() */ eptrblock *eptrchain; /* Chain of eptrblocks for tail recursions */ diff --git a/ext/pcre/pcrelib/pcre_maketables.c b/ext/pcre/pcrelib/pcre_maketables.c index 610a66958..a44a6eaa9 100644 --- a/ext/pcre/pcrelib/pcre_maketables.c +++ b/ext/pcre/pcrelib/pcre_maketables.c @@ -98,13 +98,17 @@ for (i = 0; i < 256; i++) *p++ = tolower(i); for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); /* Then the character class tables. Don't try to be clever and save effort on -exclusive ones - in some locales things may be different. Note that the table -for "space" includes everything "isspace" gives, including VT in the default -locale. This makes it work for the POSIX class [:space:]. Note also that it is -possible for a character to be alnum or alpha without being lower or upper, -such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at -least under Debian Linux's locales as of 12/2005). So we must test for alnum -specially. */ +exclusive ones - in some locales things may be different. + +Note that the table for "space" includes everything "isspace" gives, including +VT in the default locale. This makes it work for the POSIX class [:space:]. +From release 8.34 is is also correct for Perl space, because Perl added VT at +release 5.18. + +Note also that it is possible for a character to be alnum or alpha without +being lower or upper, such as "male and female ordinals" (\xAA and \xBA) in the +fr_FR locale (at least under Debian Linux's locales as of 12/2005). So we must +test for alnum specially. */ memset(p, 0, cbit_length); for (i = 0; i < 256; i++) @@ -123,14 +127,15 @@ for (i = 0; i < 256; i++) } p += cbit_length; -/* Finally, the character type table. In this, we exclude VT from the white -space chars, because Perl doesn't recognize it as such for \s and for comments -within regexes. */ +/* Finally, the character type table. In this, we used to exclude VT from the +white space chars, because Perl didn't recognize it as such for \s and for +comments within regexes. However, Perl changed at release 5.18, so PCRE changed +at release 8.34. */ for (i = 0; i < 256; i++) { int x = 0; - if (i != CHAR_VT && isspace(i)) x += ctype_space; + if (isspace(i)) x += ctype_space; if (isalpha(i)) x += ctype_letter; if (isdigit(i)) x += ctype_digit; if (isxdigit(i)) x += ctype_xdigit; diff --git a/ext/pcre/pcrelib/pcre_study.c b/ext/pcre/pcrelib/pcre_study.c index 12d2a6681..c2aff517a 100644 --- a/ext/pcre/pcrelib/pcre_study.c +++ b/ext/pcre/pcrelib/pcre_study.c @@ -66,8 +66,9 @@ string of that length that matches. In UTF8 mode, the result is in characters rather than bytes. Arguments: + re compiled pattern block code pointer to start of group (the bracket) - startcode pointer to start of the whole pattern + startcode pointer to start of the whole pattern's code options the compiling options int RECURSE depth @@ -78,8 +79,8 @@ Returns: the minimum length */ static int -find_minlength(const pcre_uchar *code, const pcre_uchar *startcode, int options, - int recurse_depth) +find_minlength(const REAL_PCRE *re, const pcre_uchar *code, + const pcre_uchar *startcode, int options, int recurse_depth) { int length = -1; /* PCRE_UTF16 has the same value as PCRE_UTF8. */ @@ -129,7 +130,7 @@ for (;;) case OP_SBRAPOS: case OP_ONCE: case OP_ONCE_NC: - d = find_minlength(cc, startcode, options, recurse_depth); + d = find_minlength(re, cc, startcode, options, recurse_depth); if (d < 0) return d; branchlength += d; do cc += GET(cc, 1); while (*cc == OP_ALT); @@ -175,9 +176,9 @@ for (;;) case OP_REVERSE: case OP_CREF: - case OP_NCREF: + case OP_DNCREF: case OP_RREF: - case OP_NRREF: + case OP_DNRREF: case OP_DEF: case OP_CALLOUT: case OP_SOD: @@ -341,6 +342,7 @@ for (;;) { case OP_CRPLUS: case OP_CRMINPLUS: + case OP_CRPOSPLUS: branchlength++; /* Fall through */ @@ -348,11 +350,14 @@ for (;;) case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: cc++; break; case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: branchlength += GET2(cc,1); cc += 1 + 2 * IMM2_SIZE; break; @@ -375,7 +380,38 @@ for (;;) matches an empty string (by default it causes a matching failure), so in that case we must set the minimum length to zero. */ - case OP_REF: + case OP_DNREF: /* Duplicate named pattern back reference */ + case OP_DNREFI: + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) + { + int count = GET2(cc, 1+IMM2_SIZE); + pcre_uchar *slot = (pcre_uchar *)re + + re->name_table_offset + GET2(cc, 1) * re->name_entry_size; + d = INT_MAX; + while (count-- > 0) + { + ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0)); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) + { + d = 0; + had_recurse = TRUE; + break; + } + else + { + int dd = find_minlength(re, cs, startcode, options, recurse_depth); + if (dd < d) d = dd; + } + slot += re->name_entry_size; + } + } + else d = 0; + cc += 1 + 2*IMM2_SIZE; + goto REPEAT_BACK_REFERENCE; + + case OP_REF: /* Single back reference */ case OP_REFI: if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) { @@ -389,7 +425,7 @@ for (;;) } else { - d = find_minlength(cs, startcode, options, recurse_depth); + d = find_minlength(re, cs, startcode, options, recurse_depth); } } else d = 0; @@ -397,24 +433,29 @@ for (;;) /* Handle repeated back references */ + REPEAT_BACK_REFERENCE: switch (*cc) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: min = 0; cc++; break; case OP_CRPLUS: case OP_CRMINPLUS: + case OP_CRPOSPLUS: min = 1; cc++; break; case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: min = GET2(cc, 1); cc += 1 + 2 * IMM2_SIZE; break; @@ -437,7 +478,8 @@ for (;;) had_recurse = TRUE; else { - branchlength += find_minlength(cs, startcode, options, recurse_depth + 1); + branchlength += find_minlength(re, cs, startcode, options, + recurse_depth + 1); } cc += 1 + LINK_SIZE; break; @@ -778,6 +820,10 @@ do case OP_COND: case OP_CREF: case OP_DEF: + case OP_DNCREF: + case OP_DNREF: + case OP_DNREFI: + case OP_DNRREF: case OP_DOLL: case OP_DOLLM: case OP_END: @@ -786,7 +832,6 @@ do case OP_EXTUNI: case OP_FAIL: case OP_MARK: - case OP_NCREF: case OP_NOT: case OP_NOTEXACT: case OP_NOTEXACTI: @@ -818,7 +863,6 @@ do case OP_NOTUPTOI: case OP_NOT_HSPACE: case OP_NOT_VSPACE: - case OP_NRREF: case OP_PROP: case OP_PRUNE: case OP_PRUNE_ARG: @@ -1183,24 +1227,16 @@ do set_type_bits(start_bits, cbit_digit, table_limit, cd); break; - /* The cbit_space table has vertical tab as whitespace; we have to - ensure it gets set as not whitespace. Luckily, the code value is the - same (0x0b) in ASCII and EBCDIC, so we can just adjust the appropriate - bit. */ + /* The cbit_space table has vertical tab as whitespace; we no longer + have to play fancy tricks because Perl added VT to its whitespace at + release 5.18. PCRE added it at release 8.34. */ case OP_NOT_WHITESPACE: set_nottype_bits(start_bits, cbit_space, table_limit, cd); - start_bits[1] |= 0x08; break; - /* The cbit_space table has vertical tab as whitespace; we have to - avoid setting it. Luckily, the code value is the same (0x0b) in ASCII - and EBCDIC, so we can just adjust the appropriate bit. */ - case OP_WHITESPACE: - c = start_bits[1]; /* Save in case it was already set */ set_type_bits(start_bits, cbit_space, table_limit, cd); - start_bits[1] = (start_bits[1] & ~0x08) | c; break; case OP_NOT_WORDCHAR: @@ -1277,11 +1313,14 @@ do case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: tcode++; break; case OP_CRRANGE: case OP_CRMINRANGE: + case OP_CRPOSRANGE: if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE; else try_next = FALSE; break; @@ -1346,6 +1385,7 @@ pcre_uchar *code; compile_data compile_block; const REAL_PCRE *re = (const REAL_PCRE *)external_re; + *errorptr = NULL; if (re == NULL || re->magic_number != MAGIC_NUMBER) @@ -1422,7 +1462,7 @@ if ((re->options & PCRE_ANCHORED) == 0 && /* Find the minimum length of subject string. */ -switch(min = find_minlength(code, code, re->options, 0)) +switch(min = find_minlength(re, code, code, re->options, 0)) { case -2: *errorptr = "internal error: missing capturing bracket"; return NULL; case -3: *errorptr = "internal error: opcode not recognized"; return NULL; diff --git a/ext/pcre/pcrelib/pcre_tables.c b/ext/pcre/pcrelib/pcre_tables.c index 34ee0488a..f38ab52cb 100644 --- a/ext/pcre/pcrelib/pcre_tables.c +++ b/ext/pcre/pcrelib/pcre_tables.c @@ -346,6 +346,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Xan0 STR_X STR_a STR_n "\0" #define STRING_Xps0 STR_X STR_p STR_s "\0" #define STRING_Xsp0 STR_X STR_s STR_p "\0" +#define STRING_Xuc0 STR_X STR_u STR_c "\0" #define STRING_Xwd0 STR_X STR_w STR_d "\0" #define STRING_Yi0 STR_Y STR_i "\0" #define STRING_Z0 STR_Z "\0" @@ -493,6 +494,7 @@ const char PRIV(utt_names)[] = STRING_Xan0 STRING_Xps0 STRING_Xsp0 + STRING_Xuc0 STRING_Xwd0 STRING_Yi0 STRING_Z0 @@ -640,12 +642,13 @@ const ucp_type_table PRIV(utt)[] = { { 1011, PT_ALNUM, 0 }, { 1015, PT_PXSPACE, 0 }, { 1019, PT_SPACE, 0 }, - { 1023, PT_WORD, 0 }, - { 1027, PT_SC, ucp_Yi }, - { 1030, PT_GC, ucp_Z }, - { 1032, PT_PC, ucp_Zl }, - { 1035, PT_PC, ucp_Zp }, - { 1038, PT_PC, ucp_Zs } + { 1023, PT_UCNC, 0 }, + { 1027, PT_WORD, 0 }, + { 1031, PT_SC, ucp_Yi }, + { 1034, PT_GC, ucp_Z }, + { 1036, PT_PC, ucp_Zl }, + { 1039, PT_PC, ucp_Zp }, + { 1042, PT_PC, ucp_Zs } }; const int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); diff --git a/ext/pcre/pcrelib/pcre_ucd.c b/ext/pcre/pcrelib/pcre_ucd.c index 56f31a1e6..46ea70c44 100644 --- a/ext/pcre/pcrelib/pcre_ucd.c +++ b/ext/pcre/pcrelib/pcre_ucd.c @@ -20,7 +20,7 @@ needed. */ /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */ -/* Total size: 65696 bytes, block size: 128. */ +/* Total size: 65688 bytes, block size: 128. */ /* The tables herein are needed only when UCP support is built into PCRE. This module should not be referenced otherwise, so @@ -79,7 +79,7 @@ const pcre_uint32 PRIV(ucd_caseless_sets)[] = { #ifndef PCRE_INCLUDED -const ucd_record PRIV(ucd_records)[] = { /* 5024 bytes, record size 8 */ +const ucd_record PRIV(ucd_records)[] = { /* 5016 bytes, record size 8 */ { 9, 0, 2, 0, 0, }, /* 0 */ { 9, 0, 1, 0, 0, }, /* 1 */ { 9, 0, 0, 0, 0, }, /* 2 */ @@ -422,7 +422,7 @@ const ucd_record PRIV(ucd_records)[] = { /* 5024 bytes, record size 8 */ { 37, 21, 12, 0, 0, }, /* 339 */ { 37, 17, 12, 0, 0, }, /* 340 */ { 37, 12, 3, 0, 0, }, /* 341 */ - { 37, 29, 12, 0, 0, }, /* 342 */ + { 37, 1, 2, 0, 0, }, /* 342 */ { 37, 13, 12, 0, 0, }, /* 343 */ { 37, 7, 12, 0, 0, }, /* 344 */ { 37, 6, 12, 0, 0, }, /* 345 */ @@ -598,116 +598,115 @@ const ucd_record PRIV(ucd_records)[] = { /* 5024 bytes, record size 8 */ { 83, 10, 5, 0, 0, }, /* 515 */ { 83, 7, 12, 0, 0, }, /* 516 */ { 83, 21, 12, 0, 0, }, /* 517 */ - { 83, 6, 12, 0, 0, }, /* 518 */ - { 83, 13, 12, 0, 0, }, /* 519 */ - { 67, 7, 12, 0, 0, }, /* 520 */ - { 67, 12, 3, 0, 0, }, /* 521 */ - { 67, 10, 5, 0, 0, }, /* 522 */ - { 67, 13, 12, 0, 0, }, /* 523 */ - { 67, 21, 12, 0, 0, }, /* 524 */ - { 38, 6, 12, 0, 0, }, /* 525 */ - { 91, 7, 12, 0, 0, }, /* 526 */ - { 91, 12, 3, 0, 0, }, /* 527 */ - { 91, 6, 12, 0, 0, }, /* 528 */ - { 91, 21, 12, 0, 0, }, /* 529 */ - { 86, 7, 12, 0, 0, }, /* 530 */ - { 86, 10, 5, 0, 0, }, /* 531 */ - { 86, 12, 3, 0, 0, }, /* 532 */ - { 86, 21, 12, 0, 0, }, /* 533 */ - { 86, 6, 12, 0, 0, }, /* 534 */ - { 86, 13, 12, 0, 0, }, /* 535 */ - { 23, 7, 9, 0, 0, }, /* 536 */ - { 23, 7, 10, 0, 0, }, /* 537 */ - { 9, 4, 2, 0, 0, }, /* 538 */ - { 9, 3, 12, 0, 0, }, /* 539 */ - { 25, 25, 12, 0, 0, }, /* 540 */ - { 0, 24, 12, 0, 0, }, /* 541 */ - { 9, 6, 3, 0, 0, }, /* 542 */ - { 35, 7, 12, 0, 0, }, /* 543 */ - { 19, 14, 12, 0, 0, }, /* 544 */ - { 19, 15, 12, 0, 0, }, /* 545 */ - { 19, 26, 12, 0, 0, }, /* 546 */ - { 70, 7, 12, 0, 0, }, /* 547 */ - { 66, 7, 12, 0, 0, }, /* 548 */ - { 41, 7, 12, 0, 0, }, /* 549 */ - { 41, 15, 12, 0, 0, }, /* 550 */ - { 18, 7, 12, 0, 0, }, /* 551 */ - { 18, 14, 12, 0, 0, }, /* 552 */ - { 59, 7, 12, 0, 0, }, /* 553 */ - { 59, 21, 12, 0, 0, }, /* 554 */ - { 42, 7, 12, 0, 0, }, /* 555 */ - { 42, 21, 12, 0, 0, }, /* 556 */ - { 42, 14, 12, 0, 0, }, /* 557 */ - { 13, 9, 12, 0, 40, }, /* 558 */ - { 13, 5, 12, 0, -40, }, /* 559 */ - { 46, 7, 12, 0, 0, }, /* 560 */ - { 44, 7, 12, 0, 0, }, /* 561 */ - { 44, 13, 12, 0, 0, }, /* 562 */ - { 11, 7, 12, 0, 0, }, /* 563 */ - { 80, 7, 12, 0, 0, }, /* 564 */ - { 80, 21, 12, 0, 0, }, /* 565 */ - { 80, 15, 12, 0, 0, }, /* 566 */ - { 65, 7, 12, 0, 0, }, /* 567 */ - { 65, 15, 12, 0, 0, }, /* 568 */ - { 65, 21, 12, 0, 0, }, /* 569 */ - { 71, 7, 12, 0, 0, }, /* 570 */ - { 71, 21, 12, 0, 0, }, /* 571 */ - { 97, 7, 12, 0, 0, }, /* 572 */ - { 96, 7, 12, 0, 0, }, /* 573 */ - { 30, 7, 12, 0, 0, }, /* 574 */ - { 30, 12, 3, 0, 0, }, /* 575 */ - { 30, 15, 12, 0, 0, }, /* 576 */ - { 30, 21, 12, 0, 0, }, /* 577 */ - { 87, 7, 12, 0, 0, }, /* 578 */ - { 87, 15, 12, 0, 0, }, /* 579 */ - { 87, 21, 12, 0, 0, }, /* 580 */ - { 77, 7, 12, 0, 0, }, /* 581 */ - { 77, 21, 12, 0, 0, }, /* 582 */ - { 82, 7, 12, 0, 0, }, /* 583 */ - { 82, 15, 12, 0, 0, }, /* 584 */ - { 81, 7, 12, 0, 0, }, /* 585 */ - { 81, 15, 12, 0, 0, }, /* 586 */ - { 88, 7, 12, 0, 0, }, /* 587 */ - { 0, 15, 12, 0, 0, }, /* 588 */ - { 93, 10, 5, 0, 0, }, /* 589 */ - { 93, 12, 3, 0, 0, }, /* 590 */ - { 93, 7, 12, 0, 0, }, /* 591 */ - { 93, 21, 12, 0, 0, }, /* 592 */ - { 93, 15, 12, 0, 0, }, /* 593 */ - { 93, 13, 12, 0, 0, }, /* 594 */ - { 84, 12, 3, 0, 0, }, /* 595 */ - { 84, 10, 5, 0, 0, }, /* 596 */ - { 84, 7, 12, 0, 0, }, /* 597 */ - { 84, 21, 12, 0, 0, }, /* 598 */ - { 84, 1, 2, 0, 0, }, /* 599 */ - { 100, 7, 12, 0, 0, }, /* 600 */ - { 100, 13, 12, 0, 0, }, /* 601 */ - { 95, 12, 3, 0, 0, }, /* 602 */ - { 95, 7, 12, 0, 0, }, /* 603 */ - { 95, 10, 5, 0, 0, }, /* 604 */ - { 95, 13, 12, 0, 0, }, /* 605 */ - { 95, 21, 12, 0, 0, }, /* 606 */ - { 99, 12, 3, 0, 0, }, /* 607 */ - { 99, 10, 5, 0, 0, }, /* 608 */ - { 99, 7, 12, 0, 0, }, /* 609 */ - { 99, 21, 12, 0, 0, }, /* 610 */ - { 99, 13, 12, 0, 0, }, /* 611 */ - { 101, 7, 12, 0, 0, }, /* 612 */ - { 101, 12, 3, 0, 0, }, /* 613 */ - { 101, 10, 5, 0, 0, }, /* 614 */ - { 101, 13, 12, 0, 0, }, /* 615 */ - { 62, 7, 12, 0, 0, }, /* 616 */ - { 62, 14, 12, 0, 0, }, /* 617 */ - { 62, 21, 12, 0, 0, }, /* 618 */ - { 79, 7, 12, 0, 0, }, /* 619 */ - { 98, 7, 12, 0, 0, }, /* 620 */ - { 98, 10, 5, 0, 0, }, /* 621 */ - { 98, 12, 3, 0, 0, }, /* 622 */ - { 98, 6, 12, 0, 0, }, /* 623 */ - { 9, 10, 3, 0, 0, }, /* 624 */ - { 19, 12, 3, 0, 0, }, /* 625 */ - { 9, 26, 11, 0, 0, }, /* 626 */ - { 26, 26, 12, 0, 0, }, /* 627 */ + { 83, 13, 12, 0, 0, }, /* 518 */ + { 67, 7, 12, 0, 0, }, /* 519 */ + { 67, 12, 3, 0, 0, }, /* 520 */ + { 67, 10, 5, 0, 0, }, /* 521 */ + { 67, 13, 12, 0, 0, }, /* 522 */ + { 67, 21, 12, 0, 0, }, /* 523 */ + { 38, 6, 12, 0, 0, }, /* 524 */ + { 91, 7, 12, 0, 0, }, /* 525 */ + { 91, 12, 3, 0, 0, }, /* 526 */ + { 91, 6, 12, 0, 0, }, /* 527 */ + { 91, 21, 12, 0, 0, }, /* 528 */ + { 86, 7, 12, 0, 0, }, /* 529 */ + { 86, 10, 5, 0, 0, }, /* 530 */ + { 86, 12, 3, 0, 0, }, /* 531 */ + { 86, 21, 12, 0, 0, }, /* 532 */ + { 86, 6, 12, 0, 0, }, /* 533 */ + { 86, 13, 12, 0, 0, }, /* 534 */ + { 23, 7, 9, 0, 0, }, /* 535 */ + { 23, 7, 10, 0, 0, }, /* 536 */ + { 9, 4, 2, 0, 0, }, /* 537 */ + { 9, 3, 12, 0, 0, }, /* 538 */ + { 25, 25, 12, 0, 0, }, /* 539 */ + { 0, 24, 12, 0, 0, }, /* 540 */ + { 9, 6, 3, 0, 0, }, /* 541 */ + { 35, 7, 12, 0, 0, }, /* 542 */ + { 19, 14, 12, 0, 0, }, /* 543 */ + { 19, 15, 12, 0, 0, }, /* 544 */ + { 19, 26, 12, 0, 0, }, /* 545 */ + { 70, 7, 12, 0, 0, }, /* 546 */ + { 66, 7, 12, 0, 0, }, /* 547 */ + { 41, 7, 12, 0, 0, }, /* 548 */ + { 41, 15, 12, 0, 0, }, /* 549 */ + { 18, 7, 12, 0, 0, }, /* 550 */ + { 18, 14, 12, 0, 0, }, /* 551 */ + { 59, 7, 12, 0, 0, }, /* 552 */ + { 59, 21, 12, 0, 0, }, /* 553 */ + { 42, 7, 12, 0, 0, }, /* 554 */ + { 42, 21, 12, 0, 0, }, /* 555 */ + { 42, 14, 12, 0, 0, }, /* 556 */ + { 13, 9, 12, 0, 40, }, /* 557 */ + { 13, 5, 12, 0, -40, }, /* 558 */ + { 46, 7, 12, 0, 0, }, /* 559 */ + { 44, 7, 12, 0, 0, }, /* 560 */ + { 44, 13, 12, 0, 0, }, /* 561 */ + { 11, 7, 12, 0, 0, }, /* 562 */ + { 80, 7, 12, 0, 0, }, /* 563 */ + { 80, 21, 12, 0, 0, }, /* 564 */ + { 80, 15, 12, 0, 0, }, /* 565 */ + { 65, 7, 12, 0, 0, }, /* 566 */ + { 65, 15, 12, 0, 0, }, /* 567 */ + { 65, 21, 12, 0, 0, }, /* 568 */ + { 71, 7, 12, 0, 0, }, /* 569 */ + { 71, 21, 12, 0, 0, }, /* 570 */ + { 97, 7, 12, 0, 0, }, /* 571 */ + { 96, 7, 12, 0, 0, }, /* 572 */ + { 30, 7, 12, 0, 0, }, /* 573 */ + { 30, 12, 3, 0, 0, }, /* 574 */ + { 30, 15, 12, 0, 0, }, /* 575 */ + { 30, 21, 12, 0, 0, }, /* 576 */ + { 87, 7, 12, 0, 0, }, /* 577 */ + { 87, 15, 12, 0, 0, }, /* 578 */ + { 87, 21, 12, 0, 0, }, /* 579 */ + { 77, 7, 12, 0, 0, }, /* 580 */ + { 77, 21, 12, 0, 0, }, /* 581 */ + { 82, 7, 12, 0, 0, }, /* 582 */ + { 82, 15, 12, 0, 0, }, /* 583 */ + { 81, 7, 12, 0, 0, }, /* 584 */ + { 81, 15, 12, 0, 0, }, /* 585 */ + { 88, 7, 12, 0, 0, }, /* 586 */ + { 0, 15, 12, 0, 0, }, /* 587 */ + { 93, 10, 5, 0, 0, }, /* 588 */ + { 93, 12, 3, 0, 0, }, /* 589 */ + { 93, 7, 12, 0, 0, }, /* 590 */ + { 93, 21, 12, 0, 0, }, /* 591 */ + { 93, 15, 12, 0, 0, }, /* 592 */ + { 93, 13, 12, 0, 0, }, /* 593 */ + { 84, 12, 3, 0, 0, }, /* 594 */ + { 84, 10, 5, 0, 0, }, /* 595 */ + { 84, 7, 12, 0, 0, }, /* 596 */ + { 84, 21, 12, 0, 0, }, /* 597 */ + { 84, 1, 2, 0, 0, }, /* 598 */ + { 100, 7, 12, 0, 0, }, /* 599 */ + { 100, 13, 12, 0, 0, }, /* 600 */ + { 95, 12, 3, 0, 0, }, /* 601 */ + { 95, 7, 12, 0, 0, }, /* 602 */ + { 95, 10, 5, 0, 0, }, /* 603 */ + { 95, 13, 12, 0, 0, }, /* 604 */ + { 95, 21, 12, 0, 0, }, /* 605 */ + { 99, 12, 3, 0, 0, }, /* 606 */ + { 99, 10, 5, 0, 0, }, /* 607 */ + { 99, 7, 12, 0, 0, }, /* 608 */ + { 99, 21, 12, 0, 0, }, /* 609 */ + { 99, 13, 12, 0, 0, }, /* 610 */ + { 101, 7, 12, 0, 0, }, /* 611 */ + { 101, 12, 3, 0, 0, }, /* 612 */ + { 101, 10, 5, 0, 0, }, /* 613 */ + { 101, 13, 12, 0, 0, }, /* 614 */ + { 62, 7, 12, 0, 0, }, /* 615 */ + { 62, 14, 12, 0, 0, }, /* 616 */ + { 62, 21, 12, 0, 0, }, /* 617 */ + { 79, 7, 12, 0, 0, }, /* 618 */ + { 98, 7, 12, 0, 0, }, /* 619 */ + { 98, 10, 5, 0, 0, }, /* 620 */ + { 98, 12, 3, 0, 0, }, /* 621 */ + { 98, 6, 12, 0, 0, }, /* 622 */ + { 9, 10, 3, 0, 0, }, /* 623 */ + { 19, 12, 3, 0, 0, }, /* 624 */ + { 9, 26, 11, 0, 0, }, /* 625 */ + { 26, 26, 12, 0, 0, }, /* 626 */ }; const pcre_uint8 PRIV(ucd_stage1)[] = { /* 8704 bytes */ @@ -1380,7 +1379,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ /* block 12 */ 185,185,185,185,185,109,186,186,186,187,187,188, 4,187,189,189, -190,190,190,190,190,190,190,190,190,190,190, 4,109,109,187, 4, +190,190,190,190,190,190,190,190,190,190,190, 4,185,109,187, 4, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, 102,191,191,191,191,191,191,191,191,191,191,104,104,104,104,104, @@ -1760,7 +1759,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ /* block 50 */ 360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, -360,360,360,360,360,360,360,361,361,362,362,362,109,109,363,363, +360,360,360,360,360,360,360,361,361,362,362,361,109,109,363,363, 364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, 364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, 364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364, @@ -1885,7 +1884,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 21, 25, 4, 4, 4, 4, 15, 15, 4, 4, 4, 8, 6, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 15, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, - 22, 22, 22, 22, 22,426,426,426,426,426, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22,426, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,101,109,109, 23, 23, 23, 23, 23, 23, 8, 8, 8, 6, 7,101, /* block 63 */ @@ -1929,7 +1928,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* block 67 */ - 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, 8, 8, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 6, 7, 6, 7, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, 19, 19, 19, 19, 19, 19, 19, 6, 7, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, @@ -2353,30 +2352,30 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, 516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516, 516,516,516,514,515,515,514,514,514,514,515,515,514,515,515,515, -515,517,517,517,517,517,517,517,517,517,517,517,517,517,109,518, -519,519,519,519,519,519,519,519,519,519,109,109,109,109,517,517, +515,517,517,517,517,517,517,517,517,517,517,517,517,517,109,102, +518,518,518,518,518,518,518,518,518,518,109,109,109,109,517,517, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 110 */ -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,521,521,521,521,521,521,522, -522,521,521,522,522,521,521,109,109,109,109,109,109,109,109,109, -520,520,520,521,520,520,520,520,520,520,520,520,521,522,109,109, -523,523,523,523,523,523,523,523,523,523,109,109,524,524,524,524, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,520,520,520,520,520,520,521, +521,520,520,521,521,520,520,109,109,109,109,109,109,109,109,109, +519,519,519,520,519,519,519,519,519,519,519,519,520,521,109,109, +522,522,522,522,522,522,522,522,522,522,109,109,523,523,523,523, 295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295, -525,295,295,295,295,295,295,301,301,301,295,296,109,109,109,109, +524,295,295,295,295,295,295,301,301,301,295,296,109,109,109,109, /* block 111 */ -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -527,526,527,527,527,526,526,527,527,526,526,526,526,526,527,527, -526,527,526,109,109,109,109,109,109,109,109,109,109,109,109,109, -109,109,109,109,109,109,109,109,109,109,109,526,526,528,529,529, -530,530,530,530,530,530,530,530,530,530,530,531,532,532,531,531, -533,533,530,534,534,531,532,109,109,109,109,109,109,109,109,109, +525,525,525,525,525,525,525,525,525,525,525,525,525,525,525,525, +525,525,525,525,525,525,525,525,525,525,525,525,525,525,525,525, +525,525,525,525,525,525,525,525,525,525,525,525,525,525,525,525, +526,525,526,526,526,525,525,526,526,525,525,525,525,525,526,526, +525,526,525,109,109,109,109,109,109,109,109,109,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,525,525,527,528,528, +529,529,529,529,529,529,529,529,529,529,529,530,531,531,530,530, +532,532,529,533,533,530,531,109,109,109,109,109,109,109,109,109, /* block 112 */ 109,308,308,308,308,308,308,109,109,308,308,308,308,308,308,109, @@ -2393,85 +2392,85 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,531,531,532,531,531,532,531,531,533,531,532,109,109, -535,535,535,535,535,535,535,535,535,535,109,109,109,109,109,109, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,530,530,531,530,530,531,530,530,532,530,531,109,109, +534,534,534,534,534,534,534,534,534,534,109,109,109,109,109,109, /* block 114 */ -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, /* block 115 */ -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, /* block 116 */ -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, /* block 117 */ -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, /* block 118 */ -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, /* block 119 */ -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, /* block 120 */ -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -536,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,536,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,536,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +535,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,535,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,535,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, /* block 121 */ -537,537,537,537,537,537,537,537,536,537,537,537,537,537,537,537, -537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, -537,537,537,537,109,109,109,109,109,109,109,109,109,109,109,109, +536,536,536,536,536,536,536,536,535,536,536,536,536,536,536,536, +536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536, +536,536,536,536,109,109,109,109,109,109,109,109,109,109,109,109, 306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306, 306,306,306,306,306,306,306,109,109,109,109,307,307,307,307,307, 307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307, @@ -2479,6 +2478,16 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 307,307,307,307,307,307,307,307,307,307,307,307,109,109,109,109, /* block 122 */ +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, +537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537, + +/* block 123 */ 538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, 538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, 538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, @@ -2488,16 +2497,6 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, 538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -/* block 123 */ -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, - /* block 124 */ 475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,475, 475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,475, @@ -2521,7 +2520,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ /* block 126 */ 33, 33, 33, 33, 33, 33, 33,109,109,109,109,109,109,109,109,109, 109,109,109,178,178,178,178,178,109,109,109,109,109,184,181,184, -184,184,184,184,184,184,184,184,184,540,184,184,184,184,184,184, +184,184,184,184,184,184,184,184,184,539,184,184,184,184,184,184, 184,184,184,184,184,184,184,109,184,184,184,184,184,109,184,109, 184,184,109,184,184,109,184,184,184,184,184,184,184,184,184,184, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, @@ -2532,8 +2531,8 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, -191,191,541,541,541,541,541,541,541,541,541,541,541,541,541,541, -541,541,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +191,191,540,540,540,540,540,540,540,540,540,540,540,540,540,540, +540,540,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,191,191,191,191,191,191,191,191,191,191,191,191,191, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, @@ -2600,7 +2599,7 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ /* block 134 */ 469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469, -469,469,469,469,469,469,469,469,469,469,469,469,469,469,542,542, +469,469,469,469,469,469,469,469,469,469,469,469,469,469,541,541, 472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, 472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,109, 109,109,472,472,472,472,472,472,109,109,472,472,472,472,472,472, @@ -2609,37 +2608,37 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 426,426,426,426,426,426,426,426,426, 22, 22, 22, 19, 19,109,109, /* block 135 */ -543,543,543,543,543,543,543,543,543,543,543,543,109,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,109,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,109,543,543,109,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,109,109, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,109,109, +542,542,542,542,542,542,542,542,542,542,542,542,109,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,109,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,109,542,542,109,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,109,109, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 136 */ -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, -543,543,543,543,543,543,543,543,543,543,543,109,109,109,109,109, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542, +542,542,542,542,542,542,542,542,542,542,542,109,109,109,109,109, /* block 137 */ 4, 4, 4,109,109,109,109, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,109,109,109, 19, 19, 19, 19, 19, 19, 19, 19, 19, -544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,544, -544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,544, -544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,544, -544,544,544,544,544,545,545,545,545,546,546,546,546,546,546,546, +543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, +543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, +543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, +543,543,543,543,543,544,544,544,544,545,545,545,545,545,545,545, /* block 138 */ -546,546,546,546,546,546,546,546,546,546,545,109,109,109,109,109, +545,545,545,545,545,545,545,545,545,545,544,109,109,109,109,109, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -2649,49 +2648,49 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,104,109,109, /* block 139 */ +546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546, +546,546,546,546,546,546,546,546,546,546,546,546,546,109,109,109, 547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, -547,547,547,547,547,547,547,547,547,547,547,547,547,109,109,109, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, -548,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, +547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, +547,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 140 */ -549,549,549,549,549,549,549,549,549,549,549,549,549,549,549,549, -549,549,549,549,549,549,549,549,549,549,549,549,549,549,549,109, -550,550,550,550,109,109,109,109,109,109,109,109,109,109,109,109, -551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551, -551,552,551,551,551,551,551,551,551,551,552,109,109,109,109,109, +548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, +548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,109, +549,549,549,549,109,109,109,109,109,109,109,109,109,109,109,109, +550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550, +550,551,550,550,550,550,550,550,550,550,551,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 141 */ -553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553, -553,553,553,553,553,553,553,553,553,553,553,553,553,553,109,554, -555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555, -555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555, -555,555,555,555,109,109,109,109,555,555,555,555,555,555,555,555, -556,557,557,557,557,557,109,109,109,109,109,109,109,109,109,109, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,109,553, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,109,109,109,109,554,554,554,554,554,554,554,554, +555,556,556,556,556,556,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 142 */ +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, +557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557, +557,557,557,557,557,557,557,557,558,558,558,558,558,558,558,558, 558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,558, 558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,558, -558,558,558,558,558,558,558,558,559,559,559,559,559,559,559,559, 559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, 559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, -560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560, -560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560, -560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560, +559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, /* block 143 */ -561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561, -561,561,561,561,561,561,561,561,561,561,561,561,561,561,109,109, -562,562,562,562,562,562,562,562,562,562,109,109,109,109,109,109, +560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560, +560,560,560,560,560,560,560,560,560,560,560,560,560,560,109,109, +561,561,561,561,561,561,561,561,561,561,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -2699,61 +2698,61 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 144 */ -563,563,563,563,563,563,109,109,563,109,563,563,563,563,563,563, +562,562,562,562,562,562,109,109,562,109,562,562,562,562,562,562, +562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562, +562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562, +562,562,562,562,562,562,109,562,562,109,109,109,562,109,109,562, 563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, -563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, -563,563,563,563,563,563,109,563,563,109,109,109,563,109,109,563, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,109,565,566,566,566,566,566,566,566,566, +563,563,563,563,563,563,109,564,565,565,565,565,565,565,565,565, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 145 */ -567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,567, -567,567,567,567,567,567,568,568,568,568,568,568,109,109,109,569, -570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, -570,570,570,570,570,570,570,570,570,570,109,109,109,109,109,571, +566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566, +566,566,566,566,566,566,567,567,567,567,567,567,109,109,109,568, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,109,109,109,109,109,570, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 146 */ +571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571, +571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571, 572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,109,109,109,109,109,109,573,573, +572,572,572,572,572,572,572,572,109,109,109,109,109,109,572,572, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 147 */ -574,575,575,575,109,575,575,109,109,109,109,109,575,575,575,575, -574,574,574,574,109,574,574,574,109,574,574,574,574,574,574,574, -574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574, -574,574,574,574,109,109,109,109,575,575,575,109,109,109,109,575, -576,576,576,576,576,576,576,576,109,109,109,109,109,109,109,109, -577,577,577,577,577,577,577,577,577,109,109,109,109,109,109,109, -578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, -578,578,578,578,578,578,578,578,578,578,578,578,578,579,579,580, +573,574,574,574,109,574,574,109,109,109,109,109,574,574,574,574, +573,573,573,573,109,573,573,573,109,573,573,573,573,573,573,573, +573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, +573,573,573,573,109,109,109,109,574,574,574,109,109,109,109,574, +575,575,575,575,575,575,575,575,109,109,109,109,109,109,109,109, +576,576,576,576,576,576,576,576,576,109,109,109,109,109,109,109, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,578,578,579, /* block 148 */ -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, -581,581,581,581,581,581,109,109,109,582,582,582,582,582,582,582, -583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, -583,583,583,583,583,583,109,109,584,584,584,584,584,584,584,584, -585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, -585,585,585,109,109,109,109,109,586,586,586,586,586,586,586,586, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,109,109,109,581,581,581,581,581,581,581, +582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, +582,582,582,582,582,582,109,109,583,583,583,583,583,583,583,583, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,109,109,109,109,109,585,585,585,585,585,585,585,585, /* block 149 */ -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, -587,587,587,587,587,587,587,587,587,109,109,109,109,109,109,109, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -2765,103 +2764,103 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, -588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, -588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,109, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,109, /* block 151 */ -589,590,589,591,591,591,591,591,591,591,591,591,591,591,591,591, -591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, -591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591, -591,591,591,591,591,591,591,591,590,590,590,590,590,590,590,590, -590,590,590,590,590,590,590,592,592,592,592,592,592,592,109,109, -109,109,593,593,593,593,593,593,593,593,593,593,593,593,593,593, -593,593,593,593,593,593,594,594,594,594,594,594,594,594,594,594, +588,589,588,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,589,589,589,589,589,589,589,589, +589,589,589,589,589,589,589,591,591,591,591,591,591,591,109,109, +109,109,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,593,593,593,593,593,593,593,593,593,593, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 152 */ -595,595,596,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -596,596,596,595,595,595,595,596,596,595,595,598,598,599,598,598, -598,598,109,109,109,109,109,109,109,109,109,109,109,109,109,109, -600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600, -600,600,600,600,600,600,600,600,600,109,109,109,109,109,109,109, -601,601,601,601,601,601,601,601,601,601,109,109,109,109,109,109, +594,594,595,596,596,596,596,596,596,596,596,596,596,596,596,596, +596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, +596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, +595,595,595,594,594,594,594,595,595,594,594,597,597,598,597,597, +597,597,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +599,599,599,599,599,599,599,599,599,599,599,599,599,599,599,599, +599,599,599,599,599,599,599,599,599,109,109,109,109,109,109,109, +600,600,600,600,600,600,600,600,600,600,109,109,109,109,109,109, /* block 153 */ -602,602,602,603,603,603,603,603,603,603,603,603,603,603,603,603, -603,603,603,603,603,603,603,603,603,603,603,603,603,603,603,603, -603,603,603,603,603,603,603,602,602,602,602,602,604,602,602,602, -602,602,602,602,602,109,605,605,605,605,605,605,605,605,605,605, -606,606,606,606,109,109,109,109,109,109,109,109,109,109,109,109, +601,601,601,602,602,602,602,602,602,602,602,602,602,602,602,602, +602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602, +602,602,602,602,602,602,602,601,601,601,601,601,603,601,601,601, +601,601,601,601,601,109,604,604,604,604,604,604,604,604,604,604, +605,605,605,605,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 154 */ -607,607,608,609,609,609,609,609,609,609,609,609,609,609,609,609, -609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609, -609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609, -609,609,609,608,608,608,607,607,607,607,607,607,607,607,607,608, -608,609,609,609,609,610,610,610,610,109,109,109,109,109,109,109, -611,611,611,611,611,611,611,611,611,611,109,109,109,109,109,109, +606,606,607,608,608,608,608,608,608,608,608,608,608,608,608,608, +608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608, +608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608, +608,608,608,607,607,607,606,606,606,606,606,606,606,606,606,607, +607,608,608,608,608,609,609,609,609,109,109,109,109,109,109,109, +610,610,610,610,610,610,610,610,610,610,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 155 */ -612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612, -612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612, -612,612,612,612,612,612,612,612,612,612,612,613,614,613,614,614, -613,613,613,613,613,613,614,613,109,109,109,109,109,109,109,109, -615,615,615,615,615,615,615,615,615,615,109,109,109,109,109,109, +611,611,611,611,611,611,611,611,611,611,611,611,611,611,611,611, +611,611,611,611,611,611,611,611,611,611,611,611,611,611,611,611, +611,611,611,611,611,611,611,611,611,611,611,612,613,612,613,613, +612,612,612,612,612,612,613,612,109,109,109,109,109,109,109,109, +614,614,614,614,614,614,614,614,614,614,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 156 */ -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, /* block 157 */ +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, +615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, + +/* block 158 */ 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, 616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616, -616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,109, -109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, - -/* block 158 */ -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, -617,617,617,109,109,109,109,109,109,109,109,109,109,109,109,109, -618,618,618,618,109,109,109,109,109,109,109,109,109,109,109,109, +616,616,616,109,109,109,109,109,109,109,109,109,109,109,109,109, +617,617,617,617,109,109,109,109,109,109,109,109,109,109,109,109, /* block 159 */ -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, /* block 160 */ -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,109, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, +618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -2889,18 +2888,18 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 163 */ +619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +619,619,619,619,619,109,109,109,109,109,109,109,109,109,109,109, +619,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, 620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,109,109,109,109,109,109,109,109,109,109,109, -620,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621, -621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621, -621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,109, +620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,109, /* block 164 */ -109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,622, -622,622,622,623,623,623,623,623,623,623,623,623,623,623,623,623, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,621, +621,621,621,622,622,622,622,622,622,622,622,622,622,622,622,622, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -2935,8 +2934,8 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19,624,395,104,104,104, 19, 19, 19,395,624,624, -624,624,624, 22, 22, 22, 22, 22, 22, 22, 22,104,104,104,104,104, + 19, 19, 19, 19, 19,623,395,104,104,104, 19, 19, 19,395,623,623, +623,623,623, 22, 22, 22, 22, 22, 22, 22, 22,104,104,104,104,104, /* block 168 */ 104,104,104, 19, 19,104,104,104,104,104,104,104, 19, 19, 19, 19, @@ -2949,11 +2948,11 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, /* block 169 */ -546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546, -546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546, -546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546, -546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546, -546,546,625,625,625,546,109,109,109,109,109,109,109,109,109,109, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,624,624,624,545,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, @@ -3105,11 +3104,11 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, -109,109,109,109,109,109,626,626,626,626,626,626,626,626,626,626, -626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,626, +109,109,109,109,109,109,625,625,625,625,625,625,625,625,625,625, +625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625, /* block 185 */ -627, 19, 19,109,109,109,109,109,109,109,109,109,109,109,109,109, +626, 19, 19,109,109,109,109,109,109,109,109,109,109,109,109,109, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,109,109,109,109, @@ -3279,14 +3278,14 @@ const pcre_uint16 PRIV(ucd_stage2)[] = { /* 51968 bytes, block = 128 */ 426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426, /* block 202 */ -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, -539,539,539,539,539,539,539,539,539,539,539,539,539,539,109,109, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,109,109, }; diff --git a/ext/pcre/pcrelib/pcre_valid_utf8.c b/ext/pcre/pcrelib/pcre_valid_utf8.c index a41592756..3b0f6464a 100644 --- a/ext/pcre/pcrelib/pcre_valid_utf8.c +++ b/ext/pcre/pcrelib/pcre_valid_utf8.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -92,7 +92,7 @@ PCRE_UTF8_ERR18 Overlong 5-byte sequence (won't ever occur) PCRE_UTF8_ERR19 Overlong 6-byte sequence (won't ever occur) PCRE_UTF8_ERR20 Isolated 0x80 byte (not within UTF-8 character) PCRE_UTF8_ERR21 Byte with the illegal value 0xfe or 0xff -PCRE_UTF8_ERR22 Non-character +PCRE_UTF8_ERR22 Unused (was non-character) Arguments: string points to the string @@ -118,7 +118,6 @@ if (length < 0) for (p = string; length-- > 0; p++) { register pcre_uchar ab, c, d; - pcre_uint32 v = 0; c = *p; if (c < 128) continue; /* ASCII character */ @@ -187,7 +186,6 @@ for (p = string; length-- > 0; p++) *erroroffset = (int)(p - string) - 2; return PCRE_UTF8_ERR14; } - v = ((c & 0x0f) << 12) | ((d & 0x3f) << 6) | (*p & 0x3f); break; /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2 @@ -215,7 +213,6 @@ for (p = string; length-- > 0; p++) *erroroffset = (int)(p - string) - 3; return PCRE_UTF8_ERR13; } - v = ((c & 0x07) << 18) | ((d & 0x3f) << 12) | ((p[-1] & 0x3f) << 6) | (*p & 0x3f); break; /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be @@ -290,14 +287,6 @@ for (p = string; length-- > 0; p++) *erroroffset = (int)(p - string) - ab; return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12; } - - /* Reject non-characters. The pointer p is currently at the last byte of the - character. */ - if ((v & 0xfffeu) == 0xfffeu || (v >= 0xfdd0 && v <= 0xfdef)) - { - *erroroffset = (int)(p - string) - ab; - return PCRE_UTF8_ERR22; - } } #else /* Not SUPPORT_UTF */ diff --git a/ext/pcre/pcrelib/pcre_xclass.c b/ext/pcre/pcrelib/pcre_xclass.c index fa73cd8c9..ad153be78 100644 --- a/ext/pcre/pcrelib/pcre_xclass.c +++ b/ext/pcre/pcrelib/pcre_xclass.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2012 University of Cambridge + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -128,55 +128,120 @@ while ((t = *data++) != XCL_END) else /* XCL_PROP & XCL_NOTPROP */ { const ucd_record *prop = GET_UCD(c); + BOOL isprop = t == XCL_PROP; switch(*data) { case PT_ANY: - if (t == XCL_PROP) return !negated; + if (isprop) return !negated; break; case PT_LAMP: if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || - prop->chartype == ucp_Lt) == (t == XCL_PROP)) return !negated; + prop->chartype == ucp_Lt) == isprop) return !negated; break; case PT_GC: - if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == (t == XCL_PROP)) + if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == isprop) return !negated; break; case PT_PC: - if ((data[1] == prop->chartype) == (t == XCL_PROP)) return !negated; + if ((data[1] == prop->chartype) == isprop) return !negated; break; case PT_SC: - if ((data[1] == prop->script) == (t == XCL_PROP)) return !negated; + if ((data[1] == prop->script) == isprop) return !negated; break; case PT_ALNUM: if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || - PRIV(ucp_gentype)[prop->chartype] == ucp_N) == (t == XCL_PROP)) + PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop) return !negated; break; - case PT_SPACE: /* Perl space */ - if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) - == (t == XCL_PROP)) - return !negated; - break; + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + case PT_SPACE: /* Perl space */ case PT_PXSPACE: /* POSIX space */ - if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || - c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || - c == CHAR_FF || c == CHAR_CR) == (t == XCL_PROP)) - return !negated; + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (isprop) return !negated; + break; + + default: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == isprop) + return !negated; + break; + } break; case PT_WORD: if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE) - == (t == XCL_PROP)) + == isprop) + return !negated; + break; + + case PT_UCNC: + if (c < 0xa0) + { + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT) == isprop) + return !negated; + } + else + { + if ((c < 0xd800 || c > 0xdfff) == isprop) + return !negated; + } + break; + + /* The following three properties can occur only in an XCLASS, as there + is no \p or \P coding for them. */ + + /* Graphic character. Implement this as not Z (space or separator) and + not C (other), except for Cf (format) with a few exceptions. This seems + to be what Perl does. The exceptional characters are: + + U+061C Arabic Letter Mark + U+180E Mongolian Vowel Separator + U+2066 - U+2069 Various "isolate"s + */ + + case PT_PXGRAPH: + if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z && + (PRIV(ucp_gentype)[prop->chartype] != ucp_C || + (prop->chartype == ucp_Cf && + c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069)) + )) == isprop) + return !negated; + break; + + /* Printable character: same as graphic, with the addition of Zs, i.e. + not Zl and not Zp, and U+180E. */ + + case PT_PXPRINT: + if ((prop->chartype != ucp_Zl && + prop->chartype != ucp_Zp && + (PRIV(ucp_gentype)[prop->chartype] != ucp_C || + (prop->chartype == ucp_Cf && + c != 0x061c && (c < 0x2066 || c > 0x2069)) + )) == isprop) + return !negated; + break; + + /* Punctuation: all Unicode punctuation, plus ASCII characters that + Unicode treats as symbols rather than punctuation, for Perl + compatibility (these are $+<=>^`|~). */ + + case PT_PXPUNCT: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P || + (c < 256 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop) return !negated; break; diff --git a/ext/pcre/pcrelib/pcreposix.c b/ext/pcre/pcrelib/pcreposix.c index 15195c0e9..7cf4a4a65 100644 --- a/ext/pcre/pcrelib/pcreposix.c +++ b/ext/pcre/pcrelib/pcreposix.c @@ -110,7 +110,7 @@ static const int eint[] = { REG_BADPAT, /* POSIX collating elements are not supported */ REG_INVARG, /* this version of PCRE is not compiled with PCRE_UTF8 support */ REG_BADPAT, /* spare error */ - REG_BADPAT, /* character value in \x{...} sequence is too large */ + REG_BADPAT, /* character value in \x{} or \o{} is too large */ /* 35 */ REG_BADPAT, /* invalid condition (?(0) */ REG_BADPAT, /* \C not allowed in lookbehind assertion */ @@ -162,7 +162,15 @@ static const int eint[] = { /* 75 */ REG_BADPAT, /* overlong MARK name */ REG_BADPAT, /* character value in \u.... sequence is too large */ - REG_BADPAT /* invalid UTF-32 string (should not occur) */ + REG_BADPAT, /* invalid UTF-32 string (should not occur) */ + REG_BADPAT, /* setting UTF is disabled by the application */ + REG_BADPAT, /* non-hex character in \\x{} (closing brace missing?) */ + /* 80 */ + REG_BADPAT, /* non-octal character in \o{} (closing brace missing?) */ + REG_BADPAT, /* missing opening brace after \o */ + REG_BADPAT, /* parentheses too deeply nested */ + REG_BADPAT, /* invalid range in character class */ + REG_BADPAT /* group name must start with a non-digit */ }; /* Table of texts corresponding to POSIX error codes */ diff --git a/ext/pcre/pcrelib/testdata/grepbinary b/ext/pcre/pcrelib/testdata/grepbinary Binary files differnew file mode 100644 index 000000000..5efa13020 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/grepbinary diff --git a/ext/pcre/pcrelib/testdata/grepfilelist b/ext/pcre/pcrelib/testdata/grepfilelist new file mode 100644 index 000000000..dd73ec7f9 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/grepfilelist @@ -0,0 +1,3 @@ +testdata/grepinputv + +testdata/grepinputx diff --git a/ext/pcre/pcrelib/testdata/grepinput3 b/ext/pcre/pcrelib/testdata/grepinput3 new file mode 100644 index 000000000..7409cfc07 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/grepinput3 @@ -0,0 +1,15 @@ +triple: t1_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t2_txt s1_tag s_txt p_tag p_txt o_tag +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +triple: t3_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t4_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t5_txt s1_tag s_txt p_tag p_txt o_tag +o_txt + +triple: t6_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t7_txt s1_tag s_txt p_tag p_txt o_tag o_txt diff --git a/ext/pcre/pcrelib/testdata/grepinput8 b/ext/pcre/pcrelib/testdata/grepinput8 index 7163aa69d..c4b8c440f 100644 --- a/ext/pcre/pcrelib/testdata/grepinput8 +++ b/ext/pcre/pcrelib/testdata/grepinput8 @@ -1,10 +1,10 @@ X one -X twoX threeX four
X five +X twoX threeX four
X five
X six X seven…X eight
X nine
X ten Before 111 -Before 222
Before 333…Match +Before 222
Before 333…Match
After 111 After 222
After 333 And so on and so on diff --git a/ext/pcre/pcrelib/testdata/grepinputv b/ext/pcre/pcrelib/testdata/grepinputv new file mode 100644 index 000000000..d33d326b0 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/grepinputv @@ -0,0 +1,4 @@ +The quick brown +fox jumps +over the lazy dog. +This time it jumps and jumps and jumps. diff --git a/ext/pcre/pcrelib/testdata/grepoutput b/ext/pcre/pcrelib/testdata/grepoutput index 733b9d6a3..9bf9d9d62 100644 --- a/ext/pcre/pcrelib/testdata/grepoutput +++ b/ext/pcre/pcrelib/testdata/grepoutput @@ -705,3 +705,41 @@ RC=0 ./testdata/grepinput:[1;31mzero[00m|[1;31ma[00m ./testdata/grepinput:[1;31m.[00m|[1;31mzero[00m|[1;31mthe[00m|[1;31m.[00m RC=0 +---------------------------- Test 102 ----------------------------- +2: +5: +7: +9: +12: +14: +RC=0 +---------------------------- Test 103 ----------------------------- +RC=0 +---------------------------- Test 104 ----------------------------- +2: +5: +7: +9: +12: +14: +RC=0 +---------------------------- Test 105 ----------------------------- +[1;31m[00mtriple: t1_txt s1_tag s_txt p_tag p_txt o_tag o_txt +[1;31m[00m +[1;31m[00mtriple: t2_txt s1_tag s_txt p_tag p_txt o_tag +[1;31m[00mLorem [1;31mipsum[00m dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +[1;31m[00m +[1;31m[00mtriple: t3_txt s2_tag s_txt p_tag p_txt o_tag o_txt +[1;31m[00m +[1;31m[00mtriple: t4_txt s1_tag s_txt p_tag p_txt o_tag o_txt +[1;31m[00m +[1;31m[00mtriple: t5_txt s1_tag s_txt p_tag p_txt o_tag +[1;31m[00mo_txt +[1;31m[00m +[1;31m[00mtriple: t6_txt s2_tag s_txt p_tag p_txt o_tag o_txt +[1;31m[00m +[1;31m[00mtriple: t7_txt s1_tag s_txt p_tag p_txt o_tag o_txt +RC=0 +---------------------------- Test 106 ----------------------------- +a +RC=0 diff --git a/ext/pcre/pcrelib/testdata/grepoutput8 b/ext/pcre/pcrelib/testdata/grepoutput8 index 385266b3c..91493bdcf 100644 --- a/ext/pcre/pcrelib/testdata/grepoutput8 +++ b/ext/pcre/pcrelib/testdata/grepoutput8 @@ -1,12 +1,12 @@ ---------------------------- Test U1 ------------------------------ 1:X one -2:X two3:X three4:X four
5:X five +2:X two3:X three4:X four
5:X five
6:X six 7:X seven…8:X eight
9:X nine
10:X ten RC=0 ---------------------------- Test U2 ------------------------------ 12-Before 111 -13-Before 222
14-Before 333…15:Match +13-Before 222
14-Before 333…15:Match
16-After 111 17-After 222
18-After 333 RC=0 diff --git a/ext/pcre/pcrelib/testdata/grepoutputN b/ext/pcre/pcrelib/testdata/grepoutputN index 6760314aa..1f9f8801e 100644 --- a/ext/pcre/pcrelib/testdata/grepoutputN +++ b/ext/pcre/pcrelib/testdata/grepoutputN @@ -1,16 +1,16 @@ ----------------------------- Test N1 ------------------------------ -1:abc
2:def
---------------------------- Test N2 ------------------------------ -1:abc
def +---------------------------- Test N1 ------------------------------
+1:abc
2:def
---------------------------- Test N2 ------------------------------
+1:abc
def
2:ghi -jkl---------------------------- Test N3 ------------------------------ +jkl---------------------------- Test N3 ------------------------------
2:def
3: ghi -jkl---------------------------- Test N4 ------------------------------ +jkl---------------------------- Test N4 ------------------------------
2:ghi -jkl---------------------------- Test N5 ------------------------------ -1:abc
2:def +jkl---------------------------- Test N5 ------------------------------
+1:abc
2:def
3:ghi -4:jkl---------------------------- Test N6 ------------------------------ -1:abc
2:def +4:jkl---------------------------- Test N6 ------------------------------
+1:abc
2:def
3:ghi 4:jkl
\ No newline at end of file diff --git a/ext/pcre/pcrelib/testdata/greppatN4 b/ext/pcre/pcrelib/testdata/greppatN4 new file mode 100644 index 000000000..7112d84fa --- /dev/null +++ b/ext/pcre/pcrelib/testdata/greppatN4 @@ -0,0 +1,2 @@ +xxx +jkl
\ No newline at end of file diff --git a/ext/pcre/pcrelib/testdata/saved16 b/ext/pcre/pcrelib/testdata/saved16 Binary files differnew file mode 100644 index 000000000..f86326c9f --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved16 diff --git a/ext/pcre/pcrelib/testdata/saved16BE-1 b/ext/pcre/pcrelib/testdata/saved16BE-1 Binary files differnew file mode 100644 index 000000000..e6edddc6e --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved16BE-1 diff --git a/ext/pcre/pcrelib/testdata/saved16BE-2 b/ext/pcre/pcrelib/testdata/saved16BE-2 Binary files differnew file mode 100644 index 000000000..c91ce37bd --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved16BE-2 diff --git a/ext/pcre/pcrelib/testdata/saved16LE-1 b/ext/pcre/pcrelib/testdata/saved16LE-1 Binary files differnew file mode 100644 index 000000000..5035ec072 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved16LE-1 diff --git a/ext/pcre/pcrelib/testdata/saved16LE-2 b/ext/pcre/pcrelib/testdata/saved16LE-2 Binary files differnew file mode 100644 index 000000000..656c058d2 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved16LE-2 diff --git a/ext/pcre/pcrelib/testdata/saved32 b/ext/pcre/pcrelib/testdata/saved32 Binary files differnew file mode 100644 index 000000000..a4e27041c --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved32 diff --git a/ext/pcre/pcrelib/testdata/saved32BE-1 b/ext/pcre/pcrelib/testdata/saved32BE-1 Binary files differnew file mode 100644 index 000000000..b4c2ffe42 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved32BE-1 diff --git a/ext/pcre/pcrelib/testdata/saved32BE-2 b/ext/pcre/pcrelib/testdata/saved32BE-2 Binary files differnew file mode 100644 index 000000000..79bb5e880 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved32BE-2 diff --git a/ext/pcre/pcrelib/testdata/saved32LE-1 b/ext/pcre/pcrelib/testdata/saved32LE-1 Binary files differnew file mode 100644 index 000000000..49392b89a --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved32LE-1 diff --git a/ext/pcre/pcrelib/testdata/saved32LE-2 b/ext/pcre/pcrelib/testdata/saved32LE-2 Binary files differnew file mode 100644 index 000000000..5f64af9b9 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved32LE-2 diff --git a/ext/pcre/pcrelib/testdata/saved8 b/ext/pcre/pcrelib/testdata/saved8 Binary files differnew file mode 100644 index 000000000..8cf0c1312 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/saved8 diff --git a/ext/pcre/pcrelib/testdata/testinput1 b/ext/pcre/pcrelib/testdata/testinput1 index e6d048ad8..7b36360d0 100644 --- a/ext/pcre/pcrelib/testdata/testinput1 +++ b/ext/pcre/pcrelib/testdata/testinput1 @@ -1,6 +1,8 @@ /-- This set of tests is for features that are compatible with all versions of - Perl >= 5.10, in non-UTF-8 mode. It should run clean for both the 8-bit and - 16-bit PCRE libraries. --/ + Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit, + and 32-bit PCRE libraries. --/ + +< forbid 89?=ABCDEFfGILMNPTUWXZ< /the quick brown fox/ the quick brown fox @@ -1483,14 +1485,19 @@ abc\100\x30 abc\100\060 abc\100\60 + +/^A\8B\9C$/ + A8B9C + *** Failers + A\08B\09C + +/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/ + ABCDEFGHIHI -/abc\81/ - abc\081 - abc\0\x38\x31 - -/abc\91/ - abc\091 - abc\0\x39\x31 +/^[A\8B\9C]+$/ + A8B9C + *** Failers + A8B9C\x00 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/ abcdefghijkllS @@ -3654,13 +3661,6 @@ /a*/g abbab -/^[a-\d]/ - abcde - -things - 0digit - *** Failers - bcdef - /^[\d-a]/ abcde -things @@ -3773,9 +3773,9 @@ abc123abc abc123bc -/-- This tests for an IPv6 address in the form where it can have up to --/ -/-- eight components, one and only one of which is empty. This must be --/ -/-- an internal component. --/ +/-- This tests for an IPv6 address in the form where it can have up to + eight components, one and only one of which is empty. This must be + an internal component. --/ /^(?!:) # colon disallowed at start (?: # start of item @@ -4221,9 +4221,6 @@ ab bc -/^(?=(a)){0}b(?1)/ - backgammon - /^(?=(?1))?[az]([abc])d/ abd zcdxx @@ -4656,16 +4653,10 @@ /(?<pn> \( ( [^()]++ | (?&pn) )* \) )/x (ab(cd)ef) -/^(?!a(*SKIP)b)/ - ac - /^(?=a(*SKIP)b|ac)/ ** Failers ac -/^(?=a(*THEN)b|ac)/ - ac - /^(?=a(*PRUNE)b)/ ab ** Failers @@ -4674,9 +4665,6 @@ /^(?=a(*ACCEPT)b)/ ac -/^(?(?!a(*SKIP)b))/ - ac - /(?>a\Kb)/ ab @@ -4899,33 +4887,15 @@ however, we need the complication for Perl. ---/ /(A (A|B(*ACCEPT)|C) D)(E)/x AB -/\A.*?(?:a|b(*THEN)c)/ - ba - -/\A.*?(?:a|bc)/ - ba - -/\A.*?(a|b(*THEN)c)/ - ba - /\A.*?(a|bc)/ ba -/\A.*?(?:a|b(*THEN)c)++/ - ba - /\A.*?(?:a|bc)++/ ba -/\A.*?(a|b(*THEN)c)++/ - ba - /\A.*?(a|bc)++/ ba -/\A.*?(?:a|b(*THEN)c|d)/ - ba - /\A.*?(?:a|bc|d)/ ba @@ -5253,9 +5223,6 @@ name were given. ---/ /(a(*COMMIT)b){0}a(?1)|aac/ aac -/(?!a(*COMMIT)b)ac|cd/ - ac - /((?:a?)*)*c/ aac @@ -5303,4 +5270,400 @@ name were given. ---/ "(?>.*?)foo" abcdfooxyz +/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/ + ac + +/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/ + ac + +/(?<=(*SKIP)ac)a/ + aa + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + +/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K + acacd + +/A(*SKIP:m)x|A(*SKIP:n)x|AB/K + AB + +/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K + acacd + +/-- Tests that try to figure out how Perl works. My hypothesis is that the + first verb that is backtracked onto is the one that acts. This seems to be + the case almost all the time, but there is one exception that is perhaps a + bug. --/ + +/-- This matches "aaaac"; each PRUNE advances one character until the subject + no longer starts with 5 'a's. --/ + +/aaaaa(*PRUNE)b|a+c/ + aaaaaac + +/-- Putting SKIP in front of PRUNE makes no difference, as it is never +backtracked onto, whether or not it has a label. --/ + +/aaaaa(*SKIP)(*PRUNE)b|a+c/ + aaaaaac + +/aaaaa(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + +/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + +/-- Putting THEN in front makes no difference. */ + +/aaaaa(*THEN)(*PRUNE)b|a+c/ + aaaaaac + +/-- However, putting COMMIT in front of the prune changes it to "no match". I + think this is inconsistent and possibly a bug. For the moment, running this + test is moved out of the Perl-compatible file. --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + + +/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/ + +/-- This matches "ac" because SKIP forces the next match to start on the + sixth "a". --/ + +/aaaaa(*SKIP)b|a+c/ + aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*SKIP)b|a+c/ + aaaaaac + +/-- Putting THEN in front makes no difference. --/ + +/aaaaa(*THEN)(*SKIP)b|a+c/ + aaaaaac + +/-- In this case, neither does COMMIT. This still matches "ac". --/ + +/aaaaa(*COMMIT)(*SKIP)b|a+c/ + aaaaaac + +/-- This gives "no match", as expected. --/ + +/aaaaa(*COMMIT)b|a+c/ + aaaaaac + + +/------ Tests using THEN ------/ + +/-- This matches "aaaaaac", as expected. --/ + +/aaaaa(*THEN)b|a+c/ + aaaaaac + +/-- Putting SKIP in front makes no difference. --/ + +/aaaaa(*SKIP)(*THEN)b|a+c/ + aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*THEN)b|a+c/ + aaaaaac + +/-- Putting COMMIT in front makes no difference. --/ + +/aaaaa(*COMMIT)(*THEN)b|a+c/ + aaaaaac + +/-- End of "priority" tests --/ + +/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + +/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + +/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + +/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + +/aaa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + +/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K + aaaaaac + +/.?(a|b(*THEN)c)/ + ba + +/(a(*COMMIT)b)c|abd/ + abc + abd + +/(?=a(*COMMIT)b)abc|abd/ + abc + abd + +/(?>a(*COMMIT)b)c|abd/ + abc + abd + +/a(?=b(*COMMIT)c)[^d]|abd/ + abd + abc + +/a(?=bc).|abd/ + abd + abc + +/a(?>b(*COMMIT)c)d|abd/ + abceabd + +/a(?>bc)d|abd/ + abceabd + +/(?>a(*COMMIT)b)c|abd/ + abd + +/(?>a(*COMMIT)c)d|abd/ + abd + +/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ + ac + +/-- These tests were formerly in test 2, but changes in PCRE and Perl have + made them compatible. --/ + +/^(a)?(?(1)a|b)+$/ + *** Failers + a + +/(?=a\Kb)ab/ + ab + +/(?!a\Kb)ac/ + ac + +/^abc(?<=b\Kc)d/ + abcd + +/^abc(?<!b\Kq)d/ + abcd + + +/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC + +/^((abc|abcx)(*THEN)y|abcd)/ + abcd + *** Failers + abcxy + +/^((yes|no)(*THEN)(*F))?/ + yes + +/(A (.*) C? (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz + +/(A (.*) C? (*THEN) | A D) z/x +AbcdCBefgBhiBqz + +/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x +AbcdCBefgBhiBqz + +/(A (.*) C? (*THEN) | A D) \s* z/x +AbcdCBefgBhiBqz + +/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz + +/(A (.*) (?:C|) (*THEN) | A D) z/x +AbcdCBefgBhiBqz + +/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz + +/(A (.*) C{0,6} (*THEN) | A D) z/x +AbcdCBefgBhiBqz + +/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x +AbcdCEBefgBhiBqz + +/(A (.*) (CE){0,6} (*THEN) | A D) z/x +AbcdCEBefgBhiBqz + +/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz + +/(A (.*) (CE*){0,6} (*THEN) | A D) z/x +AbcdCBefgBhiBqz + +/(?=a(*COMMIT)b|ac)ac|ac/ + ac + +/(?=a(*COMMIT)b|(ac)) ac | (a)c/x + ac + +/--------/ + +/(?(?!b(*THEN)a)bn|bnn)/ + bnn + +/(?!b(*SKIP)a)bn|bnn/ + bnn + +/(?(?!b(*SKIP)a)bn|bnn)/ + bnn + +/(?!b(*PRUNE)a)bn|bnn/ + bnn + +/(?(?!b(*PRUNE)a)bn|bnn)/ + bnn + +/(?!b(*COMMIT)a)bn|bnn/ + bnn + +/(?(?!b(*COMMIT)a)bn|bnn)/ + bnn + +/(?=b(*SKIP)a)bn|bnn/ + bnn + +/(?=b(*THEN)a)bn|bnn/ + bnn + + /^(?!a(*SKIP)b)/ + ac + + /^(?!a(*SKIP)b)../ + acd + +/(?!a(*SKIP)b)../ + acd + +/^(?(?!a(*SKIP)b))/ + ac + +/^(?!a(*PRUNE)b)../ + acd + +/(?!a(*PRUNE)b)../ + acd + + /(?!a(*COMMIT)b)ac|cd/ + ac + +/\A.*?(?:a|bc)/ + ba + +/^(A(*THEN)B|C(*THEN)D)/ + CD + +/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + +/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + +/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + +/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + +/^\d*\w{4}/ + 1234 + 123 + +/^[^b]*\w{4}/ + aaaa + aaa + +/^[^b]*\w{4}/i + aaaa + aaa + +/^a*\w{4}/ + aaaa + aaa + +/^a*\w{4}/i + aaaa + aaa + +/(?(?=ab)ab)/+ + ca + cd + +/(?:(?<n>foo)|(?<n>bar))\k<n>/J + foofoo + barbar + +/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/J + AfooA + AbarA + ** Failers + Afoofoo + Abarbar + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + +/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ + Ax + BAxy + +/^A\xZ/ + A\0Z + +/^A\o{123}B/ + A\123B + +/ ^ a + + b $ /x + aaaab + +/ ^ a + #comment + + b $ /x + aaaab + +/ ^ a + #comment + #comment + + b $ /x + aaaab + +/ ^ (?> a + ) b $ /x + aaaab + +/ ^ ( a + ) + + \w $ /x + aaaab + +/(?:a\Kb)*+/+ + ababc + +/(?>a\Kb)*/+ + ababc + +/(?:a\Kb)*/+ + ababc + +/(a\Kb)*+/+ + ababc + +/(a\Kb)*/+ + ababc + /-- End of testinput1 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput10 b/ext/pcre/pcrelib/testdata/testinput10 index f20dcb3d1..93ddb3a75 100644 --- a/ext/pcre/pcrelib/testdata/testinput10 +++ b/ext/pcre/pcrelib/testdata/testinput10 @@ -139,6 +139,12 @@ /^\p{Cf}/8 \x{601} + \x{180e} + \x{061c} + \x{2066} + \x{2067} + \x{2068} + \x{2069} ** Failers \x{09f} @@ -199,11 +205,12 @@ /^\p{Mn}/8 \x{300} + \x{1a1b} ** Failers X \x{903} -/^\p{Nd}+/8 +/^\p{Nd}+/8O 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a} \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa} \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970} @@ -243,6 +250,8 @@ ] } \x{f3b} + \x{2309} + \x{230b} ** Failers X \x{203f} @@ -250,7 +259,7 @@ [ { \x{f3c} - + /^\p{Pf}/8 \x{bb} \x{2019} @@ -277,6 +286,8 @@ [ { \x{f3c} + \x{2308} + \x{230a} ** Failers X ) @@ -326,7 +337,6 @@ \ \ \x{a0} \x{1680} - \x{180e} \x{2000} \x{2001} ** Failers @@ -423,23 +433,23 @@ ** Failers 1234 -/\D+/8 +/\D+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/\P{Nd}+/8 +/\P{Nd}+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\D]+/8 +/[\D]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\P{Nd}]+/8 +/[\P{Nd}]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\D\P{Nd}]+/8 +/[\D\P{Nd}]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -886,19 +896,19 @@ ** Failers \x{0b} -/^>\p{Xsp}+/8 +/^>\p{Xsp}+/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} -/^>\p{Xsp}*/8 +/^>\p{Xsp}*/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} -/^>\p{Xsp}{2,9}/8 +/^>\p{Xsp}{2,9}/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} -/^>[\p{Xsp}]/8 +/^>[\p{Xsp}]/8O >\x{2028}\x{0b} -/^>[\p{Xsp}]+/8 +/^>[\p{Xsp}]+/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} /^>\p{Xps}/8 @@ -1334,4 +1344,76 @@ /is{2}t/8i iskt +/^\p{Xuc}/8 + $abc + @abc + `abc + \x{1234}abc + ** Failers + abc + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\P{Xuc}/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^[\P{Xuc}]/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^A\s+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + /-- End of testinput10 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput11 b/ext/pcre/pcrelib/testdata/testinput11 new file mode 100644 index 000000000..391ada7aa --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput11 @@ -0,0 +1,135 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM + +/(?s)(.*X|^B)/BM + +/(?s:.*X|^B)/BM + +/^[[:alnum:]]/BM + +/#/IxMD + +/a#/IxMD + +/x?+/BM + +/x++/BM + +/x{1,3}+/BM + +/(x)*+/BM + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM + +/(a(?1)b)/BM + +/(a(?1)+b)/BM + +/a(?P<name1>b|c)d(?P<longername2>e)/BM + +/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM + +/(?P<a>a)...(?P=a)bbb(?P>a)d/BM + +/abc(?C255)de(?C)f/BM + +/abcde/CBM + +/\x{100}/8BM + +/\x{1000}/8BM + +/\x{10000}/8BM + +/\x{100000}/8BM + +/\x{10ffff}/8BM + +/\x{110000}/8BM + +/[\x{ff}]/8BM + +/[\x{100}]/8BM + +/\x80/8BM + +/\xff/8BM + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M + +/\x{65e5}\x{672c}\x{8a9e}/D8M + +/[\x{100}]/8BM + +/[Z\x{100}]/8BM + +/^[\x{100}\E-\Q\E\x{150}]/B8M + +/^[\QÄ€\E-\QÅ\E]/B8M + +/^[\QÄ€\E-\QÅ\E/B8M + +/[\p{L}]/BM + +/[\p{^L}]/BM + +/[\P{L}]/BM + +/[\P{^L}]/BM + +/[abc\p{L}\x{0660}]/8BM + +/[\p{Nd}]/8BM + +/[\p{Nd}+-]+/8BM + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM + +/[\x{105}-\x{109}]/8iBM + +/( ( (?(1)0|) )* )/xBM + +/( (?(1)0|)* )/xBM + +/[a]/BM + +/[a]/8BM + +/[\xaa]/BM + +/[\xaa]/8BM + +/[^a]/BM + +/[^a]/8BM + +/[^\xaa]/BM + +/[^\xaa]/8BM + +/[^\d]/8WB + +/[[:^alpha:][:^cntrl:]]+/8WB + +/[[:^cntrl:][:^alpha:]]+/8WB + +/[[:alpha:]]+/8WB + +/[[:^alpha:]\S]+/8WB + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B + +/-- End of testinput11 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput12 b/ext/pcre/pcrelib/testdata/testinput12 new file mode 100644 index 000000000..5d727af26 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput12 @@ -0,0 +1,90 @@ +/-- This test is run only when JIT support is available. It checks for a +successful and an unsuccessful JIT compile and save and restore behaviour, +and a couple of things that are different with JIT. --/ + +/abc/S+I + +/(?(?C1)(?=a)a)/S+I + +/(?(?C1)(?=a)a)/S!+I + +/abc/S+I>testsavedregex + +<testsavedregex + abc + +/a*/SI + +/(?(R)a*(?1)|((?R))b)/S+ + aaaabcde + +/-- Test various compile modes --/ + +/abcd/S++ + abcd + xyz + +/abcd/S+ + abcd + ab\P + ab\P\P + xyz + +/abcd/S++ + abcd + ab\P + ab\P\P + xyz + +/abcd/S++1 + abcd + ab\P + ab\P\P + xyz + xyz\P + +/abcd/S++2 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++3 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++4 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++5 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++6 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++7 + abcd + ab\P + ab\P\P + xyz + +/abcd/S++2I + +/(*NO_START_OPT)a(*:m)b/KS++ + a + +/^12345678abcd/mS++ + 12345678abcd + +/-- End of testinput12 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput13 b/ext/pcre/pcrelib/testdata/testinput13 new file mode 100644 index 000000000..c7bc67bb1 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput13 @@ -0,0 +1,9 @@ +/-- This test is run only when JIT support is not available. It checks that an +attempt to use it has the expected behaviour. It also tests things that +are different without JIT. --/ + +/abc/S+I + +/a*/SI + +/-- End of testinput13 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput14 b/ext/pcre/pcrelib/testdata/testinput14 new file mode 100644 index 000000000..325ed9e36 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput14 @@ -0,0 +1,343 @@ +/-- This set of tests is run only with the 8-bit library. They do not require + UTF-8 or Unicode property support. The file starts with all the tests of + the POSIX interface, because that is supported only with the 8-bit library. + --/ + +< forbid 8W + +/abc/P + abc + *** Failers + +/^abc|def/P + abcdef + abcdef\B + +/.*((abc)$|(def))/P + defabc + \Zdefabc + +/the quick brown fox/P + the quick brown fox + *** Failers + The Quick Brown Fox + +/the quick brown fox/Pi + the quick brown fox + The Quick Brown Fox + +/abc.def/P + *** Failers + abc\ndef + +/abc$/P + abc + abc\n + +/(abc)\2/P + +/(abc\1)/P + abc + +/a*(b+)(z)(z)/P + aaaabbbbzzzz + aaaabbbbzzzz\O0 + aaaabbbbzzzz\O1 + aaaabbbbzzzz\O2 + aaaabbbbzzzz\O3 + aaaabbbbzzzz\O4 + aaaabbbbzzzz\O5 + +/ab.cd/P + ab-cd + ab=cd + ** Failers + ab\ncd + +/ab.cd/Ps + ab-cd + ab=cd + ab\ncd + +/a(b)c/PN + abc + +/a(?P<name>b)c/PN + abc + +/a?|b?/P + abc + ** Failers + ddd\N + +/\w+A/P + CDAAAAB + +/\w+A/PU + CDAAAAB + +/\Biss\B/I+P + Mississippi + +/abc/\P + +/-- End of POSIX tests --/ + +/a\Cb/ + aXb + a\nb + ** Failers (too big char) + A\x{123}B + A\o{443}B + +/\x{100}/I + +/\o{400}/I + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI + +/-- Although this saved pattern was compiled with link-size=2, it does no harm +to run this test with other link sizes because it is going to generated a +"compiled in wrong mode" error as soon as it is loaded, so the link size does +not matter. --/ + +<!testsaved16 + +<!testsaved32 + +/\h/SI + +/\H/SI + +/\v/SI + +/\V/SI + +/\R/SI + +/[\h]/BZ + >\x09< + +/[\h]+/BZ + >\x09\x20\xa0< + +/[\v]/BZ + +/[\H]/BZ + +/[^\h]/BZ + +/[\V]/BZ + +/[\x0a\V]/BZ + +/\777/I + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + +/\u0100/<JS> + +/[\u0100-\u0200]/<JS> + +/[^\x00-a]{12,}[^b-\xff]*/BZ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ + +/-- End of testinput14 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput15 b/ext/pcre/pcrelib/testdata/testinput15 new file mode 100644 index 000000000..83e267734 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput15 @@ -0,0 +1,366 @@ +/-- This set of tests is for UTF-8 support but not Unicode property support, + and is relevant only to the 8-bit library. --/ + +< forbid W + +/X(\C{3})/8 + X\x{1234} + +/X(\C{4})/8 + X\x{1234}YZ + +/X\C*/8 + XYZabcdce + +/X\C*?/8 + XYZabcde + +/X\C{3,5}/8 + Xabcdefg + X\x{1234} + X\x{1234}YZ + X\x{1234}\x{512} + X\x{1234}\x{512}YZ + +/X\C{3,5}?/8 + Xabcdefg + X\x{1234} + X\x{1234}YZ + X\x{1234}\x{512} + +/a\Cb/8 + aXb + a\nb + +/a\C\Cb/8 + a\x{100}b + +/ab\Cde/8 + abXde + +/a\C\Cb/8 + a\x{100}b + ** Failers + a\x{12257}b + +/[Ã]/8 + +/Ã/8 + +/ÃÃÃxxx/8 + +/ÃÃÃxxx/8?DZSSO + +/badutf/8 + \xdf + \xef + \xef\x80 + \xf7 + \xf7\x80 + \xf7\x80\x80 + \xfb + \xfb\x80 + \xfb\x80\x80 + \xfb\x80\x80\x80 + \xfd + \xfd\x80 + \xfd\x80\x80 + \xfd\x80\x80\x80 + \xfd\x80\x80\x80\x80 + \xdf\x7f + \xef\x7f\x80 + \xef\x80\x7f + \xf7\x7f\x80\x80 + \xf7\x80\x7f\x80 + \xf7\x80\x80\x7f + \xfb\x7f\x80\x80\x80 + \xfb\x80\x7f\x80\x80 + \xfb\x80\x80\x7f\x80 + \xfb\x80\x80\x80\x7f + \xfd\x7f\x80\x80\x80\x80 + \xfd\x80\x7f\x80\x80\x80 + \xfd\x80\x80\x7f\x80\x80 + \xfd\x80\x80\x80\x7f\x80 + \xfd\x80\x80\x80\x80\x7f + \xed\xa0\x80 + \xc0\x8f + \xe0\x80\x8f + \xf0\x80\x80\x8f + \xf8\x80\x80\x80\x8f + \xfc\x80\x80\x80\x80\x8f + \x80 + \xfe + \xff + +/badutf/8 + \xfb\x80\x80\x80\x80 + \xfd\x80\x80\x80\x80\x80 + \xf7\xbf\xbf\xbf + +/shortutf/8 + \P\P\xdf + \P\P\xef + \P\P\xef\x80 + \P\P\xf7 + \P\P\xf7\x80 + \P\P\xf7\x80\x80 + \P\P\xfb + \P\P\xfb\x80 + \P\P\xfb\x80\x80 + \P\P\xfb\x80\x80\x80 + \P\P\xfd + \P\P\xfd\x80 + \P\P\xfd\x80\x80 + \P\P\xfd\x80\x80\x80 + \P\P\xfd\x80\x80\x80\x80 + +/anything/8 + \xc0\x80 + \xc1\x8f + \xe0\x9f\x80 + \xf0\x8f\x80\x80 + \xf8\x87\x80\x80\x80 + \xfc\x83\x80\x80\x80\x80 + \xfe\x80\x80\x80\x80\x80 + \xff\x80\x80\x80\x80\x80 + \xc3\x8f + \xe0\xaf\x80 + \xe1\x80\x80 + \xf0\x9f\x80\x80 + \xf1\x8f\x80\x80 + \xf8\x88\x80\x80\x80 + \xf9\x87\x80\x80\x80 + \xfc\x84\x80\x80\x80\x80 + \xfd\x83\x80\x80\x80\x80 + \?\xf8\x88\x80\x80\x80 + \?\xf9\x87\x80\x80\x80 + \?\xfc\x84\x80\x80\x80\x80 + \?\xfd\x83\x80\x80\x80\x80 + +/\x{100}/8DZ + +/\x{1000}/8DZ + +/\x{10000}/8DZ + +/\x{100000}/8DZ + +/\x{10ffff}/8DZ + +/[\x{ff}]/8DZ + +/[\x{100}]/8DZ + +/\x80/8DZ + +/\xff/8DZ + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 + \x{D55c}\x{ad6d}\x{C5B4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 + \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 + +/\x{084}/DZ8 + +/\x{104}/DZ8 + +/\x{861}/DZ8 + +/\x{212ab}/DZ8 + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + X\nabc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers + a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ + \x{f1} + \x{bf} + \x{100} + \x{1000} + *** Failers + \x{c0} + \x{f0} + +/Ä€{3,4}/8SDZ + \x{100}\x{100}\x{100}\x{100\x{100} + +/(\x{100}+|x)/8SDZ + +/(\x{100}*a|x)/8SDZ + +/(\x{100}{0,2}a|x)/8SDZ + +/(\x{100}{1,2}a|x)/8SDZ + +/\x{100}/8DZ + +/a\x{100}\x{101}*/8DZ + +/a\x{100}\x{101}+/8DZ + +/[^\x{c4}]/DZ + +/[\x{100}]/8DZ + \x{100} + Z\x{100} + \x{100}Z + *** Failers + +/[\xff]/DZ8 + >\x{ff}< + +/[^\xff]/8DZ + +/\x{100}abc(xyz(?1))/8DZ + +/a\x{1234}b/P8 + a\x{1234}b + +/\777/8I + \x{1ff} + \777 + +/\x{100}+\x{200}/8DZ + +/\x{100}+X/8DZ + +/^[\QÄ€\E-\QÅ\E/BZ8 + +/-- This tests the stricter UTF-8 check according to RFC 3629. --/ + +/X/8 + \x{d800} + \x{d800}\? + \x{da00} + \x{da00}\? + \x{dfff} + \x{dfff}\? + \x{110000} + \x{110000}\? + \x{2000000} + \x{2000000}\? + \x{7fffffff} + \x{7fffffff}\? + +/(*UTF8)\x{1234}/ + abcd\x{1234}pqr + +/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I + +/\h/SI8 + ABC\x{09} + ABC\x{20} + ABC\x{a0} + ABC\x{1680} + ABC\x{180e} + ABC\x{2000} + ABC\x{202f} + ABC\x{205f} + ABC\x{3000} + +/\v/SI8 + ABC\x{0a} + ABC\x{0b} + ABC\x{0c} + ABC\x{0d} + ABC\x{85} + ABC\x{2028} + +/\h*A/SI8 + CDBABC + +/\v+A/SI8 + +/\s?xxx\s/8SI + +/\sxxx\s/I8ST1 + AB\x{85}xxx\x{a0}XYZ + AB\x{a0}xxx\x{85}XYZ + +/\S \S/I8ST1 + \x{a2} \x{84} + A Z + +/a+/8 + a\x{123}aa\>1 + a\x{123}aa\>2 + a\x{123}aa\>3 + a\x{123}aa\>4 + a\x{123}aa\>5 + a\x{123}aa\>6 + +/\x{1234}+/iS8I + +/\x{1234}+?/iS8I + +/\x{1234}++/iS8I + +/\x{1234}{2}/iS8I + +/[^\x{c4}]/8DZ + +/X+\x{200}/8DZ + +/\R/SI8 + +/\777/8DZ + +/\w+\x{C4}/8BZ + a\x{C4}\x{C4} + +/\w+\x{C4}/8BZT1 + a\x{C4}\x{C4} + +/\W+\x{C4}/8BZ + !\x{C4} + +/\W+\x{C4}/8BZT1 + !\x{C4} + +/\W+\x{A1}/8BZ + !\x{A1} + +/\W+\x{A1}/8BZT1 + !\x{A1} + +/X\s+\x{A0}/8BZ + X\x20\x{A0}\x{A0} + +/X\s+\x{A0}/8BZT1 + X\x20\x{A0}\x{A0} + +/\S+\x{A0}/8BZ + X\x{A0}\x{A0} + +/\S+\x{A0}/8BZT1 + X\x{A0}\x{A0} + +/\x{a0}+\s!/8BZ + \x{a0}\x20! + +/\x{a0}+\s!/8BZT1 + \x{a0}\x20! + +/A/8 + \x{ff000041} + \x{7f000041} + +/(*UTF8)abc/9 + +/abc/89 + +/-- End of testinput15 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput16 b/ext/pcre/pcrelib/testdata/testinput16 new file mode 100644 index 000000000..e7a05ae0d --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput16 @@ -0,0 +1,35 @@ +/-- This set of tests is run only with the 8-bit library when Unicode property + support is available. It starts with tests of the POSIX interface, because + that is supported only with the 8-bit library. --/ + +/\w/P + +++\x{c2} + +/\w/WP + +++\x{c2} + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZi + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ + +/[^â±¥]/8iBZ + +/\h/SI + +/\v/SI + +/\R/SI + +/[[:blank:]]/WBZ + +/-- End of testinput16 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput17 b/ext/pcre/pcrelib/testdata/testinput17 new file mode 100644 index 000000000..1d933c794 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput17 @@ -0,0 +1,307 @@ +/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 + or -32) features that are not compatible with the 8-bit library, or which + give different output in 16- or 32-bit mode. --/ + +< forbid 8W + +/a\Cb/ + aXb + a\nb + +/[^\x{c4}]/DZ + +/\x{100}/I + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI + +/[\h]/BZ + >\x09< + +/[\h]+/BZ + >\x09\x20\xa0< + +/[\v]/BZ + +/[^\h]/BZ + +/\h+/SI + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + +/[\h\x{dc00}]+/BZSI + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + +/\H+/SI + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + +/[\H\x{d800}]+/ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + +/\v+/SI + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/[\v\x{dc00}]+/BZSI + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/\V+/SI + \x{2028}\x{2029}\x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + +/[\V\x{d800}]+/ + \x{2028}\x{2029}\x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + +/\R+/SI<bsr_unicode> + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I + \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + +/\u0100/<JS>BZ + +/[\u0100-\u0200]/<JS>BZ + +/\ud800/<JS>BZ + +/^\x{ffff}+/i + \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + +/[^\x00-a]{12,}[^b-\xff]*/BZ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ + +/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ + +/^[\x{1234}\x{4321}]{2,4}?/ + \x{1234}\x{1234}\x{1234} + +/-- End of testinput17 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput18 b/ext/pcre/pcrelib/testdata/testinput18 new file mode 100644 index 000000000..abff34e73 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput18 @@ -0,0 +1,300 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS + +/abc/8 + Ã] + +/X(\C{3})/8 + X\x{11234}Y + X\x{11234}YZ + +/X(\C{4})/8 + X\x{11234}YZ + X\x{11234}YZW + +/X\C*/8 + XYZabcdce + +/X\C*?/8 + XYZabcde + +/X\C{3,5}/8 + Xabcdefg + X\x{11234}Y + X\x{11234}YZ + X\x{11234}\x{512} + X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + +/X\C{3,5}?/8 + Xabcdefg + X\x{11234}Y + X\x{11234}YZ + X\x{11234}\x{512}YZ + *** Failers + X\x{11234} + +/a\Cb/8 + aXb + a\nb + +/a\C\Cb/8 + a\x{12257}b + a\x{12257}\x{11234}b + ** Failers + a\x{100}b + +/ab\Cde/8 + abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ + +/\x{10000}/8DZ + +/\x{100}/8DZ + +/\x{1000}/8DZ + +/\x{10000}/8DZ + +/\x{100000}/8DZ + +/\x{10ffff}/8DZ + +/[\x{ff}]/8DZ + +/[\x{100}]/8DZ + +/\x80/8DZ + +/\xff/8DZ + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 + \x{D55c}\x{ad6d}\x{C5B4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 + \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 + +/\x{084}/DZ8 + +/\x{104}/DZ8 + +/\x{861}/DZ8 + +/\x{212ab}/DZ8 + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + X\nabc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers + a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ + \x{f1} + \x{bf} + \x{100} + \x{1000} + *** Failers + \x{c0} + \x{f0} + +/Ä€{3,4}/8SDZ + \x{100}\x{100}\x{100}\x{100\x{100} + +/(\x{100}+|x)/8SDZ + +/(\x{100}*a|x)/8SDZ + +/(\x{100}{0,2}a|x)/8SDZ + +/(\x{100}{1,2}a|x)/8SDZ + +/\x{100}/8DZ + +/a\x{100}\x{101}*/8DZ + +/a\x{100}\x{101}+/8DZ + +/[^\x{c4}]/DZ + +/[\x{100}]/8DZ + \x{100} + Z\x{100} + \x{100}Z + *** Failers + +/[\xff]/DZ8 + >\x{ff}< + +/[^\xff]/8DZ + +/\x{100}abc(xyz(?1))/8DZ + +/\777/8I + \x{1ff} + \777 + +/\x{100}+\x{200}/8DZ + +/\x{100}+X/8DZ + +/^[\QÄ€\E-\QÅ\E/BZ8 + +/X/8 + \x{d800} + \x{d800}\? + \x{da00} + \x{da00}\? + \x{dc00} + \x{dc00}\? + \x{de00} + \x{de00}\? + \x{dfff} + \x{dfff}\? + \x{110000} + \x{d800}\x{1234} + +/(*UTF16)\x{11234}/ + abcd\x{11234}pqr + +/(*UTF)\x{11234}/I + abcd\x{11234}pqr + +/(*UTF-32)\x{11234}/ + abcd\x{11234}pqr + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I + +/\h/SI8 + ABC\x{09} + ABC\x{20} + ABC\x{a0} + ABC\x{1680} + ABC\x{180e} + ABC\x{2000} + ABC\x{202f} + ABC\x{205f} + ABC\x{3000} + +/\v/SI8 + ABC\x{0a} + ABC\x{0b} + ABC\x{0c} + ABC\x{0d} + ABC\x{85} + ABC\x{2028} + +/\h*A/SI8 + CDBABC + \x{2000}ABC + +/\R*A/SI8 + CDBABC + \x{2028}A + +/\v+A/SI8 + +/\s?xxx\s/8SI + +/\sxxx\s/I8ST1 + AB\x{85}xxx\x{a0}XYZ + AB\x{a0}xxx\x{85}XYZ + +/\S \S/I8ST1 + \x{a2} \x{84} + A Z + +/a+/8 + a\x{123}aa\>1 + a\x{123}aa\>2 + a\x{123}aa\>3 + a\x{123}aa\>4 + a\x{123}aa\>5 + a\x{123}aa\>6 + +/\x{1234}+/iS8I + +/\x{1234}+?/iS8I + +/\x{1234}++/iS8I + +/\x{1234}{2}/iS8I + +/[^\x{c4}]/8DZ + +/X+\x{200}/8DZ + +/\R/SI8 + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 + \x{10000}ab\>1 + \x{10000}ab\>2 + \x{10000}ab\>3 + \x{10000}ab\>4 + \x{10000}ab\>5 + +/í¼€/8 + +/\w+\x{C4}/8BZ + a\x{C4}\x{C4} + +/\w+\x{C4}/8BZT1 + a\x{C4}\x{C4} + +/\W+\x{C4}/8BZ + !\x{C4} + +/\W+\x{C4}/8BZT1 + !\x{C4} + +/\W+\x{A1}/8BZ + !\x{A1} + +/\W+\x{A1}/8BZT1 + !\x{A1} + +/X\s+\x{A0}/8BZ + X\x20\x{A0}\x{A0} + +/X\s+\x{A0}/8BZT1 + X\x20\x{A0}\x{A0} + +/\S+\x{A0}/8BZ + X\x{A0}\x{A0} + +/\S+\x{A0}/8BZT1 + X\x{A0}\x{A0} + +/\x{a0}+\s!/8BZ + \x{a0}\x20! + +/\x{a0}+\s!/8BZT1 + \x{a0}\x20! + +/(*UTF)abc/9 + +/abc/89 + +/-- End of testinput18 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput19 b/ext/pcre/pcrelib/testdata/testinput19 new file mode 100644 index 000000000..00d80203f --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput19 @@ -0,0 +1,22 @@ +/-- This set of tests is for Unicode property support, relevant only to the + 16- and 32-bit library. --/ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZi + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ + +/[^â±¥]/8iBZ + +/[[:blank:]]/WBZ + +/-- End of testinput19 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput2 b/ext/pcre/pcrelib/testdata/testinput2 index 9670104e6..00924ee98 100644 --- a/ext/pcre/pcrelib/testdata/testinput2 +++ b/ext/pcre/pcrelib/testdata/testinput2 @@ -7,6 +7,8 @@ NOTE: This is a non-UTF set of tests. When UTF support is needed, use test 5, and if Unicode Property Support is needed, use test 7. --/ + +< forbid 8W /(a)b|/I @@ -313,12 +315,6 @@ *** Failers fooabar -/This one is here because Perl 5.005_02 doesn't fail it/I - -/^(a)?(?(1)a|b)+$/I - *** Failers - a - /This one is here because Perl behaves differently; see also the following/I /^(a\1?){4}$/I @@ -835,7 +831,13 @@ /x++/DZ -/x{1,3}+/DZ +/x{1,3}+/BZO + +/x{1,3}+/BZOi + +/[^x]{1,3}+/BZO + +/[^x]{1,3}+/BZOi /(x)*+/DZ @@ -1501,6 +1503,8 @@ a2b\CA ** Failers a1b\CZ\CA + +/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ /^(?P<A>a)(?P<A>b)/IJ ab\CA @@ -1941,10 +1945,7 @@ a random value. /Ix /(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x abcabc1Xabc2XabcXabcabc -/(?<A> (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x - -/(?<1> (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x - abcabc1Xabc2XabcXabcabc +/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x /^(?(DEFINE) abc | xyz ) /x @@ -2061,7 +2062,7 @@ a random value. /Ix /^(a)\g{3/ -/^(a)\g{4a}/ +/^(a)\g{aa}/ /^a.b/<lf> a\rb @@ -2516,7 +2517,10 @@ a random value. /Ix ** Failers ab -/a(?!)+b/ +/a(?!)b/BZ + +/(?!)?a/BZ + ab /a(*FAIL)+b/ @@ -2541,7 +2545,9 @@ a random value. /Ix abcxypqr\Y /(*NO_START_OPT)xyz/C - abcxyz + abcxyz + +/(*NO_AUTO_POSSESS)a+b/BZ /xyz/CY abcxyz @@ -2939,7 +2945,7 @@ a random value. /Ix xxxxabcde\P xxxxabcde\P\P -/-- This is not in the Perl >= 5.10 test because Perl seems currently to be +/-- This is not in the Perl-compatible test because Perl seems currently to be broken and not behaving as specified in that it *does* bumpalong after hitting (*COMMIT). --/ @@ -2985,28 +2991,12 @@ a random value. /Ix /^(?&t)*(?(DEFINE)(?<t>.))$/BZ -/ -- The first four of these are not in the Perl >= 5.10 test because Perl - documents that the use of \K in assertions is "not well defined". The - last is here because Perl gives the match as "b" rather than "ab". I +/ -- This one is here because Perl gives the match as "b" rather than "ab". I believe this to be a Perl bug. --/ -/(?=a\Kb)ab/ - ab - -/(?!a\Kb)ac/ - ac - -/^abc(?<=b\Kc)d/ - abcd - -/^abc(?<!b\Kq)d/ - abcd - /(?>a\Kb)z|(ab)/ ab -/----------------------/ - /(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/ /abc(*MARK:)pqr/ @@ -3021,7 +3011,7 @@ a random value. /Ix /A(*COMMIT)B/+K ACABX -/--- These should be different, but in Perl 5.11 are not, which I think +/--- These should be different, but in Perl they are not, which I think is a bug in Perl. ---/ /A(*THEN)B|A(*THEN)C/K @@ -3030,12 +3020,6 @@ a random value. /Ix /A(*PRUNE)B|A(*PRUNE)C/K AC -/--- This should fail; the SKIP advances by one, but when we get to AC, the - PRUNE kills it. Perl behaves differently. ---/ - -/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK - AAAC - /--- Mark names can be duplicated. Perl doesn't give a mark for this one, though PCRE does. ---/ @@ -3061,7 +3045,7 @@ with \Y. ---/ /^(ab (c+(*FAIL)cd) | xyz)/x abcccd -/--- Perl 5.11 gets some of these wrong ---/ +/--- Perl gets some of these wrong ---/ /(?>.(*ACCEPT))*?5/ abcde @@ -3121,14 +3105,6 @@ with \Y. ---/ /X\H++\R/BZ X\x0d\x0a -/-- Perl treats this one differently, not failing the second string. I believe - that is a bug in Perl. --/ - -/^((abc|abcx)(*THEN)y|abcd)/ - abcd - *** Failers - abcxy - /(?<=abc)def/ abc\P\P @@ -3427,7 +3403,7 @@ with \Y. ---/ /\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/IS -/a(*SKIP)c|b(*ACCEPT)|/+SI +/a(*SKIP)c|b(*ACCEPT)|/+S!I a /a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/SI @@ -3453,52 +3429,6 @@ with \Y. ---/ /a(?:.(*THEN:ABC))*?a/ims \Mabbbbbbbbbbbbbbbbbbbbba -/-- These tests are in agreement with development Perl 5.015, which has fixed - some things, but they don't all work with 5.012, so they aren't in the - Perl-compatible tests. Those after the first come from Perl's own test - files. --/ - -/^((yes|no)(*THEN)(*F))?/ - yes - -/(A (.*) C? (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz - -/(A (.*) C? (*THEN) | A D) z/x -AbcdCBefgBhiBqz - -/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x -AbcdCBefgBhiBqz - -/(A (.*) C? (*THEN) | A D) \s* z/x -AbcdCBefgBhiBqz - -/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz - -/(A (.*) (?:C|) (*THEN) | A D) z/x -AbcdCBefgBhiBqz - -/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz - -/(A (.*) C{0,6} (*THEN) | A D) z/x -AbcdCBefgBhiBqz - -/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x -AbcdCEBefgBhiBqz - -/(A (.*) (CE){0,6} (*THEN) | A D) z/x -AbcdCEBefgBhiBqz - -/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz - -/(A (.*) (CE*){0,6} (*THEN) | A D) z/x -AbcdCBefgBhiBqz - -/-----------------------------------------------/ - /^(?>a+)(?>(z+))\w/BZ aaaazzzzb ** Failers @@ -3564,6 +3494,8 @@ AbcdCBefgBhiBqz /a[B-\Nc]/ +/a[B\Nc]/ + /(a)(?2){0,1999}?(b)/ /(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/ @@ -3751,24 +3683,9 @@ replaced by single letters. --/ \r\r\r\P \r\r\r\P\P -/-- These two are here because Perl does not match: it seems to allow the -COMMIT to escape from the assertion. --/ - -/(?=a(*COMMIT)b|ac)ac|ac/ - ac - -/(?=a(*COMMIT)b|(ac)) ac | (a)c/x - ac - "AB(C(D))(E(F))?(?(?=\2)(?=\4))" ABCDGHI\O03 -/-- This one is here because Perl does not confine the *COMMIT to the -assertion, and therefore fails the entire subroutine call. --/ - -/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ - ac - /-- These are all run as real matches in test 1; here we are just checking the settings of the anchored and startline bits. --/ @@ -3810,4 +3727,322 @@ settings of the anchored and startline bits. --/ /.?/S!I +/(?:(a)+(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(a)++(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(?>(a))(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(?1)(?C1)x|ab(?C2))((a)){0}/ + aab\C+ + +/(?1)(?C1)((a)(?C2)){0}/ + aab\C+ + +/(?:(a)+(?C1)bb|aa(?C2)b)++/ + aab\C+ + aab\C+\O2 + +/(ab)x|ab/ + ab\O3 + ab\O2 + +/(ab)/ + ab\O3 + ab\O2 + +/(?<=123)(*MARK:xx)abc/K + xxxx123a\P\P + xxxx123a\P + +/123\Kabc/ + xxxx123a\P\P + xxxx123a\P + +/^(?(?=a)aa|bb)/C + bb + +/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/ + bb + +/-- Perl seems to have a bug with this one --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + aaaaaac + +/-- Here are some that Perl treats differently because of the way it handles +backtracking verbs. --/ + + /(?!a(*COMMIT)b)ac|ad/ + ac + ad + +/^(?!a(*THEN)b|ac)../ + ac + ad + +/^(?=a(*THEN)b|ac)/ + ac + +/\A.*?(?:a|b(*THEN)c)/ + ba + +/\A.*?(?:a|b(*THEN)c)++/ + ba + +/\A.*?(?:a|b(*THEN)c|d)/ + ba + +/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/ + aac + +/\A.*?(a|b(*THEN)c)/ + ba + +/^(A(*THEN)B|A(*THEN)D)/ + AD + +/(?!b(*THEN)a)bn|bnn/ + bnn + +/(?(?=b(*SKIP)a)bn|bnn)/ + bnn + +/(?=b(*THEN)a|)bn|bnn/ + bnn + +/-------------------------/ + +/(*LIMIT_MATCH=12bc)abc/ + +/(*LIMIT_MATCH=4294967290)abc/ + +/(*LIMIT_RECURSION=4294967280)abc/I + +/(a+)*zz/ + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q3000 + +/(a+)*zz/S- + aaaaaaaaaaaaaz\Q10 + +/(*LIMIT_MATCH=3000)(a+)*zz/I + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q60000 + +/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I + aaaaaaaaaaaaaz + +/(*LIMIT_MATCH=60000)(a+)*zz/I + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q3000 + +/(*LIMIT_RECURSION=10)(a+)*zz/IS- + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\Q1000 + +/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS- + aaaaaaaaaaaaaz + +/(*LIMIT_RECURSION=1000)(a+)*zz/IS- + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\Q10 + +/-- This test causes a segfault with Perl 5.18.0 --/ + +/^(?=(a)){0}b(?1)/ + backgammon + +/(?|(?<n>f)|(?<n>b))/JI + +/(?<a>abc)(?<a>z)\k<a>()/JDZS + +/a*[bcd]/BZ + +/[bcd]*a/BZ + +/-- A complete set of tests for auto-possessification of character types --/ + +/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx + +/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx + +/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx + +/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx + +/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx + +/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx + +/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx + +/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx + +/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx + +/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx + +/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx + +/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx + +/ a+\D a+\d a+\S a+\s a+\W a+\w a+. a+\C a+\R a+\H a+\h a+\V a+\v a+\Z a+\z a+$/BZx + +/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZx + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZxs + +/\D+$ \d+$ \S+$ \s+$ \W+$ \w+$ \C+$ \R+$ \H+$ \h+$ \V+$ \v+$ a+$ \n+$ .+$ .+$/BZxm + +/(?=a+)a(a+)++a/BZ + +/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ + +/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ + +/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ + +/[ab]*/BZ + aaaa + +/[ab]*?/BZ + aaaa + +/[ab]?/BZ + aaaa + +/[ab]??/BZ + aaaa + +/[ab]+/BZ + aaaa + +/[ab]+?/BZ + aaaa + +/[ab]{2,3}/BZ + aaaa + +/[ab]{2,3}?/BZ + aaaa + +/[ab]{2,}/BZ + aaaa + +/[ab]{2,}?/BZ + aaaa + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ + +/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ + +/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ + +/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ + +/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ + +/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ + +/[a-c]*d/DZS + +/[a-c]+d/DZS + +/[a-c]?d/DZS + +/[a-c]{4,6}d/DZS + +/[a-c]{0,6}d/DZS + +/-- End of special auto-possessive tests --/ + +/^A\o{1239}B/ + A\123B + +/^A\oB/ + +/^A\x{zz}B/ + +/^A\x{12Z/ + +/^A\x{/ + +/[ab]++/BZO + +/[^ab]*+/BZO + +/a{4}+/BZO + +/a{4}+/BZOi + +/[a-[:digit:]]+/ + +/[A-[:digit:]]+/ + +/[a-[.xxx.]]+/ + +/[a-[=xxx=]]+/ + +/[a-[!xxx!]]+/ + +/[A-[!xxx!]]+/ + A]]] + +/[a-\d]+/ + +/(?<0abc>xx)/ + +/(?&1abc)xx(?<1abc>y)/ + +/(?<ab-cd>xx)/ + +/(?'0abc'xx)/ + +/(?P<0abc>xx)/ + +/\k<5ghj>/ + +/\k'5ghj'/ + +/\k{2fgh}/ + +/(?P=8yuki)/ + +/\g{4df}/ + +/(?&1abc)xx(?<1abc>y)/ + +/(?P>1abc)xx(?<1abc>y)/ + +/\g'3gh'/ + +/\g<5fg>/ + +/(?(<4gh>)abc)/ + +/(?('4gh')abc)/ + +/(?(4gh)abc)/ + +/(?(R&6yh)abc)/ + +/-- Test the ugly "start or end of word" compatibility syntax --/ + +/[[:<:]]red[[:>:]]/BZ + little red riding hood + a /red/ thing + red is a colour + put it all on red + ** Failers + no reduction + Alfred Winifred + +/[a[:<:]] should give error/ + /-- End of testinput2 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput20 b/ext/pcre/pcrelib/testdata/testinput20 new file mode 100644 index 000000000..2a6b8f23f --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput20 @@ -0,0 +1,19 @@ +/-- These DFA tests are for the handling of characters greater than 255 in + 16- or 32-bit, non-UTF mode. --/ + +/^\x{ffff}+/i + \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + +/-- End of testinput20 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput21 b/ext/pcre/pcrelib/testdata/testinput21 new file mode 100644 index 000000000..30895eef2 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput21 @@ -0,0 +1,26 @@ +/-- Tests for reloading pre-compiled patterns. The first one gives an error +right away, and can be any old pattern compiled in 8-bit mode ("abc" is +typical). The others require the link size to be 2. */x + +<!testsaved8 + +%-- Generated from: + /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +<!testsaved16LE-1 + +<!testsaved16BE-1 + +<!testsaved32LE-1 + +<!testsaved32BE-1 + +/-- End of testinput21 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput22 b/ext/pcre/pcrelib/testdata/testinput22 new file mode 100644 index 000000000..ca408dbee --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput22 @@ -0,0 +1,23 @@ +/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */ + +%-- Generated from: + /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?<cb2>[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + +<!testsaved16LE-2 + +<!testsaved16BE-2 + +<!testsaved32LE-2 + +<!testsaved32BE-2 + +/-- End of testinput22 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput23 b/ext/pcre/pcrelib/testdata/testinput23 new file mode 100644 index 000000000..0fdbae7c5 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput23 @@ -0,0 +1,20 @@ +/-- Tests for the 16-bit library only */ + +< forbid 8W + +/-- Check maximum non-UTF character size --/ + +/\x{ffff}/ + A\x{ffff}B + +/\x{10000}/ + +/\o{20000}/ + +/-- Check character ranges --/ + +/[\H]/BZSI + +/[\V]/BZSI + +/-- End of testinput23 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput24 b/ext/pcre/pcrelib/testdata/testinput24 new file mode 100644 index 000000000..23eb84e55 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput24 @@ -0,0 +1,11 @@ +/-- Tests for the 16-bit library with UTF-16 support only */ + +< forbid W + +/bad/8 + \x{d800} + +/short/8 + \P\P\x{d800} + +/-- End of testinput24 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput25 b/ext/pcre/pcrelib/testdata/testinput25 new file mode 100644 index 000000000..ce9d9e19a --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput25 @@ -0,0 +1,44 @@ +/-- Tests for the 32-bit library only */ + +< forbid 8w + +/-- Check maximum character size --/ + +/\x{110000}/ + +/\x{7fffffff}/ + +/\x{80000000}/ + +/\x{ffffffff}/ + +/\x{100000000}/ + +/\o{17777777777}/ + +/\o{20000000000}/ + +/\o{37777777777}/ + +/\o{40000000000}/ + +/\x{7fffffff}\x{7fffffff}/I + +/\x{80000000}\x{80000000}/I + +/\x{ffffffff}\x{ffffffff}/I + +/-- Non-UTF characters --/ + +/\C{2,3}/ + \x{400000}\x{400001}\x{400002}\x{400003} + +/\x{400000}\x{800000}/iDZ + +/-- Check character ranges --/ + +/[\H]/BZSI + +/[\V]/BZSI + +/-- End of testinput25 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput26 b/ext/pcre/pcrelib/testdata/testinput26 new file mode 100644 index 000000000..6b56ac1cc --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinput26 @@ -0,0 +1,14 @@ +/-- Tests for the 32-bit library with UTF-32 support only */ + +< forbid W + +/-- Non-UTF characters --/ + +/\x{110000}/8 + +/\o{4200000}/8 + +/\C/8 + \x{110000} + +/-- End of testinput26 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput3 b/ext/pcre/pcrelib/testdata/testinput3 index 6fea2f5b3..1d2e85538 100644 --- a/ext/pcre/pcrelib/testdata/testinput3 +++ b/ext/pcre/pcrelib/testdata/testinput3 @@ -1,6 +1,8 @@ /-- This set of tests checks local-specific features, using the fr_FR locale. It is not Perl-compatible. There is different version called wintestinput3 f or use on Windows, where the locale is called "french". --/ + +< forbid 8W /^[\w]+/ *** Failers diff --git a/ext/pcre/pcrelib/testdata/testinput4 b/ext/pcre/pcrelib/testdata/testinput4 index c7bb370cf..983f7a119 100644 --- a/ext/pcre/pcrelib/testdata/testinput4 +++ b/ext/pcre/pcrelib/testdata/testinput4 @@ -1,6 +1,8 @@ /-- This set of tests is for UTF support, excluding Unicode properties. It is compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit PCRE libraries. --/ + +< forbid 9?=ABCDEFfGILMNPTUWXZ< /a.b/8 acb @@ -621,4 +623,97 @@ /a(*:a£b)/8K abc +/-- Noncharacters --/ + +/./8 + \x{fffe} + \x{ffff} + \x{1fffe} + \x{1ffff} + \x{2fffe} + \x{2ffff} + \x{3fffe} + \x{3ffff} + \x{4fffe} + \x{4ffff} + \x{5fffe} + \x{5ffff} + \x{6fffe} + \x{6ffff} + \x{7fffe} + \x{7ffff} + \x{8fffe} + \x{8ffff} + \x{9fffe} + \x{9ffff} + \x{afffe} + \x{affff} + \x{bfffe} + \x{bffff} + \x{cfffe} + \x{cffff} + \x{dfffe} + \x{dffff} + \x{efffe} + \x{effff} + \x{ffffe} + \x{fffff} + \x{10fffe} + \x{10ffff} + \x{fdd0} + \x{fdd1} + \x{fdd2} + \x{fdd3} + \x{fdd4} + \x{fdd5} + \x{fdd6} + \x{fdd7} + \x{fdd8} + \x{fdd9} + \x{fdda} + \x{fddb} + \x{fddc} + \x{fddd} + \x{fdde} + \x{fddf} + \x{fde0} + \x{fde1} + \x{fde2} + \x{fde3} + \x{fde4} + \x{fde5} + \x{fde6} + \x{fde7} + \x{fde8} + \x{fde9} + \x{fdea} + \x{fdeb} + \x{fdec} + \x{fded} + \x{fdee} + \x{fdef} + +/^\d*\w{4}/8 + 1234 + 123 + +/^[^b]*\w{4}/8 + aaaa + aaa + +/^[^b]*\w{4}/8i + aaaa + aaa + +/^\x{100}*.{4}/8 + \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} + +/^\x{100}*.{4}/8i + \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} + +/^a+[a\x{200}]/8 + aa + /-- End of testinput4 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput5 b/ext/pcre/pcrelib/testdata/testinput5 index 642749c31..9e9a22a1a 100644 --- a/ext/pcre/pcrelib/testdata/testinput5 +++ b/ext/pcre/pcrelib/testdata/testinput5 @@ -1,21 +1,37 @@ /-- This set of tests checks the API, internals, and non-Perl stuff for UTF support, excluding Unicode properties. However, tests that give different results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/ + +< forbid W /\x{110000}/8DZ +/\o{4200000}/8DZ + /\x{ffffffff}/8 +/\o{37777777777}/8 + /\x{100000000}/8 +/\o{77777777777}/8 + /\x{d800}/8 +/\o{154000}/8 + /\x{dfff}/8 +/\o{157777}/8 + /\x{d7ff}/8 +/\o{153777}/8 + /\x{e000}/8 +/\o{170000}/8 + /^\x{100}a\x{1234}/8 \x{100}a\x{1234}bcd @@ -769,4 +785,7 @@ /\ud800/<JS>8 +/^a+[a\x{200}]/8BZ + aa + /-- End of testinput5 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput6 b/ext/pcre/pcrelib/testdata/testinput6 index a4bfb3c19..1e450be04 100644 --- a/ext/pcre/pcrelib/testdata/testinput6 +++ b/ext/pcre/pcrelib/testdata/testinput6 @@ -1,5 +1,7 @@ /-- This set of tests is for Unicode property support. It is compatible with Perl >= 5.15. --/ + +< forbid 9?=ABCDEFfGILMNPTUXZ< /^\pC\pL\pM\pN\pP\pS\pZ</8 \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}< @@ -325,12 +327,6 @@ ** Failers abc -/\p{Lu}/8i - A - aZ - ** Failers - abc - /\p{Ll}/8 a Az @@ -425,6 +421,7 @@ /^[\p{Arabic}]/8 \x{06e9} \x{060b} + \x{061c} ** Failers X\x{06e9} @@ -882,6 +879,15 @@ \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X +/\X*Z/8Y + A\x{300} + +/\X*(.)/8Y + A\x{1111}\x{ae4c}\x{1169} + +/\X?abc/8Y +\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\? + /-- --/ /\x{1e9e}+/8i @@ -1316,4 +1322,166 @@ /\x{017f}+/8i \x{0053}\x{0073}\x{017f} +/^\p{Any}*\d{4}/8 + 1234 + 123 + +/^\X*\w{4}/8 + 1234 + 123 + +/^A\s+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^[[:graph:]]+$/8W + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + \x{09} + \x{0a} + \x{1D} + \x{20} + \x{85} + \x{a0} + \x{61c} + \x{1680} + \x{180e} + \x{2028} + \x{2029} + \x{202f} + \x{2065} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + \x{3000} + \x{e0002} + \x{e001f} + \x{e0080} + +/^[[:print:]]+$/8W + Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + \x{3000} + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + \x{09} + \x{1D} + \x{85} + \x{61c} + \x{2028} + \x{2029} + \x{2065} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + \x{e0002} + \x{e001f} + \x{e0080} + +/^[[:punct:]]+$/8W + \$+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + \x{a1}\x{a7} + \x{37e} + ** Failers + abcde + +/^[[:^graph:]]+$/8W + \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e} + \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + \x{3000}\x{e0002}\x{e001f}\x{e0080} + ** Failers + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + +/^[[:^print:]]+$/8W + \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + ** Failers + Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + \x{3000} + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + +/^[[:^punct:]]+$/8W + abcde + ** Failers + \$+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + \x{a1}\x{a7} + \x{37e} + /-- End of testinput6 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput7 b/ext/pcre/pcrelib/testdata/testinput7 index b265f1f9a..9d1454363 100644 --- a/ext/pcre/pcrelib/testdata/testinput7 +++ b/ext/pcre/pcrelib/testdata/testinput7 @@ -100,11 +100,30 @@ /\p{Cc}{2}+/8BZ +/^\p{Cf}/8 + \x{180e} + \x{061c} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + /^\p{Cs}/8 \?\x{dfff} ** Failers \x{09f} +/^\p{Mn}/8 + \x{1a1b} + +/^\p{Pe}/8 + \x{2309} + \x{230b} + +/^\p{Ps}/8 + \x{2308} + \x{230a} + /^\p{Sc}+/8 $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6} \x{9f2} @@ -116,15 +135,15 @@ \ \ \x{a0} \x{1680} - \x{180e} \x{2000} \x{2001} ** Failers \x{2028} \x{200d} -/-- These four are here rather than in test 6 because Perl has problems with - the negative versions of the properties. --/ +/-- These are here rather than in test 6 because Perl has problems with + the negative versions of the properties and behaves has changed how + it behaves for caseless matching. --/ /\p{^Lu}/8i 1234 @@ -149,6 +168,12 @@ a \x{1d00} +/\p{Lu}/8i + A + aZ + ** Failers + abc + /[\x{c0}\x{391}]/8i \x{c0} \x{e0} @@ -668,5 +693,140 @@ of case for anything other than the ASCII letters. --/ /is{2}t/8i iskt + +/-- This property is a PCRE special --/ + +/^\p{Xuc}/8 + $abc + @abc + `abc + \x{1234}abc + ** Failers + abc + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\P{Xuc}/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^[\P{Xuc}]/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/-- Some auto-possessification tests --/ + +/\pN+\z/BZ + +/\PN+\z/BZ + +/\pN+/BZ + +/\PN+/BZ + +/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx + +/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx + +/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx + +/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx + +/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx + +/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx + +/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx + +/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx + +/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx + +/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx + +/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx + +/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx + +/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx + +/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx + +/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx + +/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx + +/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx + +/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx + +/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx + +/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx + +/-- End auto-possessification tests --/ + +/\w+/8CWBZ + abcd + +/[\p{N}]?+/BZO + +/[\p{L}ab]{2,3}+/BZO + +/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx + +/.+\X/BZxs + +/\X+$/BZxm + +/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ /-- End of testinput7 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput8 b/ext/pcre/pcrelib/testdata/testinput8 index e235445e0..bb2747b12 100644 --- a/ext/pcre/pcrelib/testdata/testinput8 +++ b/ext/pcre/pcrelib/testdata/testinput8 @@ -1,5 +1,8 @@ -/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(). - The -dfa flag must be used with pcretest when running it. --/ +/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(), + excluding UTF and Unicode property support. The -dfa flag must be used with + pcretest when running it. --/ + +< forbid 8W /abc/ abc @@ -16,7 +19,7 @@ ac ab -/a*/ +/a*/O a aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -177,19 +180,19 @@ ayzq axyzq -/[^a]+/ +/[^a]+/O bac bcdefax *** Failers aaaaa -/[^a]*/ +/[^a]*/O bac bcdefax *** Failers aaaaa -/[^a]{3,5}/ +/[^a]{3,5}/O xyz awxyza abcdefa @@ -937,16 +940,16 @@ *** Failers the abc -/^[ab]{1,3}(ab*|b)/ +/^[ab]{1,3}(ab*|b)/O aabbbbb -/^[ab]{1,3}?(ab*|b)/ +/^[ab]{1,3}?(ab*|b)/O aabbbbb -/^[ab]{1,3}?(ab*?|b)/ +/^[ab]{1,3}?(ab*?|b)/O aabbbbb -/^[ab]{1,3}(ab*?|b)/ +/^[ab]{1,3}(ab*?|b)/O aabbbbb / (?: [\040\t] | \( @@ -1923,14 +1926,16 @@ abc\100\060 abc\100\60 -/abc\81/ - abc\081 - abc\0\x38\x31 - -/abc\91/ - abc\091 - abc\0\x39\x31 - +/^A\8B\9C$/ + A8B9C + *** Failers + A\08B\09C + +/^[A\8B\9C]+$/ + A8B9C + *** Failers + A8B9C\x00 + /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ abcdefghijk\12S @@ -2049,13 +2054,13 @@ /foo(.*?)bar/ The food is under the bar in the barn. -/(.*)(\d*)/ +/(.*)(\d*)/O I have 2 numbers: 53147 /(.*)(\d+)/ I have 2 numbers: 53147 -/(.*?)(\d*)/ +/(.*?)(\d*)/O I have 2 numbers: 53147 /(.*?)(\d+)/ @@ -3825,13 +3830,6 @@ /a*/g abbab -/^[a-\d]/ - abcde - -things - 0digit - *** Failers - bcdef - /^[\d-a]/ abcde -things @@ -4699,7 +4697,7 @@ /(?(R)a*(?1)|((?R))b)/ aaaabcde -/(a+)/ +/(a+)/O \O6aaaa \O8aaaa @@ -4798,4 +4796,39 @@ xxxxxxxxabcd xx\xa0xxxxxabcd +/abcd/ + abcd\O0 + +/-- These tests show up auto-possessification --/ + +/[ab]*/ + aaaa + +/[ab]*?/ + aaaa + +/[ab]?/ + aaaa + +/[ab]??/ + aaaa + +/[ab]+/ + aaaa + +/[ab]+?/ + aaaa + +/[ab]{2,3}/ + aaaa + +/[ab]{2,3}?/ + aaaa + +/[ab]{2,}/ + aaaa + +/[ab]{2,}?/ + aaaa + /-- End of testinput8 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput9 b/ext/pcre/pcrelib/testdata/testinput9 index 766c9c0fb..4575ffe31 100644 --- a/ext/pcre/pcrelib/testdata/testinput9 +++ b/ext/pcre/pcrelib/testdata/testinput9 @@ -1,6 +1,8 @@ /-- This set of tests checks UTF-8 support with the DFA matching functionality - of pcre_dfa_exec(). The -dfa flag must be used with pcretest when running - it. --/ + of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must + be used with pcretest when running it. --/ + +< forbid W /\x{100}ab/8 \x{100}ab @@ -239,16 +241,16 @@ /\x{100}{3,5}/8 abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX -/\x{100}{3,}/8 +/\x{100}{3,}/8O abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX /(?<=a\x{100}{2}b)X/8 Xyyya\x{100}\x{100}bXzzz -/\D*/8 +/\D*/8O aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/\D*/8 +/\D*/8O \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} /\D/8 @@ -584,16 +586,16 @@ a\n\n\n\rb a\r -/\h+\V?\v{3,4}/8 +/\h+\V?\v{3,4}/8O \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a -/\V?\v{3,4}/8 +/\V?\v{3,4}/8O \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a -/\h+\V?\v{3,4}/8 +/\h+\V?\v{3,4}/8O >\x09\x20\x{a0}X\x0a\x0a\x0a< -/\V?\v{3,4}/8 +/\V?\v{3,4}/8O >\x09\x20\x{a0}X\x0a\x0a\x0a< /\H\h\V\v/8 @@ -602,7 +604,7 @@ ** Failers \x{a0} X\x0a -/\H*\h+\V?\v{3,4}/8 +/\H*\h+\V?\v{3,4}/8O \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a \x09\x20\x{a0}\x0a\x0b\x0c @@ -615,7 +617,7 @@ ** Failers \x{2009} X\x0a -/\H*\h+\V?\v{3,4}/8 +/\H*\h+\V?\v{3,4}/8O \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a \x09\x20\x{202f}\x0a\x0b\x0c diff --git a/ext/pcre/pcrelib/testdata/testinputEBC b/ext/pcre/pcrelib/testdata/testinputEBC new file mode 100644 index 000000000..56efcd00a --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testinputEBC @@ -0,0 +1,121 @@ +/-- This is a specialized test for checking, when PCRE is compiled with the +EBCDIC option but in an ASCII environment, that newline and white space +functionality is working. It catches cases where explicit values such as 0x0a +have been used instead of names like CHAR_LF. Needless to say, it is not a +genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash +must be in EBCDIC code. In data, newlines and other spacing characters must be +in EBCDIC, but can be specified as escapes. --/ + +/-- Test default newline and variations --/ + +/^A/m + ABC + 12\x15ABC + +/^A/m<any> + 12\x15ABC + 12\x0dABC + 12\x0d\x15ABC + 12\x25ABC + +/^A/m<anycrlf> + 12\x15ABC + 12\x0dABC + 12\x0d\x15ABC + ** Fail + 12\x25ABC + +/-- Test \h --/ + +/^A\ˆ/ + A B + +/-- Test \H --/ + +/^A\È/ + AB + ** Fail + A B + +/-- Test \R --/ + +/^A\Ù/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \v --/ + +/^A\¥/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \V --/ + +/^A\å/ + A B + ** Fail + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + +/-- For repeated items, use an atomic group so that the output is the same +for DFA matching (otherwise it may show multiple matches). --/ + +/-- Test \h+ --/ + +/^A(?>\ˆ+)/ + A B + +/-- Test \H+ --/ + +/^A(?>\È+)/ + AB + ** Fail + A B + +/-- Test \R+ --/ + +/^A(?>\Ù+)/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \v+ --/ + +/^A(?>\¥+)/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \V+ --/ + +/^A(?>\å+)/ + A B + ** Fail + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + +/-- End --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput1 b/ext/pcre/pcrelib/testdata/testoutput1 index 8310e9461..4dafc0496 100644 --- a/ext/pcre/pcrelib/testdata/testoutput1 +++ b/ext/pcre/pcrelib/testdata/testoutput1 @@ -1,6 +1,8 @@ /-- This set of tests is for features that are compatible with all versions of - Perl >= 5.10, in non-UTF-8 mode. It should run clean for both the 8-bit and - 16-bit PCRE libraries. --/ + Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit, + and 32-bit PCRE libraries. --/ + +< forbid 89?=ABCDEFfGILMNPTUWXZ< /the quick brown fox/ the quick brown fox @@ -2149,18 +2151,35 @@ No match abc\100\60 0: abc@0 1: abc - -/abc\81/ - abc\081 - 0: abc\x0081 - abc\0\x38\x31 - 0: abc\x0081 - -/abc\91/ - abc\091 - 0: abc\x0091 - abc\0\x39\x31 - 0: abc\x0091 + +/^A\8B\9C$/ + A8B9C + 0: A8B9C + *** Failers +No match + A\08B\09C +No match + +/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/ + ABCDEFGHIHI + 0: ABCDEFGHIHI + 1: A + 2: B + 3: C + 4: D + 5: E + 6: F + 7: G + 8: H + 9: I + +/^[A\8B\9C]+$/ + A8B9C + 0: A8B9C + *** Failers +No match + A8B9C\x00 +No match /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/ abcdefghijkllS @@ -5972,18 +5991,6 @@ No match 0: 0: -/^[a-\d]/ - abcde - 0: a - -things - 0: - - 0digit - 0: 0 - *** Failers -No match - bcdef -No match - /^[\d-a]/ abcde 0: a @@ -6006,15 +6013,15 @@ No match /[\s]+/ > \x09\x0a\x0c\x0d\x0b< - 0: \x09\x0a\x0c\x0d + 0: \x09\x0a\x0c\x0d\x0b /\s+/ > \x09\x0a\x0c\x0d\x0b< - 0: \x09\x0a\x0c\x0d + 0: \x09\x0a\x0c\x0d\x0b /ab/x ab -No match + 0: ab /(?!\A)x/m a\nxb\n @@ -6160,11 +6167,9 @@ No match 1: bc 2: bc -/-- This tests for an IPv6 address in the form where it can have up to --/ -/-- eight components, one and only one of which is empty. This must be --/ -No match -/-- an internal component. --/ -No match +/-- This tests for an IPv6 address in the form where it can have up to + eight components, one and only one of which is empty. This must be + an internal component. --/ /^(?!:) # colon disallowed at start (?: # start of item @@ -6906,10 +6911,6 @@ No match bc 0: b -/^(?=(a)){0}b(?1)/ - backgammon - 0: ba - /^(?=(?1))?[az]([abc])d/ abd 0: abd @@ -7770,20 +7771,12 @@ No match 1: (ab(cd)ef) 2: ef -/^(?!a(*SKIP)b)/ - ac - 0: - /^(?=a(*SKIP)b|ac)/ ** Failers No match ac No match -/^(?=a(*THEN)b|ac)/ - ac - 0: - /^(?=a(*PRUNE)b)/ ab 0: @@ -7796,10 +7789,6 @@ No match ac 0: -/^(?(?!a(*SKIP)b))/ - ac - 0: - /(?>a\Kb)/ ab 0: b @@ -8169,46 +8158,20 @@ No match 1: AB 2: B -/\A.*?(?:a|b(*THEN)c)/ - ba - 0: ba - -/\A.*?(?:a|bc)/ - ba - 0: ba - -/\A.*?(a|b(*THEN)c)/ - ba - 0: ba - 1: a - /\A.*?(a|bc)/ ba 0: ba 1: a -/\A.*?(?:a|b(*THEN)c)++/ - ba - 0: ba - /\A.*?(?:a|bc)++/ ba 0: ba -/\A.*?(a|b(*THEN)c)++/ - ba - 0: ba - 1: a - /\A.*?(a|bc)++/ ba 0: ba 1: a -/\A.*?(?:a|b(*THEN)c|d)/ - ba - 0: ba - /\A.*?(?:a|bc|d)/ ba 0: ba @@ -8719,10 +8682,6 @@ No match aac 0: aac -/(?!a(*COMMIT)b)ac|cd/ - ac - 0: ac - /((?:a?)*)*c/ aac 0: aac @@ -8795,4 +8754,563 @@ No match abcdfooxyz 0: foo +/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/ + ac + 0: ac + +/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/ + ac + 0: ac + +/(?<=(*SKIP)ac)a/ + aa +No match + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + 0: AC + +/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K + acacd + 0: acd +MK: n + +/A(*SKIP:m)x|A(*SKIP:n)x|AB/K + AB + 0: AB + +/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K + acacd + 0: ac +MK: n + +/-- Tests that try to figure out how Perl works. My hypothesis is that the + first verb that is backtracked onto is the one that acts. This seems to be + the case almost all the time, but there is one exception that is perhaps a + bug. --/ + +/-- This matches "aaaac"; each PRUNE advances one character until the subject + no longer starts with 5 'a's. --/ + +/aaaaa(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Putting SKIP in front of PRUNE makes no difference, as it is never +backtracked onto, whether or not it has a label. --/ + +/aaaaa(*SKIP)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/aaaaa(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Putting THEN in front makes no difference. */ + +/aaaaa(*THEN)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- However, putting COMMIT in front of the prune changes it to "no match". I + think this is inconsistent and possibly a bug. For the moment, running this + test is moved out of the Perl-compatible file. --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + + +/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/ + +/-- This matches "ac" because SKIP forces the next match to start on the + sixth "a". --/ + +/aaaaa(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- Putting THEN in front makes no difference. --/ + +/aaaaa(*THEN)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- In this case, neither does COMMIT. This still matches "ac". --/ + +/aaaaa(*COMMIT)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- This gives "no match", as expected. --/ + +/aaaaa(*COMMIT)b|a+c/ + aaaaaac +No match + + +/------ Tests using THEN ------/ + +/-- This matches "aaaaaac", as expected. --/ + +/aaaaa(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting SKIP in front makes no difference. --/ + +/aaaaa(*SKIP)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting COMMIT in front makes no difference. --/ + +/aaaaa(*COMMIT)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- End of "priority" tests --/ + +/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + 0: aaaa + +/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + 0: aac + +/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + 0: ac + +/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + 0: aac + +/aaa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + 0: ac + +/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K + aaaaaac + 0: ac + +/.?(a|b(*THEN)c)/ + ba + 0: ba + 1: a + +/(a(*COMMIT)b)c|abd/ + abc + 0: abc + 1: ab + abd +No match + +/(?=a(*COMMIT)b)abc|abd/ + abc + 0: abc + abd + 0: abd + +/(?>a(*COMMIT)b)c|abd/ + abc + 0: abc + abd + 0: abd + +/a(?=b(*COMMIT)c)[^d]|abd/ + abd +No match + abc + 0: ab + +/a(?=bc).|abd/ + abd + 0: abd + abc + 0: ab + +/a(?>b(*COMMIT)c)d|abd/ + abceabd +No match + +/a(?>bc)d|abd/ + abceabd + 0: abd + +/(?>a(*COMMIT)b)c|abd/ + abd + 0: abd + +/(?>a(*COMMIT)c)d|abd/ + abd +No match + +/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ + ac + 0: ac + 1: <unset> + 2: c + +/-- These tests were formerly in test 2, but changes in PCRE and Perl have + made them compatible. --/ + +/^(a)?(?(1)a|b)+$/ + *** Failers +No match + a +No match + +/(?=a\Kb)ab/ + ab + 0: b + +/(?!a\Kb)ac/ + ac + 0: ac + +/^abc(?<=b\Kc)d/ + abcd + 0: cd + +/^abc(?<!b\Kq)d/ + abcd + 0: abcd + + +/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC +No match, mark = A + +/^((abc|abcx)(*THEN)y|abcd)/ + abcd + 0: abcd + 1: abcd + *** Failers +No match + abcxy +No match + +/^((yes|no)(*THEN)(*F))?/ + yes +No match + +/(A (.*) C? (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz +No match + +/(A (.*) C? (*THEN) | A D) z/x +AbcdCBefgBhiBqz +No match + +/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x +AbcdCBefgBhiBqz +No match + +/(A (.*) C? (*THEN) | A D) \s* z/x +AbcdCBefgBhiBqz +No match + +/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz +No match + +/(A (.*) (?:C|) (*THEN) | A D) z/x +AbcdCBefgBhiBqz +No match + +/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz +No match + +/(A (.*) C{0,6} (*THEN) | A D) z/x +AbcdCBefgBhiBqz +No match + +/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x +AbcdCEBefgBhiBqz +No match + +/(A (.*) (CE){0,6} (*THEN) | A D) z/x +AbcdCEBefgBhiBqz +No match + +/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x +AbcdCBefgBhiBqz +No match + +/(A (.*) (CE*){0,6} (*THEN) | A D) z/x +AbcdCBefgBhiBqz +No match + +/(?=a(*COMMIT)b|ac)ac|ac/ + ac +No match + +/(?=a(*COMMIT)b|(ac)) ac | (a)c/x + ac +No match + +/--------/ + +/(?(?!b(*THEN)a)bn|bnn)/ + bnn + 0: bn + +/(?!b(*SKIP)a)bn|bnn/ + bnn + 0: bn + +/(?(?!b(*SKIP)a)bn|bnn)/ + bnn + 0: bn + +/(?!b(*PRUNE)a)bn|bnn/ + bnn + 0: bn + +/(?(?!b(*PRUNE)a)bn|bnn)/ + bnn + 0: bn + +/(?!b(*COMMIT)a)bn|bnn/ + bnn + 0: bn + +/(?(?!b(*COMMIT)a)bn|bnn)/ + bnn + 0: bn + +/(?=b(*SKIP)a)bn|bnn/ + bnn +No match + +/(?=b(*THEN)a)bn|bnn/ + bnn + 0: bnn + + /^(?!a(*SKIP)b)/ + ac + 0: + + /^(?!a(*SKIP)b)../ + acd + 0: ac + +/(?!a(*SKIP)b)../ + acd + 0: ac + +/^(?(?!a(*SKIP)b))/ + ac + 0: + +/^(?!a(*PRUNE)b)../ + acd + 0: ac + +/(?!a(*PRUNE)b)../ + acd + 0: ac + + /(?!a(*COMMIT)b)ac|cd/ + ac + 0: ac + +/\A.*?(?:a|bc)/ + ba + 0: ba + +/^(A(*THEN)B|C(*THEN)D)/ + CD + 0: CD + 1: CD + +/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + 0: b +MK: m(m + +/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + 0: b +MK: m(m + +/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + 0: b + +/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K + abc + 0: b +MK: m(m + +/^\d*\w{4}/ + 1234 + 0: 1234 + 123 +No match + +/^[^b]*\w{4}/ + aaaa + 0: aaaa + aaa +No match + +/^[^b]*\w{4}/i + aaaa + 0: aaaa + aaa +No match + +/^a*\w{4}/ + aaaa + 0: aaaa + aaa +No match + +/^a*\w{4}/i + aaaa + 0: aaaa + aaa +No match + +/(?(?=ab)ab)/+ + ca + 0: + 0+ ca + cd + 0: + 0+ cd + +/(?:(?<n>foo)|(?<n>bar))\k<n>/J + foofoo + 0: foofoo + 1: foo + barbar + 0: barbar + 1: <unset> + 2: bar + +/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/J + AfooA + 0: AfooA + 1: A + 2: foo + AbarA + 0: AbarA + 1: A + 2: <unset> + 3: bar + ** Failers +No match + Afoofoo +No match + Abarbar +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + +/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ + Ax + 0: Ax + 1: A + BAxy + 0: BAxy + 1: <unset> + 2: B + 3: A + +/^A\xZ/ + A\0Z + 0: A\x00Z + +/^A\o{123}B/ + A\123B + 0: ASB + +/ ^ a + + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + #comment + + b $ /x + aaaab + 0: aaaab + +/ ^ (?> a + ) b $ /x + aaaab + 0: aaaab + +/ ^ ( a + ) + + \w $ /x + aaaab + 0: aaaab + 1: aaaa + +/(?:a\Kb)*+/+ + ababc + 0: b + 0+ c + +/(?>a\Kb)*/+ + ababc + 0: b + 0+ c + +/(?:a\Kb)*/+ + ababc + 0: b + 0+ c + +/(a\Kb)*+/+ + ababc + 0: b + 0+ c + 1: ab + +/(a\Kb)*/+ + ababc + 0: b + 0+ c + 1: ab + /-- End of testinput1 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput10 b/ext/pcre/pcrelib/testdata/testoutput10 index 049d44631..b89169cdd 100644 --- a/ext/pcre/pcrelib/testdata/testoutput10 +++ b/ext/pcre/pcrelib/testdata/testoutput10 @@ -39,9 +39,6 @@ No match /^\pL+/8 abcd 0: abcd - 1: abc - 2: ab - 3: a a 0: a *** Failers @@ -50,45 +47,24 @@ No match /^\PL+/8 1234 0: 1234 - 1: 123 - 2: 12 - 3: 1 = 0: = *** Failers 0: *** - 1: *** - 2: ** - 3: * abcd No match /^\X+/8 abcdA\x{300}\x{301}\x{302} 0: abcdA\x{300}\x{301}\x{302} - 1: abcd - 2: abc - 3: ab - 4: a A\x{300}\x{301}\x{302} 0: A\x{300}\x{301}\x{302} A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} - 1: A\x{300}\x{301}\x{302} a 0: a *** Failers 0: *** Failers - 1: *** Failer - 2: *** Faile - 3: *** Fail - 4: *** Fai - 5: *** Fa - 6: *** F - 7: *** - 8: *** - 9: ** -10: * \x{300}\x{301}\x{302} 0: \x{300}\x{301}\x{302} @@ -255,6 +231,18 @@ No match /^\p{Cf}/8 \x{601} 0: \x{601} + \x{180e} + 0: \x{180e} + \x{061c} + 0: \x{61c} + \x{2066} + 0: \x{2066} + \x{2067} + 0: \x{2067} + \x{2068} + 0: \x{2068} + \x{2069} + 0: \x{2069} ** Failers No match \x{09f} @@ -353,6 +341,8 @@ No match /^\p{Mn}/8 \x{300} 0: \x{300} + \x{1a1b} + 0: \x{1a1b} ** Failers No match X @@ -360,7 +350,7 @@ No match \x{903} No match -/^\p{Nd}+/8 +/^\p{Nd}+/8O 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a} 0: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669} 1: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668} @@ -466,6 +456,10 @@ No match 0: } \x{f3b} 0: \x{f3b} + \x{2309} + 0: \x{2309} + \x{230b} + 0: \x{230b} ** Failers No match X @@ -480,7 +474,7 @@ No match No match \x{f3c} No match - + /^\p{Pf}/8 \x{bb} 0: \x{bb} @@ -526,6 +520,10 @@ No match 0: { \x{f3c} 0: \x{f3c} + \x{2308} + 0: \x{2308} + \x{230a} + 0: \x{230a} ** Failers No match X @@ -542,10 +540,6 @@ No match /^\p{Sc}+/8 $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6} 0: $\x{a2}\x{a3}\x{a4}\x{a5} - 1: $\x{a2}\x{a3}\x{a4} - 2: $\x{a2}\x{a3} - 3: $\x{a2} - 4: $ \x{9f2} 0: \x{9f2} ** Failers @@ -568,11 +562,6 @@ No match /^\p{Sm}+/8 +<|~\x{ac}\x{2044} 0: +<|~\x{ac}\x{2044} - 1: +<|~\x{ac} - 2: +<|~ - 3: +<| - 4: +< - 5: + ** Failers No match X @@ -619,8 +608,6 @@ No match 0: \x{a0} \x{1680} 0: \x{1680} - \x{180e} - 0: \x{180e} \x{2000} 0: \x{2000} \x{2001} @@ -767,23 +754,10 @@ No match /[\p{Nd}+-]+/8 1234 0: 1234 - 1: 123 - 2: 12 - 3: 1 12-34 0: 12-34 - 1: 12-3 - 2: 12- - 3: 12 - 4: 1 12+\x{661}-34 0: 12+\x{661}-34 - 1: 12+\x{661}-3 - 2: 12+\x{661}- - 3: 12+\x{661} - 4: 12+ - 5: 12 - 6: 1 ** Failers No match abcd @@ -792,28 +766,16 @@ No match /[\P{Nd}]+/8 abcd 0: abcd - 1: abc - 2: ab - 3: a ** Failers 0: ** Failers - 1: ** Failer - 2: ** Faile - 3: ** Fail - 4: ** Fai - 5: ** Fa - 6: ** F - 7: ** - 8: ** - 9: * 1234 No match -/\D+/8 +/\D+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 No match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -837,11 +799,11 @@ Matched, but too many subsidiary matches 20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/\P{Nd}+/8 +/\P{Nd}+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 No match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -865,11 +827,11 @@ Matched, but too many subsidiary matches 20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\D]+/8 +/[\D]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 No match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -893,11 +855,11 @@ Matched, but too many subsidiary matches 20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\P{Nd}]+/8 +/[\P{Nd}]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 No match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -921,11 +883,11 @@ Matched, but too many subsidiary matches 20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/[\D\P{Nd}]+/8 +/[\D\P{Nd}]+/8O 11111111111111111111111111111111111111111111111111111111111111111111111 No match aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1046,10 +1008,6 @@ No match /\x{391}+/8i \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391} 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391} - 1: \x{391}\x{3b1}\x{3b1}\x{3b1} - 2: \x{391}\x{3b1}\x{3b1} - 3: \x{391}\x{3b1} - 4: \x{391} /\x{391}{3,5}(.)/8i \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X @@ -1236,8 +1194,6 @@ No match /^\p{Han}+/8 \x{2e81}\x{3007}\x{2f804}\x{31a0} 0: \x{2e81}\x{3007}\x{2f804} - 1: \x{2e81}\x{3007} - 2: \x{2e81} ** Failers No match \x{2e7f} @@ -1248,15 +1204,6 @@ No match 0: \x{3105} ** Failers 0: ** Failers - 1: ** Failer - 2: ** Faile - 3: ** Fail - 4: ** Fai - 5: ** Fa - 6: ** F - 7: ** - 8: ** - 9: * \x{30ff} No match @@ -1469,12 +1416,8 @@ No match /^\p{Any}{3,5}/8 abcdefgh 0: abcde - 1: abcd - 2: abc \x{1234}\n\r\x{3456}xyz 0: \x{1234}\x{0a}\x{0d}\x{3456}x - 1: \x{1234}\x{0a}\x{0d}\x{3456} - 2: \x{1234}\x{0a}\x{0d} /^\P{Any}{3,5}?/8 ** Failers @@ -1639,14 +1582,10 @@ No match /\x{c0}+\x{116}+/8i \x{c0}\x{e0}\x{116}\x{117} 0: \x{c0}\x{e0}\x{116}\x{117} - 1: \x{c0}\x{e0}\x{116} /[\x{c0}\x{116}]+/8i \x{c0}\x{e0}\x{116}\x{117} 0: \x{c0}\x{e0}\x{116}\x{117} - 1: \x{c0}\x{e0}\x{116} - 2: \x{c0}\x{e0} - 3: \x{c0} /Check property support in non-UTF-8 mode/ @@ -1693,16 +1632,6 @@ No match /^\p{Xan}+/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 1: ABCD1234\x{6ca}\x{a6c} - 2: ABCD1234\x{6ca} - 3: ABCD1234 - 4: ABCD123 - 5: ABCD12 - 6: ABCD1 - 7: ABCD - 8: ABC - 9: AB -10: A ** Failers No match _ABC @@ -1711,28 +1640,10 @@ No match /^\p{Xan}*/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 1: ABCD1234\x{6ca}\x{a6c} - 2: ABCD1234\x{6ca} - 3: ABCD1234 - 4: ABCD123 - 5: ABCD12 - 6: ABCD1 - 7: ABCD - 8: ABC - 9: AB -10: A -11: /^\p{Xan}{2,9}/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca} - 1: ABCD1234 - 2: ABCD123 - 3: ABCD12 - 4: ABCD1 - 5: ABCD - 6: ABC - 7: AB /^[\p{Xan}]/8 ABCD1234_ @@ -1753,16 +1664,6 @@ No match /^[\p{Xan}]+/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 1: ABCD1234\x{6ca}\x{a6c} - 2: ABCD1234\x{6ca} - 3: ABCD1234 - 4: ABCD123 - 5: ABCD12 - 6: ABCD1 - 7: ABCD - 8: ABC - 9: AB -10: A ** Failers No match _ABC @@ -1776,53 +1677,57 @@ No match \x{0b} No match -/^>\p{Xsp}+/8 +/^>\p{Xsp}+/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 3: > \x{09}\x{0a}\x{0c}\x{0d} - 4: > \x{09}\x{0a}\x{0c} - 5: > \x{09}\x{0a} - 6: > \x{09} - 7: > - -/^>\p{Xsp}*/8 + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > + +/^>\p{Xsp}*/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 3: > \x{09}\x{0a}\x{0c}\x{0d} - 4: > \x{09}\x{0a}\x{0c} - 5: > \x{09}\x{0a} - 6: > \x{09} - 7: > - 8: > + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > + 9: > -/^>\p{Xsp}{2,9}/8 +/^>\p{Xsp}{2,9}/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 3: > \x{09}\x{0a}\x{0c}\x{0d} - 4: > \x{09}\x{0a}\x{0c} - 5: > \x{09}\x{0a} - 6: > \x{09} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} -/^>[\p{Xsp}]/8 +/^>[\p{Xsp}]/8O >\x{2028}\x{0b} 0: >\x{2028} -/^>[\p{Xsp}]+/8 +/^>[\p{Xsp}]+/8O > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 3: > \x{09}\x{0a}\x{0c}\x{0d} - 4: > \x{09}\x{0a}\x{0c} - 5: > \x{09}\x{0a} - 6: > \x{09} - 7: > + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > /^>\p{Xps}/8 >\x{1680}\x{2028}\x{0b} @@ -1837,14 +1742,6 @@ No match /^>\p{Xps}+/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 4: > \x{09}\x{0a}\x{0c}\x{0d} - 5: > \x{09}\x{0a}\x{0c} - 6: > \x{09}\x{0a} - 7: > \x{09} - 8: > /^>\p{Xps}+?/8 >\x{1680}\x{2028}\x{0b} @@ -1855,26 +1752,10 @@ No match /^>\p{Xps}*/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 4: > \x{09}\x{0a}\x{0c}\x{0d} - 5: > \x{09}\x{0a}\x{0c} - 6: > \x{09}\x{0a} - 7: > \x{09} - 8: > - 9: > /^>\p{Xps}{2,9}/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 4: > \x{09}\x{0a}\x{0c}\x{0d} - 5: > \x{09}\x{0a}\x{0c} - 6: > \x{09}\x{0a} - 7: > \x{09} /^>\p{Xps}{2,9}?/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} @@ -1894,14 +1775,6 @@ No match /^>[\p{Xps}]+/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} - 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} - 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} - 4: > \x{09}\x{0a}\x{0c}\x{0d} - 5: > \x{09}\x{0a}\x{0c} - 6: > \x{09}\x{0a} - 7: > \x{09} - 8: > /^\p{Xwd}/8 ABCD @@ -1924,42 +1797,14 @@ No match /^\p{Xwd}+/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ - 1: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 2: ABCD1234\x{6ca}\x{a6c} - 3: ABCD1234\x{6ca} - 4: ABCD1234 - 5: ABCD123 - 6: ABCD12 - 7: ABCD1 - 8: ABCD - 9: ABC -10: AB -11: A /^\p{Xwd}*/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ - 1: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 2: ABCD1234\x{6ca}\x{a6c} - 3: ABCD1234\x{6ca} - 4: ABCD1234 - 5: ABCD123 - 6: ABCD12 - 7: ABCD1 - 8: ABCD - 9: ABC -10: AB -11: A -12: /^\p{Xwd}{2,9}/8 A_12\x{6ca}\x{a6c}\x{10a7} 0: A_12\x{6ca}\x{a6c}\x{10a7} - 1: A_12\x{6ca}\x{a6c} - 2: A_12\x{6ca} - 3: A_12 - 4: A_1 - 5: A_ /^[\p{Xwd}]/8 ABCD1234_ @@ -1982,17 +1827,6 @@ No match /^[\p{Xwd}]+/8 ABCD1234\x{6ca}\x{a6c}\x{10a7}_ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ - 1: ABCD1234\x{6ca}\x{a6c}\x{10a7} - 2: ABCD1234\x{6ca}\x{a6c} - 3: ABCD1234\x{6ca} - 4: ABCD1234 - 5: ABCD123 - 6: ABCD12 - 7: ABCD1 - 8: ABCD - 9: ABC -10: AB -11: A /-- Unicode properties for \b abd \B --/ @@ -2043,7 +1877,6 @@ No match /[^\x{100}]+/8i \x{100}\x{101}XX 0: XX - 1: X /^\X/8 A\P @@ -2090,7 +1923,6 @@ Partial match: A\x{300}\x{301}A\x{300}\x{301} /^\X+/8 AA\P 0: AA - 1: A AA\P\P Partial match: AA @@ -2271,435 +2103,299 @@ Partial match: AA /\x{1e9e}+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /[z\x{1e9e}]+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /\x{00df}+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /[z\x{00df}]+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /\x{1f88}+/8i \x{1f88}\x{1f80} 0: \x{1f88}\x{1f80} - 1: \x{1f88} /[z\x{1f88}]+/8i \x{1f88}\x{1f80} 0: \x{1f88}\x{1f80} - 1: \x{1f88} /-- Perl matches these --/ /\x{00b5}+/8i \x{00b5}\x{039c}\x{03bc} 0: \x{b5}\x{39c}\x{3bc} - 1: \x{b5}\x{39c} - 2: \x{b5} /\x{039c}+/8i \x{00b5}\x{039c}\x{03bc} 0: \x{b5}\x{39c}\x{3bc} - 1: \x{b5}\x{39c} - 2: \x{b5} /\x{03bc}+/8i \x{00b5}\x{039c}\x{03bc} 0: \x{b5}\x{39c}\x{3bc} - 1: \x{b5}\x{39c} - 2: \x{b5} /\x{00c5}+/8i \x{00c5}\x{00e5}\x{212b} 0: \x{c5}\x{e5}\x{212b} - 1: \x{c5}\x{e5} - 2: \x{c5} /\x{00e5}+/8i \x{00c5}\x{00e5}\x{212b} 0: \x{c5}\x{e5}\x{212b} - 1: \x{c5}\x{e5} - 2: \x{c5} /\x{212b}+/8i \x{00c5}\x{00e5}\x{212b} 0: \x{c5}\x{e5}\x{212b} - 1: \x{c5}\x{e5} - 2: \x{c5} /\x{01c4}+/8i \x{01c4}\x{01c5}\x{01c6} 0: \x{1c4}\x{1c5}\x{1c6} - 1: \x{1c4}\x{1c5} - 2: \x{1c4} /\x{01c5}+/8i \x{01c4}\x{01c5}\x{01c6} 0: \x{1c4}\x{1c5}\x{1c6} - 1: \x{1c4}\x{1c5} - 2: \x{1c4} /\x{01c6}+/8i \x{01c4}\x{01c5}\x{01c6} 0: \x{1c4}\x{1c5}\x{1c6} - 1: \x{1c4}\x{1c5} - 2: \x{1c4} /\x{01c7}+/8i \x{01c7}\x{01c8}\x{01c9} 0: \x{1c7}\x{1c8}\x{1c9} - 1: \x{1c7}\x{1c8} - 2: \x{1c7} /\x{01c8}+/8i \x{01c7}\x{01c8}\x{01c9} 0: \x{1c7}\x{1c8}\x{1c9} - 1: \x{1c7}\x{1c8} - 2: \x{1c7} /\x{01c9}+/8i \x{01c7}\x{01c8}\x{01c9} 0: \x{1c7}\x{1c8}\x{1c9} - 1: \x{1c7}\x{1c8} - 2: \x{1c7} /\x{01ca}+/8i \x{01ca}\x{01cb}\x{01cc} 0: \x{1ca}\x{1cb}\x{1cc} - 1: \x{1ca}\x{1cb} - 2: \x{1ca} /\x{01cb}+/8i \x{01ca}\x{01cb}\x{01cc} 0: \x{1ca}\x{1cb}\x{1cc} - 1: \x{1ca}\x{1cb} - 2: \x{1ca} /\x{01cc}+/8i \x{01ca}\x{01cb}\x{01cc} 0: \x{1ca}\x{1cb}\x{1cc} - 1: \x{1ca}\x{1cb} - 2: \x{1ca} /\x{01f1}+/8i \x{01f1}\x{01f2}\x{01f3} 0: \x{1f1}\x{1f2}\x{1f3} - 1: \x{1f1}\x{1f2} - 2: \x{1f1} /\x{01f2}+/8i \x{01f1}\x{01f2}\x{01f3} 0: \x{1f1}\x{1f2}\x{1f3} - 1: \x{1f1}\x{1f2} - 2: \x{1f1} /\x{01f3}+/8i \x{01f1}\x{01f2}\x{01f3} 0: \x{1f1}\x{1f2}\x{1f3} - 1: \x{1f1}\x{1f2} - 2: \x{1f1} /\x{0345}+/8i \x{0345}\x{0399}\x{03b9}\x{1fbe} 0: \x{345}\x{399}\x{3b9}\x{1fbe} - 1: \x{345}\x{399}\x{3b9} - 2: \x{345}\x{399} - 3: \x{345} /\x{0399}+/8i \x{0345}\x{0399}\x{03b9}\x{1fbe} 0: \x{345}\x{399}\x{3b9}\x{1fbe} - 1: \x{345}\x{399}\x{3b9} - 2: \x{345}\x{399} - 3: \x{345} /\x{03b9}+/8i \x{0345}\x{0399}\x{03b9}\x{1fbe} 0: \x{345}\x{399}\x{3b9}\x{1fbe} - 1: \x{345}\x{399}\x{3b9} - 2: \x{345}\x{399} - 3: \x{345} /\x{1fbe}+/8i \x{0345}\x{0399}\x{03b9}\x{1fbe} 0: \x{345}\x{399}\x{3b9}\x{1fbe} - 1: \x{345}\x{399}\x{3b9} - 2: \x{345}\x{399} - 3: \x{345} /\x{0392}+/8i \x{0392}\x{03b2}\x{03d0} 0: \x{392}\x{3b2}\x{3d0} - 1: \x{392}\x{3b2} - 2: \x{392} /\x{03b2}+/8i \x{0392}\x{03b2}\x{03d0} 0: \x{392}\x{3b2}\x{3d0} - 1: \x{392}\x{3b2} - 2: \x{392} /\x{03d0}+/8i \x{0392}\x{03b2}\x{03d0} 0: \x{392}\x{3b2}\x{3d0} - 1: \x{392}\x{3b2} - 2: \x{392} /\x{0395}+/8i \x{0395}\x{03b5}\x{03f5} 0: \x{395}\x{3b5}\x{3f5} - 1: \x{395}\x{3b5} - 2: \x{395} /\x{03b5}+/8i \x{0395}\x{03b5}\x{03f5} 0: \x{395}\x{3b5}\x{3f5} - 1: \x{395}\x{3b5} - 2: \x{395} /\x{03f5}+/8i \x{0395}\x{03b5}\x{03f5} 0: \x{395}\x{3b5}\x{3f5} - 1: \x{395}\x{3b5} - 2: \x{395} /\x{0398}+/8i \x{0398}\x{03b8}\x{03d1}\x{03f4} 0: \x{398}\x{3b8}\x{3d1}\x{3f4} - 1: \x{398}\x{3b8}\x{3d1} - 2: \x{398}\x{3b8} - 3: \x{398} /\x{03b8}+/8i \x{0398}\x{03b8}\x{03d1}\x{03f4} 0: \x{398}\x{3b8}\x{3d1}\x{3f4} - 1: \x{398}\x{3b8}\x{3d1} - 2: \x{398}\x{3b8} - 3: \x{398} /\x{03d1}+/8i \x{0398}\x{03b8}\x{03d1}\x{03f4} 0: \x{398}\x{3b8}\x{3d1}\x{3f4} - 1: \x{398}\x{3b8}\x{3d1} - 2: \x{398}\x{3b8} - 3: \x{398} /\x{03f4}+/8i \x{0398}\x{03b8}\x{03d1}\x{03f4} 0: \x{398}\x{3b8}\x{3d1}\x{3f4} - 1: \x{398}\x{3b8}\x{3d1} - 2: \x{398}\x{3b8} - 3: \x{398} /\x{039a}+/8i \x{039a}\x{03ba}\x{03f0} 0: \x{39a}\x{3ba}\x{3f0} - 1: \x{39a}\x{3ba} - 2: \x{39a} /\x{03ba}+/8i \x{039a}\x{03ba}\x{03f0} 0: \x{39a}\x{3ba}\x{3f0} - 1: \x{39a}\x{3ba} - 2: \x{39a} /\x{03f0}+/8i \x{039a}\x{03ba}\x{03f0} 0: \x{39a}\x{3ba}\x{3f0} - 1: \x{39a}\x{3ba} - 2: \x{39a} /\x{03a0}+/8i \x{03a0}\x{03c0}\x{03d6} 0: \x{3a0}\x{3c0}\x{3d6} - 1: \x{3a0}\x{3c0} - 2: \x{3a0} /\x{03c0}+/8i \x{03a0}\x{03c0}\x{03d6} 0: \x{3a0}\x{3c0}\x{3d6} - 1: \x{3a0}\x{3c0} - 2: \x{3a0} /\x{03d6}+/8i \x{03a0}\x{03c0}\x{03d6} 0: \x{3a0}\x{3c0}\x{3d6} - 1: \x{3a0}\x{3c0} - 2: \x{3a0} /\x{03a1}+/8i \x{03a1}\x{03c1}\x{03f1} 0: \x{3a1}\x{3c1}\x{3f1} - 1: \x{3a1}\x{3c1} - 2: \x{3a1} /\x{03c1}+/8i \x{03a1}\x{03c1}\x{03f1} 0: \x{3a1}\x{3c1}\x{3f1} - 1: \x{3a1}\x{3c1} - 2: \x{3a1} /\x{03f1}+/8i \x{03a1}\x{03c1}\x{03f1} 0: \x{3a1}\x{3c1}\x{3f1} - 1: \x{3a1}\x{3c1} - 2: \x{3a1} /\x{03a3}+/8i \x{03A3}\x{03C2}\x{03C3} 0: \x{3a3}\x{3c2}\x{3c3} - 1: \x{3a3}\x{3c2} - 2: \x{3a3} /\x{03c2}+/8i \x{03A3}\x{03C2}\x{03C3} 0: \x{3a3}\x{3c2}\x{3c3} - 1: \x{3a3}\x{3c2} - 2: \x{3a3} /\x{03c3}+/8i \x{03A3}\x{03C2}\x{03C3} 0: \x{3a3}\x{3c2}\x{3c3} - 1: \x{3a3}\x{3c2} - 2: \x{3a3} /\x{03a6}+/8i \x{03a6}\x{03c6}\x{03d5} 0: \x{3a6}\x{3c6}\x{3d5} - 1: \x{3a6}\x{3c6} - 2: \x{3a6} /\x{03c6}+/8i \x{03a6}\x{03c6}\x{03d5} 0: \x{3a6}\x{3c6}\x{3d5} - 1: \x{3a6}\x{3c6} - 2: \x{3a6} /\x{03d5}+/8i \x{03a6}\x{03c6}\x{03d5} 0: \x{3a6}\x{3c6}\x{3d5} - 1: \x{3a6}\x{3c6} - 2: \x{3a6} /\x{03c9}+/8i \x{03c9}\x{03a9}\x{2126} 0: \x{3c9}\x{3a9}\x{2126} - 1: \x{3c9}\x{3a9} - 2: \x{3c9} /\x{03a9}+/8i \x{03c9}\x{03a9}\x{2126} 0: \x{3c9}\x{3a9}\x{2126} - 1: \x{3c9}\x{3a9} - 2: \x{3c9} /\x{2126}+/8i \x{03c9}\x{03a9}\x{2126} 0: \x{3c9}\x{3a9}\x{2126} - 1: \x{3c9}\x{3a9} - 2: \x{3c9} /\x{1e60}+/8i \x{1e60}\x{1e61}\x{1e9b} 0: \x{1e60}\x{1e61}\x{1e9b} - 1: \x{1e60}\x{1e61} - 2: \x{1e60} /\x{1e61}+/8i \x{1e60}\x{1e61}\x{1e9b} 0: \x{1e60}\x{1e61}\x{1e9b} - 1: \x{1e60}\x{1e61} - 2: \x{1e60} /\x{1e9b}+/8i \x{1e60}\x{1e61}\x{1e9b} 0: \x{1e60}\x{1e61}\x{1e9b} - 1: \x{1e60}\x{1e61} - 2: \x{1e60} /\x{1e9e}+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /\x{00df}+/8i \x{1e9e}\x{00df} 0: \x{1e9e}\x{df} - 1: \x{1e9e} /\x{1f88}+/8i \x{1f88}\x{1f80} 0: \x{1f88}\x{1f80} - 1: \x{1f88} /\x{1f80}+/8i \x{1f88}\x{1f80} 0: \x{1f88}\x{1f80} - 1: \x{1f88} /\x{004b}+/8i \x{004b}\x{006b}\x{212a} 0: Kk\x{212a} - 1: Kk - 2: K /\x{006b}+/8i \x{004b}\x{006b}\x{212a} 0: Kk\x{212a} - 1: Kk - 2: K /\x{212a}+/8i \x{004b}\x{006b}\x{212a} 0: Kk\x{212a} - 1: Kk - 2: K /\x{0053}+/8i \x{0053}\x{0073}\x{017f} 0: Ss\x{17f} - 1: Ss - 2: S /\x{0073}+/8i \x{0053}\x{0073}\x{017f} 0: Ss\x{17f} - 1: Ss - 2: S /\x{017f}+/8i \x{0053}\x{0073}\x{017f} 0: Ss\x{17f} - 1: Ss - 2: S /ist/8i ikt @@ -2723,4 +2419,129 @@ No match iskt No match +/^\p{Xuc}/8 + $abc + 0: $ + @abc + 0: @ + `abc + 0: ` + \x{1234}abc + 0: \x{1234} + ** Failers +No match + abc +No match + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + 1: $@`\x{a0}\x{1234} + 2: $@`\x{a0} + 3: $@` + 4: $@ + 5: $ + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000}* + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + 1: $@`\x{a0} + 2: $@` + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\P{Xuc}/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^[\P{Xuc}]/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^A\s+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + /-- End of testinput10 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput11-16 b/ext/pcre/pcrelib/testdata/testoutput11-16 new file mode 100644 index 000000000..f1ad8887b --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput11-16 @@ -0,0 +1,712 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 5 CBra 1 + 5 /i b + 7 5 Ket + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 38 +------------------------------------------------------------------ + 0 16 Bra + 2 7 CBra 1 + 5 AllAny* + 7 X + 9 5 Alt + 11 ^ + 12 B + 14 12 Ket + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 36 +------------------------------------------------------------------ + 0 15 Bra + 2 6 Bra + 4 AllAny* + 6 X + 8 5 Alt + 10 ^ + 11 B + 13 11 Ket + 15 15 Ket + 17 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 46 +------------------------------------------------------------------ + 0 20 Bra + 2 ^ + 3 [0-9A-Za-z] + 20 20 Ket + 22 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 2 Bra + 2 2 Ket + 4 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 x?+ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 x++ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 20 +------------------------------------------------------------------ + 0 7 Bra + 2 x + 4 x{0,2}+ + 7 7 Ket + 9 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 Braposzero + 3 5 CBraPos 1 + 6 x + 8 5 KetRpos + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 142 +------------------------------------------------------------------ + 0 68 Bra + 2 ^ + 3 63 CBra 1 + 6 5 CBra 2 + 9 a+ + 11 5 Ket + 13 21 CBra 3 + 16 [ab]+? + 34 21 Ket + 36 21 CBra 4 + 39 [bc]+ + 57 21 Ket + 59 5 CBra 5 + 62 \w*+ + 64 5 Ket + 66 63 Ket + 68 68 Ket + 70 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 1648 +------------------------------------------------------------------ + 0 821 Bra + 2 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +820 \b +821 821 Ket +823 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 1628 +------------------------------------------------------------------ + 0 811 Bra + 2 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +810 \b +811 811 Ket +813 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 9 CBra 1 + 5 a + 7 2 Recurse + 9 b + 11 9 Ket + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 17 Bra + 2 13 CBra 1 + 5 a + 7 4 Once + 9 2 Recurse + 11 4 KetRmax + 13 b + 15 13 Ket + 17 17 Ket + 19 End +------------------------------------------------------------------ + +/a(?P<name1>b|c)d(?P<longername2>e)/BM +Memory allocation (code space): 80 +------------------------------------------------------------------ + 0 24 Bra + 2 a + 4 5 CBra 1 + 7 b + 9 4 Alt + 11 c + 13 9 Ket + 15 d + 17 5 CBra 2 + 20 e + 22 5 Ket + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM +Memory allocation (code space): 73 +------------------------------------------------------------------ + 0 29 Bra + 2 18 Bra + 4 a + 6 12 CBra 1 + 9 c + 11 5 CBra 2 + 14 d + 16 5 Ket + 18 12 Ket + 20 18 Ket + 22 5 CBra 3 + 25 a + 27 5 Ket + 29 29 Ket + 31 End +------------------------------------------------------------------ + +/(?P<a>a)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 57 +------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 + 5 a + 7 5 Ket + 9 Any + 10 Any + 11 Any + 12 \1 + 14 bbb + 20 2 Recurse + 22 d + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 50 +------------------------------------------------------------------ + 0 22 Bra + 2 abc + 8 Callout 255 10 1 + 12 de + 16 Callout 0 16 1 + 20 f + 22 22 Ket + 24 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 78 +------------------------------------------------------------------ + 0 36 Bra + 2 Callout 255 0 1 + 6 a + 8 Callout 255 1 1 + 12 b + 14 Callout 255 2 1 + 18 c + 20 Callout 255 3 1 + 24 d + 26 Callout 255 4 1 + 30 e + 32 Callout 255 5 0 + 36 36 Ket + 38 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{1000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{10000} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{100000} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{10ffff} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x80 + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 A\x{2262}\x{391}. + 10 10 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{d55c}\x{ad6d}\x{c5b4} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{65e5}\x{672c}\x{8a9e} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + +/[\x{100}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 54 +------------------------------------------------------------------ + 0 24 Bra + 2 [Z\x{100}] + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 13 + +/[\p{L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 27 Bra + 2 [a-c\p{L}\x{660}] + 27 27 Ket + 29 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 58 +------------------------------------------------------------------ + 0 26 Bra + 2 [+\-\p{Nd}]++ + 26 26 Ket + 28 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\x{104}-\x{109}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 23 Bra + 2 19 CBra 1 + 5 Brazero + 6 13 SCBra 2 + 9 6 Cond + 11 1 Cond ref + 13 0 + 15 2 Alt + 17 8 Ket + 19 13 KetRmax + 21 19 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 42 +------------------------------------------------------------------ + 0 18 Bra + 2 14 CBra 1 + 5 Brazero + 6 6 SCond + 8 1 Cond ref + 10 0 + 12 2 Alt + 14 8 KetRmax + 16 14 Ket + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 9 Bra + 2 [^\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 26 Bra + 2 [ -~\x80-\xff\P{L}]++ + 26 26 Ket + 28 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 26 Bra + 2 [ -~\x80-\xff\P{L}]++ + 26 26 Ket + 28 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 10 Bra + 2 [\p{L}]++ + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 13 Bra + 2 [\P{L}\P{Xsp}]++ + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 60 Bra + 2 abc + 8 5 CBra 1 + 11 d + 13 4 Alt + 15 e + 17 9 Ket + 19 *THEN + 20 x + 22 12 CBra 2 + 25 123 + 31 *THEN + 32 4 + 34 24 Alt + 36 567 + 42 5 CBra 3 + 45 b + 47 4 Alt + 49 q + 51 9 Ket + 53 *THEN + 54 xx + 58 36 Ket + 60 60 Ket + 62 End +------------------------------------------------------------------ + +/-- End of testinput11 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput11-32 b/ext/pcre/pcrelib/testdata/testoutput11-32 new file mode 100644 index 000000000..266e55d06 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput11-32 @@ -0,0 +1,712 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 5 CBra 1 + 5 /i b + 7 5 Ket + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 76 +------------------------------------------------------------------ + 0 16 Bra + 2 7 CBra 1 + 5 AllAny* + 7 X + 9 5 Alt + 11 ^ + 12 B + 14 12 Ket + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 72 +------------------------------------------------------------------ + 0 15 Bra + 2 6 Bra + 4 AllAny* + 6 X + 8 5 Alt + 10 ^ + 11 B + 13 11 Ket + 15 15 Ket + 17 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 ^ + 3 [0-9A-Za-z] + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 20 +------------------------------------------------------------------ + 0 2 Bra + 2 2 Ket + 4 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 x?+ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 x++ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 7 Bra + 2 x + 4 x{0,2}+ + 7 7 Ket + 9 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 Braposzero + 3 5 CBraPos 1 + 6 x + 8 5 KetRpos + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 220 +------------------------------------------------------------------ + 0 52 Bra + 2 ^ + 3 47 CBra 1 + 6 5 CBra 2 + 9 a+ + 11 5 Ket + 13 13 CBra 3 + 16 [ab]+? + 26 13 Ket + 28 13 CBra 4 + 31 [bc]+ + 41 13 Ket + 43 5 CBra 5 + 46 \w*+ + 48 5 Ket + 50 47 Ket + 52 52 Ket + 54 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 3296 +------------------------------------------------------------------ + 0 821 Bra + 2 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +820 \b +821 821 Ket +823 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 3256 +------------------------------------------------------------------ + 0 811 Bra + 2 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +810 \b +811 811 Ket +813 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 64 +------------------------------------------------------------------ + 0 13 Bra + 2 9 CBra 1 + 5 a + 7 2 Recurse + 9 b + 11 9 Ket + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 80 +------------------------------------------------------------------ + 0 17 Bra + 2 13 CBra 1 + 5 a + 7 4 Once + 9 2 Recurse + 11 4 KetRmax + 13 b + 15 13 Ket + 17 17 Ket + 19 End +------------------------------------------------------------------ + +/a(?P<name1>b|c)d(?P<longername2>e)/BM +Memory allocation (code space): 186 +------------------------------------------------------------------ + 0 24 Bra + 2 a + 4 5 CBra 1 + 7 b + 9 4 Alt + 11 c + 13 9 Ket + 15 d + 17 5 CBra 2 + 20 e + 22 5 Ket + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM +Memory allocation (code space): 155 +------------------------------------------------------------------ + 0 29 Bra + 2 18 Bra + 4 a + 6 12 CBra 1 + 9 c + 11 5 CBra 2 + 14 d + 16 5 Ket + 18 12 Ket + 20 18 Ket + 22 5 CBra 3 + 25 a + 27 5 Ket + 29 29 Ket + 31 End +------------------------------------------------------------------ + +/(?P<a>a)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 117 +------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 + 5 a + 7 5 Ket + 9 Any + 10 Any + 11 Any + 12 \1 + 14 bbb + 20 2 Recurse + 22 d + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 100 +------------------------------------------------------------------ + 0 22 Bra + 2 abc + 8 Callout 255 10 1 + 12 de + 16 Callout 0 16 1 + 20 f + 22 22 Ket + 24 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 156 +------------------------------------------------------------------ + 0 36 Bra + 2 Callout 255 0 1 + 6 a + 8 Callout 255 1 1 + 12 b + 14 Callout 255 2 1 + 18 c + 20 Callout 255 3 1 + 24 d + 26 Callout 255 4 1 + 30 e + 32 Callout 255 5 0 + 36 36 Ket + 38 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{1000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{10000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{10ffff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x80 + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 A\x{2262}\x{391}. + 10 10 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 44 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{d55c}\x{ad6d}\x{c5b4} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 44 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{65e5}\x{672c}\x{8a9e} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + +/[\x{100}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 76 +------------------------------------------------------------------ + 0 16 Bra + 2 [Z\x{100}] + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 13 + +/[\p{L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 88 +------------------------------------------------------------------ + 0 19 Bra + 2 [a-c\p{L}\x{660}] + 19 19 Ket + 21 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 84 +------------------------------------------------------------------ + 0 18 Bra + 2 [+\-\p{Nd}]++ + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\x{104}-\x{109}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 104 +------------------------------------------------------------------ + 0 23 Bra + 2 19 CBra 1 + 5 Brazero + 6 13 SCBra 2 + 9 6 Cond + 11 1 Cond ref + 13 0 + 15 2 Alt + 17 8 Ket + 19 13 KetRmax + 21 19 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 84 +------------------------------------------------------------------ + 0 18 Bra + 2 14 CBra 1 + 5 Brazero + 6 6 SCond + 8 1 Cond ref + 10 0 + 12 2 Alt + 14 8 KetRmax + 16 14 Ket + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 9 Bra + 2 [^\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 18 Bra + 2 [ -~\x80-\xff\P{L}]++ + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 18 Bra + 2 [ -~\x80-\xff\P{L}]++ + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 10 Bra + 2 [\p{L}]++ + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 13 Bra + 2 [\P{L}\P{Xsp}]++ + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 60 Bra + 2 abc + 8 5 CBra 1 + 11 d + 13 4 Alt + 15 e + 17 9 Ket + 19 *THEN + 20 x + 22 12 CBra 2 + 25 123 + 31 *THEN + 32 4 + 34 24 Alt + 36 567 + 42 5 CBra 3 + 45 b + 47 4 Alt + 49 q + 51 9 Ket + 53 *THEN + 54 xx + 58 36 Ket + 60 60 Ket + 62 End +------------------------------------------------------------------ + +/-- End of testinput11 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput11-8 b/ext/pcre/pcrelib/testdata/testoutput11-8 new file mode 100644 index 000000000..d4a21334e --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput11-8 @@ -0,0 +1,712 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 17 +------------------------------------------------------------------ + 0 13 Bra + 3 7 CBra 1 + 8 /i b + 10 7 Ket + 13 13 Ket + 16 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 9 CBra 1 + 8 AllAny* + 10 X + 12 6 Alt + 15 ^ + 16 B + 18 15 Ket + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 23 +------------------------------------------------------------------ + 0 19 Bra + 3 7 Bra + 6 AllAny* + 8 X + 10 6 Alt + 13 ^ + 14 B + 16 13 Ket + 19 19 Ket + 22 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 41 +------------------------------------------------------------------ + 0 37 Bra + 3 ^ + 4 [0-9A-Za-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 7 +------------------------------------------------------------------ + 0 3 Bra + 3 3 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 x?+ + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 x++ + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 13 +------------------------------------------------------------------ + 0 9 Bra + 3 x + 5 x{0,2}+ + 9 9 Ket + 12 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 Braposzero + 4 7 CBraPos 1 + 9 x + 11 7 KetRpos + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 120 +------------------------------------------------------------------ + 0 116 Bra + 3 ^ + 4 109 CBra 1 + 9 7 CBra 2 + 14 a+ + 16 7 Ket + 19 39 CBra 3 + 24 [ab]+? + 58 39 Ket + 61 39 CBra 4 + 66 [bc]+ +100 39 Ket +103 7 CBra 5 +108 \w*+ +110 7 Ket +113 109 Ket +116 116 Ket +119 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 826 +------------------------------------------------------------------ + 0 822 Bra + 3 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +821 \b +822 822 Ket +825 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 816 +------------------------------------------------------------------ + 0 812 Bra + 3 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +811 \b +812 812 Ket +815 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 18 Bra + 3 12 CBra 1 + 8 a + 10 3 Recurse + 13 b + 15 12 Ket + 18 18 Ket + 21 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 24 Bra + 3 18 CBra 1 + 8 a + 10 6 Once + 13 3 Recurse + 16 6 KetRmax + 19 b + 21 18 Ket + 24 24 Ket + 27 End +------------------------------------------------------------------ + +/a(?P<name1>b|c)d(?P<longername2>e)/BM +Memory allocation (code space): 36 +------------------------------------------------------------------ + 0 32 Bra + 3 a + 5 7 CBra 1 + 10 b + 12 5 Alt + 15 c + 17 12 Ket + 20 d + 22 7 CBra 2 + 27 e + 29 7 Ket + 32 32 Ket + 35 End +------------------------------------------------------------------ + +/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM +Memory allocation (code space): 45 +------------------------------------------------------------------ + 0 41 Bra + 3 25 Bra + 6 a + 8 17 CBra 1 + 13 c + 15 7 CBra 2 + 20 d + 22 7 Ket + 25 17 Ket + 28 25 Ket + 31 7 CBra 3 + 36 a + 38 7 Ket + 41 41 Ket + 44 End +------------------------------------------------------------------ + +/(?P<a>a)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 34 +------------------------------------------------------------------ + 0 30 Bra + 3 7 CBra 1 + 8 a + 10 7 Ket + 13 Any + 14 Any + 15 Any + 16 \1 + 19 bbb + 25 3 Recurse + 28 d + 30 30 Ket + 33 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 31 +------------------------------------------------------------------ + 0 27 Bra + 3 abc + 9 Callout 255 10 1 + 15 de + 19 Callout 0 16 1 + 25 f + 27 27 Ket + 30 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 53 +------------------------------------------------------------------ + 0 49 Bra + 3 Callout 255 0 1 + 9 a + 11 Callout 255 1 1 + 17 b + 19 Callout 255 2 1 + 25 c + 27 Callout 255 3 1 + 33 d + 35 Callout 255 4 1 + 41 e + 43 Callout 255 5 0 + 49 49 Ket + 52 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 11 +------------------------------------------------------------------ + 0 7 Bra + 3 \x{1000} + 7 7 Ket + 10 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{10000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{100000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{10ffff} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{80} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 A\x{2262}\x{391}. + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{d55c}\x{ad6d}\x{c5b4} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ed} +Need char = \x{b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{65e5}\x{672c}\x{8a9e} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e6} +Need char = \x{9e} + +/[\x{100}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 47 +------------------------------------------------------------------ + 0 43 Bra + 3 [Z\x{100}] + 43 43 Ket + 46 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 15 + +/[\p{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 50 +------------------------------------------------------------------ + 0 46 Bra + 3 [a-c\p{L}\x{660}] + 46 46 Ket + 49 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{Nd}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 44 Bra + 3 [+\-\p{Nd}]++ + 44 44 Ket + 47 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 17 +------------------------------------------------------------------ + 0 13 Bra + 3 [\x{104}-\x{109}] + 13 13 Ket + 16 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 38 +------------------------------------------------------------------ + 0 34 Bra + 3 28 CBra 1 + 8 Brazero + 9 19 SCBra 2 + 14 8 Cond + 17 1 Cond ref + 20 0 + 22 3 Alt + 25 11 Ket + 28 19 KetRmax + 31 28 Ket + 34 34 Ket + 37 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 30 +------------------------------------------------------------------ + 0 26 Bra + 3 20 CBra 1 + 8 Brazero + 9 8 SCond + 12 1 Cond ref + 15 0 + 17 3 Alt + 20 11 KetRmax + 23 20 Ket + 26 26 Ket + 29 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 \x{aa} + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{aa} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^\x{aa}] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 [^\x{aa}] + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 11 Bra + 3 [^\p{Nd}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 44 Bra + 3 [ -~\x80-\xff\P{L}]++ + 44 44 Ket + 47 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 44 Bra + 3 [ -~\x80-\xff\P{L}]++ + 44 44 Ket + 47 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 12 Bra + 3 [\p{L}]++ + 12 12 Ket + 15 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 15 Bra + 3 [\P{L}\P{Xsp}]++ + 15 15 Ket + 18 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 73 Bra + 3 abc + 9 7 CBra 1 + 14 d + 16 5 Alt + 19 e + 21 12 Ket + 24 *THEN + 25 x + 27 14 CBra 2 + 32 123 + 38 *THEN + 39 4 + 41 29 Alt + 44 567 + 50 7 CBra 3 + 55 b + 57 5 Alt + 60 q + 62 12 Ket + 65 *THEN + 66 xx + 70 43 Ket + 73 73 Ket + 76 End +------------------------------------------------------------------ + +/-- End of testinput11 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput12 b/ext/pcre/pcrelib/testdata/testoutput12 new file mode 100644 index 000000000..a76e2aef8 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput12 @@ -0,0 +1,179 @@ +/-- This test is run only when JIT support is available. It checks for a +successful and an unsuccessful JIT compile and save and restore behaviour, +and a couple of things that are different with JIT. --/ + +/abc/S+I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No set of starting bytes +JIT study was successful + +/(?(?C1)(?=a)a)/S+I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL +JIT study was not successful + +/(?(?C1)(?=a)a)/S!+I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Subject length lower bound = -1 +No set of starting bytes +JIT study was not successful + +/abc/S+I>testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No set of starting bytes +JIT study was successful +Compiled pattern written to testsavedregex +Study data written to testsavedregex + +<testsavedregex +Compiled pattern loaded from testsavedregex +Study data loaded from testsavedregex + abc + 0: abc + +/a*/SI +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL + +/(?(R)a*(?1)|((?R))b)/S+ + aaaabcde +Error -27 (JIT stack limit reached) + +/-- Test various compile modes --/ + +/abcd/S++ + abcd + 0: abcd (JIT) + xyz +No match (JIT) + +/abcd/S+ + abcd + 0: abcd (JIT) + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab (JIT) + xyz +No match (JIT) + +/abcd/S++ + abcd + 0: abcd (JIT) + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab (JIT) + xyz +No match (JIT) + +/abcd/S++1 + abcd + 0: abcd (JIT) + ab\P +Partial match: ab + ab\P\P +Partial match: ab + xyz +No match (JIT) + xyz\P +No match + +/abcd/S++2 + abcd + 0: abcd + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab + xyz +No match + +/abcd/S++3 + abcd + 0: abcd (JIT) + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab + xyz +No match (JIT) + +/abcd/S++4 + abcd + 0: abcd + ab\P +Partial match: ab + ab\P\P +Partial match: ab (JIT) + xyz +No match + +/abcd/S++5 + abcd + 0: abcd (JIT) + ab\P +Partial match: ab + ab\P\P +Partial match: ab (JIT) + xyz +No match (JIT) + +/abcd/S++6 + abcd + 0: abcd + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab (JIT) + xyz +No match + +/abcd/S++7 + abcd + 0: abcd (JIT) + ab\P +Partial match: ab (JIT) + ab\P\P +Partial match: ab (JIT) + xyz +No match (JIT) + +/abcd/S++2I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'd' +Subject length lower bound = 4 +No set of starting bytes +JIT study was successful + +/(*NO_START_OPT)a(*:m)b/KS++ + a +No match, mark = m (JIT) + +/^12345678abcd/mS++ + 12345678abcd + 0: 12345678abcd (JIT) + +/-- End of testinput12 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput13 b/ext/pcre/pcrelib/testdata/testoutput13 new file mode 100644 index 000000000..9f73c5000 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput13 @@ -0,0 +1,22 @@ +/-- This test is run only when JIT support is not available. It checks that an +attempt to use it has the expected behaviour. It also tests things that +are different without JIT. --/ + +/abc/S+I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No set of starting bytes +JIT support is not available in this version of PCRE + +/a*/SI +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL + +/-- End of testinput13 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput14 b/ext/pcre/pcrelib/testdata/testoutput14 new file mode 100644 index 000000000..52680a8f9 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput14 @@ -0,0 +1,530 @@ +/-- This set of tests is run only with the 8-bit library. They do not require + UTF-8 or Unicode property support. The file starts with all the tests of + the POSIX interface, because that is supported only with the 8-bit library. + --/ + +< forbid 8W + +/abc/P + abc + 0: abc + *** Failers +No match: POSIX code 17: match failed + +/^abc|def/P + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/P + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 3: def + +/the quick brown fox/P + the quick brown fox + 0: the quick brown fox + *** Failers +No match: POSIX code 17: match failed + The Quick Brown Fox +No match: POSIX code 17: match failed + +/the quick brown fox/Pi + the quick brown fox + 0: the quick brown fox + The Quick Brown Fox + 0: The Quick Brown Fox + +/abc.def/P + *** Failers +No match: POSIX code 17: match failed + abc\ndef +No match: POSIX code 17: match failed + +/abc$/P + abc + 0: abc + abc\n + 0: abc + +/(abc)\2/P +Failed: POSIX code 15: bad back reference at offset 7 + +/(abc\1)/P + abc +No match: POSIX code 17: match failed + +/a*(b+)(z)(z)/P + aaaabbbbzzzz + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O0 + aaaabbbbzzzz\O1 + 0: aaaabbbbzz + aaaabbbbzzzz\O2 + 0: aaaabbbbzz + 1: bbbb + aaaabbbbzzzz\O3 + 0: aaaabbbbzz + 1: bbbb + 2: z + aaaabbbbzzzz\O4 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O5 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + +/ab.cd/P + ab-cd + 0: ab-cd + ab=cd + 0: ab=cd + ** Failers +No match: POSIX code 17: match failed + ab\ncd +No match: POSIX code 17: match failed + +/ab.cd/Ps + ab-cd + 0: ab-cd + ab=cd + 0: ab=cd + ab\ncd + 0: ab\x0acd + +/a(b)c/PN + abc +Matched with REG_NOSUB + +/a(?P<name>b)c/PN + abc +Matched with REG_NOSUB + +/a?|b?/P + abc + 0: a + ** Failers + 0: + ddd\N +No match: POSIX code 17: match failed + +/\w+A/P + CDAAAAB + 0: CDAAAA + +/\w+A/PU + CDAAAAB + 0: CDA + +/\Biss\B/I+P + Mississippi + 0: iss + 0+ issippi + +/abc/\P +Failed: POSIX code 9: bad escape sequence at offset 4 + +/-- End of POSIX tests --/ + +/a\Cb/ + aXb + 0: aXb + a\nb + 0: a\x0ab + ** Failers (too big char) +No match + A\x{123}B +** Character \x{123} is greater than 255 and UTF-8 mode is not enabled. +** Truncation will probably give the wrong result. +No match + A\o{443}B +** Character \x{123} is greater than 255 and UTF-8 mode is not enabled. +** Truncation will probably give the wrong result. +No match + +/\x{100}/I +Failed: character value in \x{} or \o{} is too large at offset 6 + +/\o{400}/I +Failed: character value in \x{} or \o{} is too large at offset 6 + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: extended +No first char +No need char +Subject length lower bound = 3 +Starting byte set: \x09 \x20 ! " # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 + 9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + +/-- Although this saved pattern was compiled with link-size=2, it does no harm +to run this test with other link sizes because it is going to generated a +"compiled in wrong mode" error as soon as it is loaded, so the link size does +not matter. --/ + +<!testsaved16 +Compiled pattern loaded from testsaved16 +No study data +Error -28 from pcre_fullinfo(0) +Running in 8-bit mode but pattern was compiled in 16-bit mode + +<!testsaved32 +Compiled pattern loaded from testsaved32 +No study data +Error -28 from pcre_fullinfo(0) +Running in 8-bit mode but pattern was compiled in 32-bit mode + +/\h/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xa0 + +/\H/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\v/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 + +/\V/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\R/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 + +/[\h]/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0] + Ket + End +------------------------------------------------------------------ + >\x09< + 0: \x09 + +/[\h]+/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0]++ + Ket + End +------------------------------------------------------------------ + >\x09\x20\xa0< + 0: \x09 \xa0 + +/[\v]/BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85] + Ket + End +------------------------------------------------------------------ + +/[\H]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] + Ket + End +------------------------------------------------------------------ + +/[^\h]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] (neg) + Ket + End +------------------------------------------------------------------ + +/[\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/[\x0a\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x0a\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/\777/I +Failed: octal value is greater than \377 in 8-bit non-UTF-8 mode at offset 3 + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K +Failed: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) at offset 259 + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE + +/\u0100/<JS> +Failed: character value in \u.... sequence is too large at offset 5 + +/[\u0100-\u0200]/<JS> +Failed: character value in \u.... sequence is too large at offset 6 + +/[^\x00-a]{12,}[^b-\xff]*/BZ +------------------------------------------------------------------ + Bra + [b-\xff] (neg){12,}+ + [\x00-a] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0e-\x1f!-\xff] (neg)*+ + \s* + + [0-9A-Z_a-z]++ + \W+ + + [\x00-/:-\xff] (neg)*+ + \d + 0 + [\x00-/:-@[-^`{-\xff] (neg){4,6}+ + \w* + A + Ket + End +------------------------------------------------------------------ + +/-- End of testinput14 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput15 b/ext/pcre/pcrelib/testdata/testoutput15 new file mode 100644 index 000000000..5792be72d --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput15 @@ -0,0 +1,1139 @@ +/-- This set of tests is for UTF-8 support but not Unicode property support, + and is relevant only to the 8-bit library. --/ + +< forbid W + +/X(\C{3})/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + +/X(\C{4})/8 + X\x{1234}YZ + 0: X\x{1234}Y + 1: \x{1234}Y + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234}YZ + X\x{1234}\x{512} + 0: X\x{1234}\x{512} + X\x{1234}\x{512}YZ + 0: X\x{1234}\x{512} + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234} + X\x{1234}\x{512} + 0: X\x{1234} + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{100}b + 0: a\x{100}b + +/ab\Cde/8 + abXde + 0: abXde + +/a\C\Cb/8 + a\x{100}b + 0: a\x{100}b + ** Failers +No match + a\x{12257}b +No match + +/[Ã]/8 +Failed: invalid UTF-8 string at offset 1 + +/Ã/8 +Failed: invalid UTF-8 string at offset 0 + +/ÃÃÃxxx/8 +Failed: invalid UTF-8 string at offset 0 + +/ÃÃÃxxx/8?DZSSO +------------------------------------------------------------------ + Bra + \X{c0}\X{c0}\X{c0}xxx + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: no_auto_possessify utf no_utf_check +First char = \x{c3} +Need char = 'x' + +/badutf/8 + \xdf +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xef +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xef\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xf7 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xf7\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xf7\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xfb +Error -10 (bad UTF-8 string) offset=0 reason=4 + \xfb\x80 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xfb\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xfb\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xfd +Error -10 (bad UTF-8 string) offset=0 reason=5 + \xfd\x80 +Error -10 (bad UTF-8 string) offset=0 reason=4 + \xfd\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xfd\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xfd\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xdf\x7f +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xef\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xef\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xf7\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xf7\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xf7\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfb\x7f\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xfb\x80\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xfb\x80\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfb\x80\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=9 + \xfd\x7f\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xfd\x80\x7f\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xfd\x80\x80\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfd\x80\x80\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=9 + \xfd\x80\x80\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=10 + \xed\xa0\x80 +Error -10 (bad UTF-8 string) offset=0 reason=14 + \xc0\x8f +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xe0\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=16 + \xf0\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=17 + \xf8\x80\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=18 + \xfc\x80\x80\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=19 + \x80 +Error -10 (bad UTF-8 string) offset=0 reason=20 + \xfe +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xff +Error -10 (bad UTF-8 string) offset=0 reason=21 + +/badutf/8 + \xfb\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xfd\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \xf7\xbf\xbf\xbf +Error -10 (bad UTF-8 string) offset=0 reason=13 + +/shortutf/8 + \P\P\xdf +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xef +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xef\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xf7 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xf7\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xf7\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xfb +Error -25 (short UTF-8 string) offset=0 reason=4 + \P\P\xfb\x80 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xfb\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xfb\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xfd +Error -25 (short UTF-8 string) offset=0 reason=5 + \P\P\xfd\x80 +Error -25 (short UTF-8 string) offset=0 reason=4 + \P\P\xfd\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xfd\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xfd\x80\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + +/anything/8 + \xc0\x80 +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xc1\x8f +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xe0\x9f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=16 + \xf0\x8f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=17 + \xf8\x87\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=18 + \xfc\x83\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=19 + \xfe\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xff\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xc3\x8f +No match + \xe0\xaf\x80 +No match + \xe1\x80\x80 +No match + \xf0\x9f\x80\x80 +No match + \xf1\x8f\x80\x80 +No match + \xf8\x88\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xf9\x87\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xfc\x84\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \xfd\x83\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \?\xf8\x88\x80\x80\x80 +No match + \?\xf9\x87\x80\x80\x80 +No match + \?\xfc\x84\x80\x80\x80\x80 +No match + \?\xfd\x83\x80\x80\x80\x80 +No match + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e1} +Need char = \x{80} + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f0} +Need char = \x{80} + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f4} +Need char = \x{80} + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f4} +Need char = \x{bf} + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{80} + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ed} +Need char = \x{b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e6} +Need char = \x{9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{80} + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{84} + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{84} + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e0} +Need char = \x{a1} + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f0} +Need char = \x{ab} + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{e1} + 2: \x{88}\x{b4} + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b +No match + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 + \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf + \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee + \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd + \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} +Subject length lower bound = 3 +No set of starting bytes + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xc4 + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xc4 + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xc4 + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xc4 + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{80} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{81} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{c4} +Need char = 'z' + +/a\x{1234}b/P8 + a\x{1234}b + 0: a\x{1234}b + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{c7} +Need char = \x{bf} + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 15 + +/-- This tests the stricter UTF-8 check according to RFC 3629. --/ + +/X/8 + \x{d800} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{da00}\? +No match + \x{dfff} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{dfff}\? +No match + \x{110000} +Error -10 (bad UTF-8 string) offset=0 reason=13 + \x{110000}\? +No match + \x{2000000} +Error -10 (bad UTF-8 string) offset=0 reason=11 + \x{2000000}\? +No match + \x{7fffffff} +Error -10 (bad UTF-8 string) offset=0 reason=12 + \x{7fffffff}\? +No match + +/(*UTF8)\x{1234}/ + abcd\x{1234}pqr + 0: \x{1234} + +/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xc2 \xe1 \xe2 \xe3 + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \xc2 \xe2 + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting byte set: \x09 \x20 A \xc2 \xe1 \xe2 \xe3 + CDBABC + 0: A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting byte set: \x0a \x0b \x0c \x0d \xc2 \xe2 + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting byte set: \x09 \x0a \x0c \x0d \x20 \xc2 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e + \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d + \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xc0 \xc1 \xc2 \xc3 + \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 + \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 + \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 + \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 +Error -11 (bad UTF-8 offset) + a\x{123}aa\>3 + 0: aa + a\x{123}aa\>4 + 0: a + a\x{123}aa\>5 +No match + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \xe1 + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \xe1 + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \xe1 + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 2 +Starting byte set: \xe1 + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{80} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \xc2 \xe2 + +/\777/8DZ +------------------------------------------------------------------ + Bra + \x{1ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c7} +Need char = \x{bf} + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/A/8 + \x{ff000041} +** Character \x{ff000041} is greater than 0x7fffffff and so cannot be converted to UTF-8 + \x{7f000041} +Error -10 (bad UTF-8 string) offset=0 reason=12 + +/(*UTF8)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +/-- End of testinput15 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput16 b/ext/pcre/pcrelib/testdata/testoutput16 new file mode 100644 index 000000000..1d5f31d92 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput16 @@ -0,0 +1,121 @@ +/-- This set of tests is run only with the 8-bit library when Unicode property + support is available. It starts with tests of the POSIX interface, because + that is supported only with the 8-bit library. --/ + +/\w/P + +++\x{c2} +No match: POSIX code 17: match failed + +/\w/WP + +++\x{c2} + 0: \xc2 + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ +------------------------------------------------------------------ + Bra + /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +No need char + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{b0} + +/AB\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{b0} + +/AB\x{1fb0}/8DZi +------------------------------------------------------------------ + Bra + /i AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = 'B' (caseless) + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 17 +Starting byte set: \xd0 \xd1 + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i \x{2c65} + Ket + End +------------------------------------------------------------------ + +/[^â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i [^\x{2c65}] + Ket + End +------------------------------------------------------------------ + +/\h/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xa0 + +/\v/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 + +/\R/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 + +/[[:blank:]]/WBZ +------------------------------------------------------------------ + Bra + [\x09 \xa0] + Ket + End +------------------------------------------------------------------ + +/-- End of testinput16 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput17 b/ext/pcre/pcrelib/testdata/testoutput17 new file mode 100644 index 000000000..9a469c51a --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput17 @@ -0,0 +1,558 @@ +/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 + or -32) features that are not compatible with the 8-bit library, or which + give different output in 16- or 32-bit mode. --/ + +< forbid 8W + +/a\Cb/ + aXb + 0: aXb + a\nb + 0: a\x0ab + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/\x{100}/I +Capturing subpattern count = 0 +No options +First char = \x{100} +No need char + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: extended +No first char +No need char +Subject length lower bound = 3 +Starting byte set: \x09 \x20 ! " # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 + 9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xff + +/[\h]/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + >\x09< + 0: \x09 + +/[\h]+/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]++ + Ket + End +------------------------------------------------------------------ + >\x09\x20\xa0< + 0: \x09 \xa0 + +/[\v]/BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}] + Ket + End +------------------------------------------------------------------ + +/[^\h]/BZ +------------------------------------------------------------------ + Bra + [^\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + +/\h+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xa0 \xff + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + 0: \x{200a}\xa0\x{2000} + +/[\h\x{dc00}]+/BZSI +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{dc00}]++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + 0: \x{200a}\xa0\x{2000} + +/\H+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + 0: \x9f\xa1\x{2fff}\x{3001} + +/[\H\x{d800}]+/ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + 0: \x9f\xa1\x{2fff}\x{3001} + +/\v+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/[\v\x{dc00}]+/BZSI +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}\x{dc00}]++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/\V+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + 0: \x09\x0e\x84\x86 + +/[\V\x{d800}]+/ + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + 0: \x09\x0e\x84\x86 + +/\R+/SI<bsr_unicode> +Capturing subpattern count = 0 +Options: bsr_unicode +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I +Capturing subpattern count = 0 +No options +First char = \x{d800} +Need char = \x{dd00} + \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + 0: \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ +------------------------------------------------------------------ + Bra + [^\x80] + [^\x{ff}] + [^\x{100}] + [^\x{1000}] + [^\x{ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi +------------------------------------------------------------------ + Bra + /i [^\x80] + /i [^\x{ff}] + /i [^\x{100}] + /i [^\x{1000}] + /i [^\x{ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ +------------------------------------------------------------------ + Bra + [^\x{100}]* + [^\x{1000}]+ + [^\x{ffff}]?? + [^\x{8000}]{4} + [^\x{8000}]* + [^\x{7fff}]{2} + [^\x{7fff}]{0,7}? + [^\x{100}]{5} + [^\x{100}]?+ + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi +------------------------------------------------------------------ + Bra + /i [^\x{100}]* + /i [^\x{1000}]+ + /i [^\x{ffff}]?? + /i [^\x{8000}]{4} + /i [^\x{8000}]* + /i [^\x{7fff}]{2} + /i [^\x{7fff}]{0,7}? + /i [^\x{100}]{5} + /i [^\x{100}]?+ + Ket + End +------------------------------------------------------------------ + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE + +/\u0100/<JS>BZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ + +/[\u0100-\u0200]/<JS>BZ +------------------------------------------------------------------ + Bra + [\x{100}-\x{200}] + Ket + End +------------------------------------------------------------------ + +/\ud800/<JS>BZ +------------------------------------------------------------------ + Bra + \x{d800} + Ket + End +------------------------------------------------------------------ + +/^\x{ffff}+/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + 0: \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + 0: \x{ffff} + +/[^\x00-a]{12,}[^b-\xff]*/BZ +------------------------------------------------------------------ + Bra + [b-\xff] (neg){12,} + [\x00-a] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0e-\x1f!-\xff] (neg)* + \s* + + [0-9A-Z_a-z]++ + \W+ + + [\x00-/:-\xff] (neg)*? + \d + 0 + [\x00-/:-@[-^`{-\xff] (neg){4,6}? + \w* + A + Ket + End +------------------------------------------------------------------ + +/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ +------------------------------------------------------------------ + Bra + a* + [b-\x{200}]?+ + a# + a*+ + [b-\x{200}]? + b# + [a-f]* + [g-\x{200}]*+ + # + [g-\x{200}]* + [a-c]*+ + # + [g-\x{200}]* + [a-h]*+ + Ket + End +------------------------------------------------------------------ + +/^[\x{1234}\x{4321}]{2,4}?/ + \x{1234}\x{1234}\x{1234} + 0: \x{1234}\x{1234} + +/-- End of testinput17 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput18-16 b/ext/pcre/pcrelib/testdata/testoutput18-16 new file mode 100644 index 000000000..1ca9ee740 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput18-16 @@ -0,0 +1,1026 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS +**Failed: invalid UTF-8 string cannot be converted to UTF-16 + +/abc/8 + Ã] +**Failed: invalid UTF-8 string cannot be used as input in UTF mode + +/X(\C{3})/8 + X\x{11234}Y + 0: X\x{11234}Y + 1: \x{11234}Y + X\x{11234}YZ + 0: X\x{11234}Y + 1: \x{11234}Y + +/X(\C{4})/8 + X\x{11234}YZ + 0: X\x{11234}YZ + 1: \x{11234}YZ + X\x{11234}YZW + 0: X\x{11234}YZ + 1: \x{11234}YZ + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{11234}Y + 0: X\x{11234}Y + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512} + 0: X\x{11234}\x{512} + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + 0: X\x{11234}\x{512}\x{11234} + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{11234}Y + 0: X\x{11234}Y + X\x{11234}YZ + 0: X\x{11234}Y + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512} + *** Failers +No match + X\x{11234} +No match + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{12257}b + 0: a\x{12257}b + a\x{12257}\x{11234}b +No match + ** Failers +No match + a\x{100}b +No match + +/ab\Cde/8 + abXde + 0: abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ffff} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d800} +Need char = \x{dc00} + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{1000} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d800} +Need char = \x{dc00} + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{dbc0} +Need char = \x{dc00} + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{dbff} +Need char = \x{dfff} + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{84} +No need char + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{104} +No need char + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{861} +No need char + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d844} +Need char = \x{deab} + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + 2: + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b + 0: a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e + \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d + \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac + \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb + \xbc \xbd \xbe \xbf \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{100} +Subject length lower bound = 3 +No set of starting bytes + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xff + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xff + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xff + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xff + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{100} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{101} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{100} +Need char = 'z' + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{1ff} +No need char + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{200} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 13 + +/X/8 + \x{d800} +Error -10 (bad UTF-16 string) offset=0 reason=1 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-16 string) offset=0 reason=1 + \x{da00}\? +No match + \x{dc00} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{dc00}\? +No match + \x{de00} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{de00}\? +No match + \x{dfff} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{dfff}\? +No match + \x{110000} +** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16 + \x{d800}\x{1234} +Error -10 (bad UTF-16 string) offset=1 reason=2 + +/(*UTF16)\x{11234}/ + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF)\x{11234}/I +Capturing subpattern count = 0 +Options: utf +First char = \x{d804} +Need char = \x{de34} + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF-32)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I +Failed: (*VERB) not recognized or malformed at offset 12 + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xa0 \xff + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting byte set: \x09 \x20 A \xa0 \xff + CDBABC + 0: A + \x{2000}ABC + 0: \x{2000}A + +/\R*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d A \x85 \xff + CDBABC + 0: A + \x{2028}A + 0: \x{2028}A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting byte set: \x09 \x0a \x0c \x0d \x20 \x85 \xa0 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e + \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d + \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 + \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 + \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 + \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 + \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 + \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 + \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf + \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee + \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd + \xfe \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 + 0: aa + a\x{123}aa\>3 + 0: a + a\x{123}aa\>4 +No match + a\x{123}aa\>5 +Error -24 (bad offset value) + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +Need char = \x{1234} +Subject length lower bound = 2 +No set of starting bytes + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{200} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 +Error -11 (bad UTF-16 offset) + \x{10000}ab\>1 +Error -11 (bad UTF-16 offset) + \x{10000}ab\>2 + 0: a + \x{10000}ab\>3 +No match + \x{10000}ab\>4 +No match + \x{10000}ab\>5 +Error -24 (bad offset value) + +/í¼€/8 +Failed: invalid UTF-16 string at offset 0 + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/(*UTF)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +/-- End of testinput18 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput18-32 b/ext/pcre/pcrelib/testdata/testoutput18-32 new file mode 100644 index 000000000..89be3a4b0 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput18-32 @@ -0,0 +1,1023 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS +**Failed: invalid UTF-8 string cannot be converted to UTF-32 + +/abc/8 + Ã] +**Failed: invalid UTF-8 string cannot be used as input in UTF mode + +/X(\C{3})/8 + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + 1: \x{11234}YZ + +/X(\C{4})/8 + X\x{11234}YZ +No match + X\x{11234}YZW + 0: X\x{11234}YZW + 1: \x{11234}YZW + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512} +No match + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + 0: X\x{11234}\x{512}\x{11234}Z + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}Y + *** Failers +No match + X\x{11234} +No match + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{12257}b +No match + a\x{12257}\x{11234}b + 0: a\x{12257}\x{11234}b + ** Failers +No match + a\x{100}b +No match + +/ab\Cde/8 + abXde + 0: abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ffff} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10000} +No need char + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{1000} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10000} +No need char + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100000} +No need char + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10ffff} +No need char + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{84} +No need char + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{104} +No need char + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{861} +No need char + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{212ab} +No need char + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + 2: + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b + 0: a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e + \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d + \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac + \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb + \xbc \xbd \xbe \xbf \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{100} +Subject length lower bound = 3 +No set of starting bytes + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xff + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xff + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: a x \xff + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: x \xff + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{100} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{101} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{100} +Need char = 'z' + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{1ff} +No need char + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{200} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 13 + +/X/8 + \x{d800} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{da00}\? +No match + \x{dc00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{dc00}\? +No match + \x{de00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{de00}\? +No match + \x{dfff} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{dfff}\? +No match + \x{110000} +Error -10 (bad UTF-32 string) offset=0 reason=3 + \x{d800}\x{1234} +Error -10 (bad UTF-32 string) offset=0 reason=1 + +/(*UTF16)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*UTF)\x{11234}/I +Capturing subpattern count = 0 +Options: utf +First char = \x{11234} +No need char + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF-32)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I +Failed: (*VERB) not recognized or malformed at offset 12 + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x09 \x20 \xa0 \xff + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting byte set: \x09 \x20 A \xa0 \xff + CDBABC + 0: A + \x{2000}ABC + 0: \x{2000}A + +/\R*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d A \x85 \xff + CDBABC + 0: A + \x{2028}A + 0: \x{2028}A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting byte set: \x09 \x0a \x0c \x0d \x20 \x85 \xa0 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e + \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d + \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 + \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 + \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 + \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 + \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 + \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 + \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf + \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee + \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd + \xfe \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 + 0: aa + a\x{123}aa\>3 + 0: a + a\x{123}aa\>4 +No match + a\x{123}aa\>5 +Error -24 (bad offset value) + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No set of starting bytes + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +Need char = \x{1234} +Subject length lower bound = 2 +No set of starting bytes + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{200} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting byte set: \x0a \x0b \x0c \x0d \x85 \xff + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 +No match + \x{10000}ab\>1 + 0: a + \x{10000}ab\>2 +No match + \x{10000}ab\>3 +No match + \x{10000}ab\>4 +Error -24 (bad offset value) + \x{10000}ab\>5 +Error -24 (bad offset value) + +/í¼€/8 +**Failed: character value is ill-formed UTF-32 + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/(*UTF)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +/-- End of testinput18 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput19 b/ext/pcre/pcrelib/testdata/testoutput19 new file mode 100644 index 000000000..ccc198cc1 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput19 @@ -0,0 +1,88 @@ +/-- This set of tests is for Unicode property support, relevant only to the + 16- and 32-bit library. --/ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ +------------------------------------------------------------------ + Bra + /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = \x{1fb0} (caseless) + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{1fb0} + +/AB\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{1fb0} + +/AB\x{1fb0}/8DZi +------------------------------------------------------------------ + Bra + /i AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = \x{1fb0} (caseless) + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{401} (caseless) +Need char = \x{42f} (caseless) +Subject length lower bound = 17 +No set of starting bytes + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i \x{2c65} + Ket + End +------------------------------------------------------------------ + +/[^â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i [^\x{2c65}] + Ket + End +------------------------------------------------------------------ + +/[[:blank:]]/WBZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + +/-- End of testinput19 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput2 b/ext/pcre/pcrelib/testdata/testoutput2 index e9cddf80d..844497abc 100644 --- a/ext/pcre/pcrelib/testdata/testoutput2 +++ b/ext/pcre/pcrelib/testdata/testoutput2 @@ -7,9 +7,12 @@ NOTE: This is a non-UTF set of tests. When UTF support is needed, use test 5, and if Unicode Property Support is needed, use test 7. --/ + +< forbid 8W /(a)b|/I Capturing subpattern count = 1 +May match empty string No options No first char No need char @@ -228,7 +231,7 @@ No options No first char No need char Subject length lower bound = 1 -Starting byte set: \x09 \x0a \x0c \x0d \x20 a b +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 a b /(ab\2)/ Failed: reference to non-existent subpattern at offset 6 @@ -448,10 +451,10 @@ Need char = '=' /(?<!bar|cattle)foo/I Capturing subpattern count = 0 +Max lookbehind = 6 No options First char = 'f' Need char = 'o' -Max lookbehind = 6 foo 0: foo catfoo @@ -498,6 +501,7 @@ No need char /(?s).*/I Capturing subpattern count = 0 +May match empty string Options: anchored dotall No first char No need char @@ -545,10 +549,10 @@ Failed: conditional group contains more than two branches at offset 13 Failed: conditional group contains more than two branches at offset 12 /(?(1a)/ -Failed: missing ) at offset 6 +Failed: malformed number or name after (?( at offset 4 /(?(1a))/ -Failed: reference to non-existent subpattern at offset 6 +Failed: malformed number or name after (?( at offset 4 /(?(?i))/ Failed: assertion expected after (?( at offset 3 @@ -631,6 +635,7 @@ No match /\Aabc/Im Capturing subpattern count = 0 +Max lookbehind = 1 Options: anchored multiline No first char No need char @@ -656,19 +661,19 @@ No need char /(?<=foo)[ab]/IS Capturing subpattern count = 0 +Max lookbehind = 3 No options No first char No need char -Max lookbehind = 3 Subject length lower bound = 1 Starting byte set: a b /(?<!foo)(alpha|omega)/IS Capturing subpattern count = 1 +Max lookbehind = 3 No options No first char Need char = 'a' -Max lookbehind = 3 Subject length lower bound = 5 Starting byte set: a o @@ -682,11 +687,11 @@ Starting byte set: a b /(?<=foo\n)^bar/Im Capturing subpattern count = 0 +Max lookbehind = 4 Contains explicit CR or LF match Options: multiline No first char Need char = 'r' -Max lookbehind = 4 foo\nbarbar 0: bar ***Failers @@ -700,11 +705,11 @@ No match /^(?<=foo\n)bar/Im Capturing subpattern count = 0 +Max lookbehind = 4 Contains explicit CR or LF match Options: multiline First char at start or follows newline Need char = 'r' -Max lookbehind = 4 foo\nbarbar 0: bar ***Failers @@ -743,10 +748,10 @@ Failed: lookbehind assertion is not fixed length at offset 13 /(?<=bullock|donkey)-cart/I Capturing subpattern count = 0 +Max lookbehind = 7 No options First char = '-' Need char = 't' -Max lookbehind = 7 the bullock-cart 0: -cart a donkey-cart race @@ -760,17 +765,19 @@ No match /(?<=ab(?i)x|y|z)/I Capturing subpattern count = 0 +Max lookbehind = 3 +May match empty string No options No first char No need char -Max lookbehind = 3 /(?>.*)(?<=(abcd)|(xyz))/I Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string No options No first char No need char -Max lookbehind = 4 alphabetabcd 0: alphabetabcd 1: abcd @@ -781,10 +788,10 @@ Max lookbehind = 4 /(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I Capturing subpattern count = 0 +Max lookbehind = 4 No options First char = 'Z' Need char = 'Z' -Max lookbehind = 4 abxyZZ 0: ZZ abXyZZ @@ -810,10 +817,10 @@ No match /(?<!(foo)a)bar/I Capturing subpattern count = 1 +Max lookbehind = 4 No options First char = 'b' Need char = 'r' -Max lookbehind = 4 bar 0: bar foobbar @@ -823,22 +830,6 @@ No match fooabar No match -/This one is here because Perl 5.005_02 doesn't fail it/I -Capturing subpattern count = 0 -No options -First char = 'T' -Need char = 't' - -/^(a)?(?(1)a|b)+$/I -Capturing subpattern count = 1 -Options: anchored -No first char -No need char - *** Failers -No match - a -No match - /This one is here because Perl behaves differently; see also the following/I Capturing subpattern count = 0 No options @@ -1212,10 +1203,10 @@ No need char /\Biss\B/I+ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 'i' Need char = 's' -Max lookbehind = 1 Mississippi 0: iss 0+ issippi @@ -1233,20 +1224,20 @@ Need char = 's' /\Biss\B/IG+ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 'i' Need char = 's' -Max lookbehind = 1 Mississippi 0: iss 0+ issippi /\Biss\B/Ig+ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 'i' Need char = 's' -Max lookbehind = 1 Mississippi 0: iss 0+ issippi @@ -1259,10 +1250,10 @@ No match /(?<=[Ms])iss/Ig+ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 'i' Need char = 's' -Max lookbehind = 1 Mississippi 0: iss 0+ issippi @@ -1271,10 +1262,10 @@ Max lookbehind = 1 /(?<=[Ms])iss/IG+ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 'i' Need char = 's' -Max lookbehind = 1 Mississippi 0: iss 0+ issippi @@ -1392,6 +1383,7 @@ Need char = 'c' /a*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -1410,6 +1402,7 @@ Need char = 'a' /a{0,3}/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -1452,10 +1445,10 @@ Need char = 'r' /...(?<=abc)/I Capturing subpattern count = 0 +Max lookbehind = 3 No options No first char No need char -Max lookbehind = 3 /abc(?!pqr)/I Capturing subpattern count = 0 @@ -1609,6 +1602,7 @@ Need char = 'e' /a?b?/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -1627,6 +1621,7 @@ No match /|-/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -2640,6 +2635,7 @@ Need char = '-' End ------------------------------------------------------------------ Capturing subpattern count = 0 +May match empty string Options: extended No first char No need char @@ -2659,7 +2655,7 @@ No need char /[\s]/DZ ------------------------------------------------------------------ Bra - [\x09\x0a\x0c\x0d ] + [\x09-\x0d ] Ket End ------------------------------------------------------------------ @@ -2671,7 +2667,7 @@ No need char /[\S]/DZ ------------------------------------------------------------------ Bra - [\x00-\x08\x0b\x0e-\x1f!-\xff] (neg) + [\x00-\x08\x0e-\x1f!-\xff] (neg) Ket End ------------------------------------------------------------------ @@ -2782,6 +2778,7 @@ Need char = '0' End ------------------------------------------------------------------ Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -2881,6 +2878,7 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -2897,20 +2895,41 @@ No options First char = 'x' No need char -/x{1,3}+/DZ +/x{1,3}+/BZO ------------------------------------------------------------------ Bra - Once x - x{0,2} + x{0,2}+ Ket + End +------------------------------------------------------------------ + +/x{1,3}+/BZOi +------------------------------------------------------------------ + Bra + /i x + /i x{0,2}+ + Ket + End +------------------------------------------------------------------ + +/[^x]{1,3}+/BZO +------------------------------------------------------------------ + Bra + [^x] + [^x]{0,2}+ + Ket + End +------------------------------------------------------------------ + +/[^x]{1,3}+/BZOi +------------------------------------------------------------------ + Bra + /i [^x] + /i [^x]{0,2}+ Ket End ------------------------------------------------------------------ -Capturing subpattern count = 0 -No options -First char = 'x' -No need char /(x)*+/DZ ------------------------------------------------------------------ @@ -2923,12 +2942,14 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 1 +May match empty string No options No first char No need char /^(\w++|\s++)*$/I Capturing subpattern count = 1 +May match empty string Options: anchored No first char No need char @@ -3090,7 +3111,7 @@ Need char = 'b' [bc]+ Ket CBra 5 - \w* + \w*+ Ket Ket Ket @@ -3169,7 +3190,7 @@ Failed: missing terminating ] for character class at offset 10 /[\s]/IDZ ------------------------------------------------------------------ Bra - [\x09\x0a\x0c\x0d ] + [\x09-\x0d ] Ket End ------------------------------------------------------------------ @@ -3233,10 +3254,10 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = '8' Need char = 'X' -Max lookbehind = 1 |\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ ------------------------------------------------------------------ @@ -3247,10 +3268,10 @@ Max lookbehind = 1 End ------------------------------------------------------------------ Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = '$' Need char = 'X' -Max lookbehind = 1 /(.*)\d+\1/I Capturing subpattern count = 1 @@ -3304,6 +3325,7 @@ Need char = 'b' /(?=a).*/I Capturing subpattern count = 0 +May match empty string No options First char = 'a' No need char @@ -3322,6 +3344,7 @@ Need char = 'z' (caseless) /(?=a)(?=b)/I Capturing subpattern count = 0 +May match empty string No options First char = 'a' No need char @@ -3388,6 +3411,7 @@ Need char = 'a' /(a)*/I Capturing subpattern count = 1 +May match empty string No options No first char No need char @@ -3616,6 +3640,7 @@ No match /(?C0)(abc(?C1))*/I Capturing subpattern count = 1 +May match empty string No options No first char No need char @@ -3649,6 +3674,7 @@ No need char /(\d{3}(?C))*/I Capturing subpattern count = 1 +May match empty string No options No first char No need char @@ -3763,10 +3789,10 @@ Callout 2: last capture = -1 /(?<=(abc)(?C))xyz/I Capturing subpattern count = 1 +Max lookbehind = 3 No options First char = 'x' Need char = 'z' -Max lookbehind = 3 abcxyz\C+ Callout 0: last capture = 1 0: <unset> @@ -3785,20 +3811,6 @@ Need char = 'b' --->abbbbbccc 1 ^ ^ Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 - 1 ^ ^ -Callout data = 1 No match /a(b+?)(c*?)(?C1)/I @@ -3895,6 +3907,7 @@ Failed: recursive call could loop indefinitely at offset 16 /^([^()]|\((?1)*\))*$/I Capturing subpattern count = 1 +May match empty string Options: anchored No first char No need char @@ -4174,6 +4187,7 @@ Named capturing subpatterns: one 1 three 3 two 2 +May match empty string Options: anchored caseless No first char No need char @@ -4273,6 +4287,7 @@ Need char = 'z' /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is Capturing subpattern count = 31 +May match empty string Options: anchored dotall No first char No need char @@ -4280,6 +4295,7 @@ No need char /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is Capturing subpattern count = 31 Max back reference = 31 +May match empty string Options: dotall No first char No need char @@ -4287,6 +4303,7 @@ No need char /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is Capturing subpattern count = 32 Max back reference = 32 +May match empty string Options: dotall No first char No need char @@ -4363,7 +4380,7 @@ Minimum match() recursion limit = 6 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaz\M Minimum match() limit = 32768 -Minimum match() recursion limit = 42 +Minimum match() recursion limit = 29 No match /(aaa(?C1)bbb|ab)/I @@ -4438,6 +4455,7 @@ Capturing subpattern count = 2 Named capturing subpatterns: Tes 1 Test 2 +May match empty string No options No first char No need char @@ -4456,6 +4474,7 @@ Capturing subpattern count = 2 Named capturing subpatterns: Tes 2 Test 1 +May match empty string No options No first char No need char @@ -4533,6 +4552,7 @@ Need char = ']' End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string No options No first char No need char @@ -4553,6 +4573,7 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string No options No first char No need char @@ -4584,6 +4605,7 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string No options No first char No need char @@ -4591,9 +4613,7 @@ No need char /[ab]{1}+/DZ ------------------------------------------------------------------ Bra - Once - [ab]{1,1} - Ket + [ab]{1,1}+ Ket End ------------------------------------------------------------------ @@ -5305,7 +5325,7 @@ No match Callout 255 0 21 CBra 1 Callout 255 1 9 - [ab]{1,4} + [ab]{1,4}+ Callout 255 10 1 c Callout 255 11 0 @@ -5318,7 +5338,7 @@ No match Ket CBra 1 Callout 255 1 9 - [ab]{1,4} + [ab]{1,4}+ Callout 255 10 1 c Callout 255 11 0 @@ -5331,7 +5351,7 @@ No match Ket CBra 1 Callout 255 1 9 - [ab]{1,4} + [ab]{1,4}+ Callout 255 10 1 c Callout 255 11 0 @@ -5344,7 +5364,7 @@ No match Ket CBra 1 Callout 255 1 9 - [ab]{1,4} + [ab]{1,4}+ Callout 255 10 1 c Callout 255 11 0 @@ -5358,7 +5378,7 @@ No match Braminzero CBra 1 Callout 255 1 9 - [ab]{1,4} + [ab]{1,4}+ Callout 255 10 1 c Callout 255 11 0 @@ -5411,24 +5431,27 @@ Need char = '3' /\b.*/I Capturing subpattern count = 0 +Max lookbehind = 1 +May match empty string No options No first char No need char -Max lookbehind = 1 ab cd\>1 0: cd /\b.*/Is Capturing subpattern count = 0 +Max lookbehind = 1 +May match empty string Options: dotall No first char No need char -Max lookbehind = 1 ab cd\>1 0: cd /(?!.bcd).*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6017,6 +6040,7 @@ Matched, but too many substrings /[^()]*(?:\((?R)\)[^()]*)*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6029,6 +6053,7 @@ No need char /[^()]*(?:\((?>(?R))\)[^()]*)*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6039,6 +6064,7 @@ No need char /[^()]*(?:\((?R)\))*[^()]*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6049,6 +6075,7 @@ No need char /(?:\((?R)\))*[^()]*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6061,6 +6088,7 @@ No need char /(?:\((?R)\))|[^()]*/I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -6110,6 +6138,17 @@ no parentheses with name "Z" 2: a1 copy substring Z failed -7 C a1 (2) A + +/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + a 1 + a 3 + b 2 +May match empty string +Options: dupnames +No first char +No need char /^(?P<A>a)(?P<A>b)/IJ Capturing subpattern count = 2 @@ -6320,7 +6359,7 @@ Need char = 'X' 1: X /(?:(?(2y)a|b)(X))+/I -Failed: reference to non-existent subpattern at offset 9 +Failed: malformed number or name after (?( at offset 7 /(?:(?(ZA)a|b)(?P<ZZ>X))+/I Failed: reference to non-existent subpattern at offset 9 @@ -6392,9 +6431,9 @@ No options No first char Need char = ',' Subject length lower bound = 1 -Starting byte set: \x09 \x0a \x0c \x0d \x20 , +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 , \x0b,\x0b - 0: , + 0: \x0b,\x0b \x0c,\x0d 0: \x0c,\x0d @@ -6503,7 +6542,7 @@ No match No match /^abc/Im<bad> -Unknown newline type at: <bad> +Unknown modifier at: <bad> /abc/I @@ -6512,12 +6551,13 @@ No options First char = 'a' Need char = 'c' xyz\rabc\<bad> -Unknown newline type at: <bad> +Unknown escape sequence at: <bad> abc 0: abc /.*/I<lf> Capturing subpattern count = 0 +May match empty string Options: Forced newline sequence: LF First char at start or follows newline @@ -6559,6 +6599,7 @@ Need char = 'f' +((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I Capturing subpattern count = 1 +May match empty string No options No first char No need char @@ -7482,7 +7523,7 @@ Matched, but too many substrings /a*[^a]/BZ ------------------------------------------------------------------ Bra - a* + a*+ [^a] Ket End @@ -7624,7 +7665,7 @@ No match ------------------------------------------------------------------ Bra ^ - [a-z]+ + [a-z]++ Ket End ------------------------------------------------------------------ @@ -7665,7 +7706,7 @@ No match ^ CBra 1 Cond - 2 Cond nref + 2 Cond ref y Ket [()] @@ -7725,6 +7766,7 @@ Named capturing subpatterns: one 1 three 3 two 2 +May match empty string Options: anchored caseless No first char No need char @@ -7824,15 +7866,9 @@ Failed: reference to non-existent subpattern at offset 7 1: abcabc1Xabc2XabcX 2: abcabc1Xabc2XabcX -/(?<A> (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x +/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x Failed: reference to non-existent subpattern at offset 29 -/(?<1> (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x - abcabc1Xabc2XabcXabcabc - 0: abcabc1Xabc2XabcX - 1: abcabc1Xabc2XabcX - 2: abcabc1Xabc2XabcX - /^(?(DEFINE) abc | xyz ) /x Failed: DEFINE group contains more than one branch at offset 22 @@ -8056,7 +8092,7 @@ Failed: a numbered reference must not be zero at offset 8 /^(a)\g{3/ Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8 -/^(a)\g{4a}/ +/^(a)\g{aa}/ Failed: reference to non-existent subpattern at offset 9 /^a.b/<lf> @@ -8561,7 +8597,7 @@ No match \d \v++ \w - \v+ + \v++ \S \v++ \V @@ -8659,27 +8695,18 @@ No match +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) - +4 ^ ^ c+ - +2 ^ ^ b? - +4 ^ ^ c+ - +2 ^^ b? - +4 ^^ c+ +0 ^ a+ +2 ^ ^ b? +4 ^ ^ c+ +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) - +4 ^ ^ c+ - +2 ^^ b? - +4 ^^ c+ +0 ^ a+ +2 ^^ b? +4 ^ ^ c+ +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) +6 ^ ^ (*FAIL) - +4 ^^ c+ No match /a+b?(*PRUNE)c+(*FAIL)/C @@ -8803,7 +8830,7 @@ No match 1: \x0a /a(*CR)b/ -Failed: (*VERB) not recognized at offset 5 +Failed: (*VERB) not recognized or malformed at offset 5 /(*CR)a.b/ a\nb @@ -9248,8 +9275,28 @@ No match ab No match -/a(?!)+b/ -Failed: nothing to repeat at offset 5 +/a(?!)b/BZ +------------------------------------------------------------------ + Bra + a + *FAIL + b + Ket + End +------------------------------------------------------------------ + +/(?!)?a/BZ +------------------------------------------------------------------ + Bra + Brazero + Assert not + Ket + a + Ket + End +------------------------------------------------------------------ + ab + 0: a /a(*FAIL)+b/ Failed: nothing to repeat at offset 8 @@ -9264,6 +9311,7 @@ Starting byte set: x y z /(?(?=.*b)b|^)/CI Capturing subpattern count = 0 +May match empty string Options: No first char No need char @@ -9276,6 +9324,7 @@ No need char +7 ^ ^ b +7 ^^ b +7 ^ b ++11 ^ ^ +12 ^ ) +13 ^ 0: @@ -9367,7 +9416,7 @@ No match No match /(*NO_START_OPT)xyz/C - abcxyz + abcxyz --->abcxyz +15 ^ x +15 ^ x @@ -9377,6 +9426,15 @@ No match +17 ^ ^ z +18 ^ ^ 0: xyz + +/(*NO_AUTO_POSSESS)a+b/BZ +------------------------------------------------------------------ + Bra + a+ + b + Ket + End +------------------------------------------------------------------ /xyz/CY abcxyz @@ -9406,12 +9464,14 @@ No match +3 ^ ^ (?(?=[a])[^"]) +5 ^ ^ (?=[a]) +8 ^ ^ [a] ++17 ^ ^ | +21 ^ ^ " +18 ^ ^ b +19 ^ ^ ) +3 ^ ^ (?(?=[a])[^"]) +5 ^ ^ (?=[a]) +8 ^ ^ [a] ++17 ^ ^ | +21 ^ ^ " +22 ^ ^ $ +23 ^ ^ @@ -9719,17 +9779,17 @@ Partial match: abc12 xyzabc123pqr 0: 123 xyzabc12\P -Partial match: abc12 +Partial match at offset 6: abc12 xyzabc12\P\P -Partial match: abc12 +Partial match at offset 6: abc12 /\babc\b/ +++abc+++ 0: abc +++ab\P -Partial match: +ab +Partial match at offset 3: +ab +++ab\P\P -Partial match: +ab +Partial match at offset 3: +ab /(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/BZ ------------------------------------------------------------------ @@ -10172,7 +10232,6 @@ No set of starting bytes Capturing subpattern count = 1 Named capturing subpatterns: a 1 - a 1 No options No first char No need char @@ -10245,7 +10304,7 @@ No match Ket Ket Cond - 4 Cond nref + Cond ref <D>2 X Alt Y @@ -10291,7 +10350,7 @@ No match CBra 4 d Cond - Cond nrecurse 1 + Cond recurse <A>2 $ Alt Recurse @@ -10353,7 +10412,7 @@ Partial match: abca xxxxabcde\P\P Partial match: abcde -/-- This is not in the Perl >= 5.10 test because Perl seems currently to be +/-- This is not in the Perl-compatible test because Perl seems currently to be broken and not behaving as specified in that it *does* bumpalong after hitting (*COMMIT). --/ @@ -10549,34 +10608,14 @@ No match End ------------------------------------------------------------------ -/ -- The first four of these are not in the Perl >= 5.10 test because Perl - documents that the use of \K in assertions is "not well defined". The - last is here because Perl gives the match as "b" rather than "ab". I +/ -- This one is here because Perl gives the match as "b" rather than "ab". I believe this to be a Perl bug. --/ -/(?=a\Kb)ab/ - ab - 0: b - -/(?!a\Kb)ac/ - ac - 0: ac - -/^abc(?<=b\Kc)d/ - abcd - 0: cd - -/^abc(?<!b\Kq)d/ - abcd - 0: abcd - /(?>a\Kb)z|(ab)/ ab 0: ab 1: ab -/----------------------/ - /(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/ Failed: recursive call could loop indefinitely at offset 31 @@ -10596,7 +10635,7 @@ Failed: an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) at offse ACABX No match -/--- These should be different, but in Perl 5.11 are not, which I think +/--- These should be different, but in Perl they are not, which I think is a bug in Perl. ---/ /A(*THEN)B|A(*THEN)C/K @@ -10607,13 +10646,6 @@ No match AC No match -/--- This should fail; the SKIP advances by one, but when we get to AC, the - PRUNE kills it. Perl behaves differently. ---/ - -/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK - AAAC -No match, mark = A - /--- Mark names can be duplicated. Perl doesn't give a mark for this one, though PCRE does. ---/ @@ -10647,7 +10679,7 @@ No match abcccd No match -/--- Perl 5.11 gets some of these wrong ---/ +/--- Perl gets some of these wrong ---/ /(?>.(*ACCEPT))*?5/ abcde @@ -10826,21 +10858,9 @@ No match X\x0d\x0a No match -/-- Perl treats this one differently, not failing the second string. I believe - that is a bug in Perl. --/ - -/^((abc|abcx)(*THEN)y|abcd)/ - abcd - 0: abcd - 1: abcd - *** Failers -No match - abcxy -No match - /(?<=abc)def/ abc\P\P -Partial match: abc +Partial match at offset 3: abc /abc$/ abc @@ -11087,12 +11107,14 @@ No need char /(^ab|^)+/I Capturing subpattern count = 1 +May match empty string Options: anchored No first char No need char /(^ab|^)++/I Capturing subpattern count = 1 +May match empty string Options: anchored No first char No need char @@ -11111,12 +11133,14 @@ No need char /(?:^ab|^)+/I Capturing subpattern count = 0 +May match empty string Options: anchored No first char No need char /(?:^ab|^)++/I Capturing subpattern count = 0 +May match empty string Options: anchored No first char No need char @@ -11135,12 +11159,14 @@ Need char = 'b' /(.*ab|.*)+/I Capturing subpattern count = 1 +May match empty string No options First char at start or follows newline No need char /(.*ab|.*)++/I Capturing subpattern count = 1 +May match empty string No options First char at start or follows newline No need char @@ -11159,12 +11185,14 @@ Need char = 'b' /(?:.*ab|.*)+/I Capturing subpattern count = 0 +May match empty string No options First char at start or follows newline No need char /(?:.*ab|.*)++/I Capturing subpattern count = 0 +May match empty string No options First char at start or follows newline No need char @@ -11319,7 +11347,6 @@ No match /(a)b|ac/++SS ac\O3 -Matched, but too many substrings 0: ac 0+ @@ -11571,7 +11598,7 @@ Matched, but too many substrings Assert not a Ket - \w+ + \w++ Ket End ------------------------------------------------------------------ @@ -11679,28 +11706,30 @@ No match /\btype\b\W*?\btext\b\W*?\bjavascript\b/IS Capturing subpattern count = 0 +Max lookbehind = 1 No options First char = 't' Need char = 't' -Max lookbehind = 1 Subject length lower bound = 18 No set of starting bytes /\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/IS Capturing subpattern count = 0 +Max lookbehind = 1 No options No first char No need char -Max lookbehind = 1 Subject length lower bound = 8 Starting byte set: < o t u -/a(*SKIP)c|b(*ACCEPT)|/+SI +/a(*SKIP)c|b(*ACCEPT)|/+S!I Capturing subpattern count = 0 +May match empty string No options No first char No need char -Study returned NULL +Subject length lower bound = -1 +No set of starting bytes a 0: 0+ @@ -11761,75 +11790,16 @@ Minimum match() limit = 86 Minimum match() recursion limit = 45 0: abbbbbbbbbbbbbbbbbbbbba -/-- These tests are in agreement with development Perl 5.015, which has fixed - some things, but they don't all work with 5.012, so they aren't in the - Perl-compatible tests. Those after the first come from Perl's own test - files. --/ - -/^((yes|no)(*THEN)(*F))?/ - yes -No match - -/(A (.*) C? (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz -No match - -/(A (.*) C? (*THEN) | A D) z/x -AbcdCBefgBhiBqz -No match - -/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x -AbcdCBefgBhiBqz -No match - -/(A (.*) C? (*THEN) | A D) \s* z/x -AbcdCBefgBhiBqz -No match - -/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz -No match - -/(A (.*) (?:C|) (*THEN) | A D) z/x -AbcdCBefgBhiBqz -No match - -/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz -No match - -/(A (.*) C{0,6} (*THEN) | A D) z/x -AbcdCBefgBhiBqz -No match - -/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x -AbcdCEBefgBhiBqz -No match - -/(A (.*) (CE){0,6} (*THEN) | A D) z/x -AbcdCEBefgBhiBqz -No match - -/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x -AbcdCBefgBhiBqz -No match - -/(A (.*) (CE*){0,6} (*THEN) | A D) z/x -AbcdCBefgBhiBqz -No match - -/-----------------------------------------------/ - /^(?>a+)(?>(z+))\w/BZ ------------------------------------------------------------------ Bra ^ Once_NC - a+ + a++ Ket Once CBra 1 - z+ + z++ Ket Ket \w @@ -11888,14 +11858,14 @@ No match /^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/ \Maabbccddee -Minimum match() limit = 12 -Minimum match() recursion limit = 3 +Minimum match() limit = 7 +Minimum match() recursion limit = 2 0: aabbccddee /^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/ \Maabbccddee -Minimum match() limit = 22 -Minimum match() recursion limit = 21 +Minimum match() limit = 17 +Minimum match() recursion limit = 16 0: aabbccddee 1: aa 2: bb @@ -11905,8 +11875,8 @@ Minimum match() recursion limit = 21 /^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/ \Maabbccddee -Minimum match() limit = 18 -Minimum match() recursion limit = 13 +Minimum match() limit = 13 +Minimum match() recursion limit = 10 0: aabbccddee 1: aa 2: cc @@ -11997,7 +11967,10 @@ No match Failed: \N is not supported in a class at offset 3 /a[B-\Nc]/ -Failed: \N is not supported in a class at offset 5 +Failed: invalid range in character class at offset 5 + +/a[B\Nc]/ +Failed: \N is not supported in a class at offset 4 /(a)(?2){0,1999}?(b)/ @@ -12336,47 +12309,27 @@ Partial match: \x0d\x0d \r\r\r\P\P 0: \x0d\x0d -/-- These two are here because Perl does not match: it seems to allow the -COMMIT to escape from the assertion. --/ - -/(?=a(*COMMIT)b|ac)ac|ac/ - ac - 0: ac - -/(?=a(*COMMIT)b|(ac)) ac | (a)c/x - ac - 0: ac - 1: <unset> - 2: a - "AB(C(D))(E(F))?(?(?=\2)(?=\4))" ABCDGHI\O03 Matched, but too many substrings 0: ABCD -/-- This one is here because Perl does not confine the *COMMIT to the -assertion, and therefore fails the entire subroutine call. --/ - -/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ - ac - 0: ac - /-- These are all run as real matches in test 1; here we are just checking the settings of the anchored and startline bits. --/ /(?>.*?a)(?<=ba)/I Capturing subpattern count = 0 +Max lookbehind = 2 No options No first char Need char = 'a' -Max lookbehind = 2 /(?:.*?a)(?<=ba)/I Capturing subpattern count = 0 +Max lookbehind = 2 No options First char at start or follows newline Need char = 'a' -Max lookbehind = 2 /.*?a(*PRUNE)b/I Capturing subpattern count = 0 @@ -12422,17 +12375,19 @@ No need char /(?>.*?)(?<=(abcd)|(wxyz))/I Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string No options No first char No need char -Max lookbehind = 4 /(?>.*)(?<=(abcd)|(wxyz))/I Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string No options No first char No need char -Max lookbehind = 4 "(?>.*)foo"I Capturing subpattern count = 0 @@ -12468,6 +12423,7 @@ Need char = 'c' /.?/S-I Capturing subpattern count = 0 +May match empty string No options No first char No need char @@ -12475,10 +12431,1698 @@ Study returned NULL /.?/S!I Capturing subpattern count = 0 +May match empty string No options No first char No need char Subject length lower bound = -1 No set of starting bytes +/(?:(a)+(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ b + 0: aab + +/(?:(a)++(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^ ^ b +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ b + 0: aab + +/(?:(?>(a))(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ b + 0: aab + +/(?:(?1)(?C1)x|ab(?C2))((a)){0}/ + aab\C+ +Callout 1: last capture = -1 + 0: <unset> +--->aab + ^^ x +Callout 1: last capture = -1 + 0: <unset> +--->aab + ^^ x +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ ) + 0: ab + +/(?1)(?C1)((a)(?C2)){0}/ + aab\C+ +Callout 2: last capture = 2 + 0: <unset> + 1: <unset> + 2: a +--->aab + ^^ ) +Callout 1: last capture = -1 + 0: <unset> +--->aab + ^^ ((a)(?C2)){0} + 0: a + +/(?:(a)+(?C1)bb|aa(?C2)b)++/ + aab\C+ +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: <unset> + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ b + 0: aab + aab\C+\O2 +Callout 1: last capture = 1 + 0: <unset> +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: <unset> +--->aab + ^^ b +Callout 2: last capture = -1 + 0: <unset> +--->aab + ^ ^ b + 0: aab + +/(ab)x|ab/ + ab\O3 + 0: ab + ab\O2 + 0: ab + +/(ab)/ + ab\O3 +Matched, but too many substrings + 0: ab + ab\O2 +Matched, but too many substrings + 0: ab + +/(?<=123)(*MARK:xx)abc/K + xxxx123a\P\P +Partial match at offset 7, mark=xx: 123a + xxxx123a\P +Partial match at offset 7, mark=xx: 123a + +/123\Kabc/ + xxxx123a\P\P +Partial match: 123a + xxxx123a\P +Partial match: 123a + +/^(?(?=a)aa|bb)/C + bb +--->bb + +0 ^ ^ + +1 ^ (?(?=a)aa|bb) + +3 ^ (?=a) + +6 ^ a ++11 ^ b ++12 ^^ b ++13 ^ ^ ) ++14 ^ ^ + 0: bb + +/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/ + bb +--->bb + 1 ^ ^ + 2 ^ (?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10)) + 99 ^ (?=(?C3)a(?C4)) + 3 ^ a + 8 ^ b + 9 ^^ b + 10 ^ ^ ) + 11 ^ ^ + 0: bb + +/-- Perl seems to have a bug with this one --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Here are some that Perl treats differently because of the way it handles +backtracking verbs. --/ + + /(?!a(*COMMIT)b)ac|ad/ + ac + 0: ac + ad + 0: ad + +/^(?!a(*THEN)b|ac)../ + ac +No match + ad + 0: ad + +/^(?=a(*THEN)b|ac)/ + ac + 0: + +/\A.*?(?:a|b(*THEN)c)/ + ba + 0: ba + +/\A.*?(?:a|b(*THEN)c)++/ + ba + 0: ba + +/\A.*?(?:a|b(*THEN)c|d)/ + ba + 0: ba + +/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/ + aac + 0: aac + +/\A.*?(a|b(*THEN)c)/ + ba + 0: ba + 1: a + +/^(A(*THEN)B|A(*THEN)D)/ + AD + 0: AD + 1: AD + +/(?!b(*THEN)a)bn|bnn/ + bnn + 0: bn + +/(?(?=b(*SKIP)a)bn|bnn)/ + bnn +No match + +/(?=b(*THEN)a|)bn|bnn/ + bnn + 0: bn + +/-------------------------/ + +/(*LIMIT_MATCH=12bc)abc/ +Failed: (*VERB) not recognized or malformed at offset 7 + +/(*LIMIT_MATCH=4294967290)abc/ +Failed: (*VERB) not recognized or malformed at offset 7 + +/(*LIMIT_RECURSION=4294967280)abc/I +Capturing subpattern count = 0 +Recursion limit = 4294967280 +No options +First char = 'a' +Need char = 'c' + +/(a+)*zz/ + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\q3000 +Error -8 (match limit exceeded) + +/(a+)*zz/S- + aaaaaaaaaaaaaz\Q10 +Error -21 (recursion limit exceeded) + +/(*LIMIT_MATCH=3000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 3000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +Error -8 (match limit exceeded) + aaaaaaaaaaaaaz\q60000 +Error -8 (match limit exceeded) + +/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 3000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +Error -8 (match limit exceeded) + +/(*LIMIT_MATCH=60000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 60000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\q3000 +Error -8 (match limit exceeded) + +/(*LIMIT_RECURSION=10)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 10 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting byte set: a z + aaaaaaaaaaaaaz +Error -21 (recursion limit exceeded) + aaaaaaaaaaaaaz\Q1000 +Error -21 (recursion limit exceeded) + +/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 10 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting byte set: a z + aaaaaaaaaaaaaz +Error -21 (recursion limit exceeded) + +/(*LIMIT_RECURSION=1000)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 1000 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting byte set: a z + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\Q10 +Error -21 (recursion limit exceeded) + +/-- This test causes a segfault with Perl 5.18.0 --/ + +/^(?=(a)){0}b(?1)/ + backgammon + 0: ba + +/(?|(?<n>f)|(?<n>b))/JI +Capturing subpattern count = 1 +Named capturing subpatterns: + n 1 +Options: dupnames +No first char +No need char + +/(?<a>abc)(?<a>z)\k<a>()/JDZS +------------------------------------------------------------------ + Bra + CBra 1 + abc + Ket + CBra 2 + z + Ket + \k<a>2 + CBra 3 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 3 +Max back reference = 2 +Named capturing subpatterns: + a 1 + a 2 +Options: dupnames +First char = 'a' +Need char = 'z' +Subject length lower bound = 5 +No set of starting bytes + +/a*[bcd]/BZ +------------------------------------------------------------------ + Bra + a*+ + [b-d] + Ket + End +------------------------------------------------------------------ + +/[bcd]*a/BZ +------------------------------------------------------------------ + Bra + [b-d]*+ + a + Ket + End +------------------------------------------------------------------ + +/-- A complete set of tests for auto-possessification of character types --/ + +/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx +------------------------------------------------------------------ + Bra + \D+ + \D + \D++ + \d + \D+ + \S + \D+ + \s + \D+ + \W + \D+ + \w + \D+ + Any + \D+ + AllAny + \D+ + \R + \D+ + \H + \D+ + \h + \D+ + \V + \D+ + \v + \D+ + \Z + \D++ + \z + \D+ + $ + Ket + End +------------------------------------------------------------------ + +/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx +------------------------------------------------------------------ + Bra + \d++ + \D + \d+ + \d + \d+ + \S + \d++ + \s + \d++ + \W + \d+ + \w + \d+ + Any + \d+ + AllAny + \d++ + \R + \d+ + \H + \d++ + \h + \d+ + \V + \d++ + \v + \d++ + \Z + \d++ + \z + \d++ + $ + Ket + End +------------------------------------------------------------------ + +/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx +------------------------------------------------------------------ + Bra + \S+ + \D + \S+ + \d + \S+ + \S + \S++ + \s + \S+ + \W + \S+ + \w + \S+ + Any + \S+ + AllAny + \S++ + \R + \S+ + \H + \S++ + \h + \S+ + \V + \S++ + \v + \S++ + \Z + \S++ + \z + \S++ + $ + Ket + End +------------------------------------------------------------------ + +/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx +------------------------------------------------------------------ + Bra + \s+ + \D + \s++ + \d + \s++ + \S + \s+ + \s + \s+ + \W + \s++ + \w + \s+ + Any + \s+ + AllAny + \s+ + \R + \s+ + \H + \s+ + \h + \s+ + \V + \s+ + \v + \s+ + \Z + \s++ + \z + \s+ + $ + Ket + End +------------------------------------------------------------------ + +/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx +------------------------------------------------------------------ + Bra + \W+ + \D + \W++ + \d + \W+ + \S + \W+ + \s + \W+ + \W + \W++ + \w + \W+ + Any + \W+ + AllAny + \W+ + \R + \W+ + \H + \W+ + \h + \W+ + \V + \W+ + \v + \W+ + \Z + \W++ + \z + \W+ + $ + Ket + End +------------------------------------------------------------------ + +/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx +------------------------------------------------------------------ + Bra + \w+ + \D + \w+ + \d + \w+ + \S + \w++ + \s + \w++ + \W + \w+ + \w + \w+ + Any + \w+ + AllAny + \w++ + \R + \w+ + \H + \w++ + \h + \w+ + \V + \w++ + \v + \w++ + \Z + \w++ + \z + \w++ + $ + Ket + End +------------------------------------------------------------------ + +/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx +------------------------------------------------------------------ + Bra + AllAny+ + \D + AllAny+ + \d + AllAny+ + \S + AllAny+ + \s + AllAny+ + \W + AllAny+ + \w + AllAny+ + Any + AllAny+ + AllAny + AllAny+ + \R + AllAny+ + \H + AllAny+ + \h + AllAny+ + \V + AllAny+ + \v + AllAny+ + \Z + AllAny++ + \z + AllAny+ + $ + Ket + End +------------------------------------------------------------------ + +/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx +------------------------------------------------------------------ + Bra + \R+ + \D + \R++ + \d + \R+ + \S + \R++ + \s + \R+ + \W + \R++ + \w + \R++ + Any + \R+ + AllAny + \R+ + \R + \R+ + \H + \R++ + \h + \R+ + \V + \R+ + \v + \R+ + \Z + \R++ + \z + \R+ + $ + Ket + End +------------------------------------------------------------------ + +/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx +------------------------------------------------------------------ + Bra + \H+ + \D + \H+ + \d + \H+ + \S + \H+ + \s + \H+ + \W + \H+ + \w + \H+ + Any + \H+ + AllAny + \H+ + \R + \H+ + \H + \H++ + \h + \H+ + \V + \H+ + \v + \H+ + \Z + \H++ + \z + \H+ + $ + Ket + End +------------------------------------------------------------------ + +/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx +------------------------------------------------------------------ + Bra + \h+ + \D + \h++ + \d + \h++ + \S + \h+ + \s + \h+ + \W + \h++ + \w + \h+ + Any + \h+ + AllAny + \h++ + \R + \h++ + \H + \h+ + \h + \h+ + \V + \h++ + \v + \h+ + \Z + \h++ + \z + \h+ + $ + Ket + End +------------------------------------------------------------------ + +/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx +------------------------------------------------------------------ + Bra + \V+ + \D + \V+ + \d + \V+ + \S + \V+ + \s + \V+ + \W + \V+ + \w + \V+ + Any + \V+ + AllAny + \V++ + \R + \V+ + \H + \V+ + \h + \V+ + \V + \V++ + \v + \V+ + \Z + \V++ + \z + \V+ + $ + Ket + End +------------------------------------------------------------------ + +/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx +------------------------------------------------------------------ + Bra + \v+ + \D + \v++ + \d + \v++ + \S + \v+ + \s + \v+ + \W + \v++ + \w + \v+ + Any + \v+ + AllAny + \v+ + \R + \v+ + \H + \v++ + \h + \v++ + \V + \v+ + \v + \v+ + \Z + \v++ + \z + \v+ + $ + Ket + End +------------------------------------------------------------------ + +/ a+\D a+\d a+\S a+\s a+\W a+\w a+. a+\C a+\R a+\H a+\h a+\V a+\v a+\Z a+\z a+$/BZx +------------------------------------------------------------------ + Bra + a+ + \D + a++ + \d + a+ + \S + a++ + \s + a++ + \W + a+ + \w + a+ + Any + a+ + AllAny + a++ + \R + a+ + \H + a++ + \h + a+ + \V + a++ + \v + a++ + \Z + a++ + \z + a++ + $ + Ket + End +------------------------------------------------------------------ + +/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx +------------------------------------------------------------------ + Bra + \x0a+ + \D + \x0a++ + \d + \x0a++ + \S + \x0a+ + \s + \x0a+ + \W + \x0a++ + \w + \x0a+ + Any + \x0a+ + AllAny + \x0a+ + \R + \x0a+ + \H + \x0a++ + \h + \x0a++ + \V + \x0a+ + \v + \x0a+ + \Z + \x0a++ + \z + \x0a+ + $ + Ket + End +------------------------------------------------------------------ + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZx +------------------------------------------------------------------ + Bra + Any+ + \D + Any+ + \d + Any+ + \S + Any+ + \s + Any+ + \W + Any+ + \w + Any+ + Any + Any+ + AllAny + Any++ + \R + Any+ + \H + Any+ + \h + Any+ + \V + Any+ + \v + Any+ + \Z + Any++ + \z + Any+ + $ + Ket + End +------------------------------------------------------------------ + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZxs +------------------------------------------------------------------ + Bra + AllAny+ + \D + AllAny+ + \d + AllAny+ + \S + AllAny+ + \s + AllAny+ + \W + AllAny+ + \w + AllAny+ + AllAny + AllAny+ + AllAny + AllAny+ + \R + AllAny+ + \H + AllAny+ + \h + AllAny+ + \V + AllAny+ + \v + AllAny+ + \Z + AllAny++ + \z + AllAny+ + $ + Ket + End +------------------------------------------------------------------ + +/\D+$ \d+$ \S+$ \s+$ \W+$ \w+$ \C+$ \R+$ \H+$ \h+$ \V+$ \v+$ a+$ \n+$ .+$ .+$/BZxm +------------------------------------------------------------------ + Bra + \D+ + /m $ + \d++ + /m $ + \S++ + /m $ + \s+ + /m $ + \W+ + /m $ + \w++ + /m $ + AllAny+ + /m $ + \R+ + /m $ + \H+ + /m $ + \h+ + /m $ + \V+ + /m $ + \v+ + /m $ + a+ + /m $ + \x0a+ + /m $ + Any+ + /m $ + Any+ + /m $ + Ket + End +------------------------------------------------------------------ + +/(?=a+)a(a+)++a/BZ +------------------------------------------------------------------ + Bra + Assert + a++ + Ket + a + CBraPos 1 + a++ + KetRpos + a + Ket + End +------------------------------------------------------------------ + +/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ +------------------------------------------------------------------ + Bra + a++ + CBra 1 + bb + Alt + cc + Ket + a++ + Bra + bb + Alt + cc + Ket + a++ + Once_NC + bb + Alt + cc + Ket + a++ + Bra + bb + Alt + cc + KetRmax + a+ + CBra 2 + aa + Ket + a+ + Bra + bb + Alt + aa + Ket + Ket + End +------------------------------------------------------------------ + +/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ +------------------------------------------------------------------ + Bra + a++ + Brazero + CBra 1 + bb + Alt + cc + Ket + # + a++ + Braminzero + Bra + bb + Alt + cc + Ket + # + a++ + Once + Brazero + Bra + bb + Alt + cc + Ket + Ket + # + a++ + Brazero + Bra + bb + Alt + cc + KetRmax + # + a+ + Brazero + CBra 2 + bb + Alt + cc + Ket + a# + a+ + Brazero + Bra + aa + Ket + Ket + End +------------------------------------------------------------------ + +/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ +------------------------------------------------------------------ + Bra + a+ + Brazero + Bra + bb + Ket + a# + a++ + Bra + Alt + Alt + Alt + Ket + # + a+ + Bra + Alt + b + Ket + a# + a+ + Brazero + Bra + Alt + Alt + Alt + Ket + a + Ket + End +------------------------------------------------------------------ + +/[ab]*/BZ +------------------------------------------------------------------ + Bra + [ab]*+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]*?/BZ +------------------------------------------------------------------ + Bra + [ab]*? + Ket + End +------------------------------------------------------------------ + aaaa + 0: + +/[ab]?/BZ +------------------------------------------------------------------ + Bra + [ab]?+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: a + +/[ab]??/BZ +------------------------------------------------------------------ + Bra + [ab]?? + Ket + End +------------------------------------------------------------------ + aaaa + 0: + +/[ab]+/BZ +------------------------------------------------------------------ + Bra + [ab]++ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]+?/BZ +------------------------------------------------------------------ + Bra + [ab]+? + Ket + End +------------------------------------------------------------------ + aaaa + 0: a + +/[ab]{2,3}/BZ +------------------------------------------------------------------ + Bra + [ab]{2,3}+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaa + +/[ab]{2,3}?/BZ +------------------------------------------------------------------ + Bra + [ab]{2,3}? + Ket + End +------------------------------------------------------------------ + aaaa + 0: aa + +/[ab]{2,}/BZ +------------------------------------------------------------------ + Bra + [ab]{2,}+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]{2,}?/BZ +------------------------------------------------------------------ + Bra + [ab]{2,}? + Ket + End +------------------------------------------------------------------ + aaaa + 0: aa + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ +------------------------------------------------------------------ + Bra + \d++ + \s{0,5}+ + = + \s*+ + \S? + = + \w{0,4}+ + \W*+ + Ket + End +------------------------------------------------------------------ + +/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ +------------------------------------------------------------------ + Bra + [a-d]{5,12}+ + [0-9e-z]*+ + # + [\x00-`{-\xff] (neg)++ + [b-y]*+ + a + [2-7]?+ + [\x00-/:-`{-\xff] (neg)++ + Ket + End +------------------------------------------------------------------ + +/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ +------------------------------------------------------------------ + Bra + [a-z]*+ + \s + # + [\x09 ]?+ + \S + # + [a-c]* + \S + # + [C-G]++ + \d + # + [4-8]*+ + \D + # + [,4-9]* + \D + # + [!$]{0,5}+ + \w + # + [M-Xf-l]++ + \W + # + [,a-c]? + \W + Ket + End +------------------------------------------------------------------ + +/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ +------------------------------------------------------------------ + Bra + a+ + Brazero + CBra 1 + aa + Alt + bb + KetRmax + c# + a* + Brazero + CBra 2 + bb + Alt + cc + KetRmax + a# + a?+ + Brazero + CBra 3 + bb + Alt + cc + KetRmax + d# + [a-f]* + Brazero + CBra 4 + g + Alt + hh + KetRmax + f + Ket + End +------------------------------------------------------------------ + +/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ +------------------------------------------------------------------ + Bra + [a-f]*+ + Brazero + CBra 1 + g + Alt + hh + Alt + i + KetRmax + i# + [a-x]{4,} + Brazero + SCBra 2 + y{0,6} + KetRmax + y# + [a-k]++ + CBra 3 + ll + Alt + mm + KetRmax + n + Ket + End +------------------------------------------------------------------ + +/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ +------------------------------------------------------------------ + Bra + [a-f]*+ + Once_NC + gg + Alt + hh + KetRmax + # + [a-f]*+ + Brazero + Once_NC + gg + Alt + hh + Ket + # + [a-f]* + Brazero + Once_NC + gg + Alt + hh + KetRmax + a# + [a-f]*+ + Brazero + Once_NC + gg + Alt + hh + KetRmax + h + Ket + End +------------------------------------------------------------------ + +/[a-c]*d/DZS +------------------------------------------------------------------ + Bra + [a-c]*+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting byte set: a b c d + +/[a-c]+d/DZS +------------------------------------------------------------------ + Bra + [a-c]++ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 2 +Starting byte set: a b c + +/[a-c]?d/DZS +------------------------------------------------------------------ + Bra + [a-c]?+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting byte set: a b c d + +/[a-c]{4,6}d/DZS +------------------------------------------------------------------ + Bra + [a-c]{4,6}+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 5 +Starting byte set: a b c + +/[a-c]{0,6}d/DZS +------------------------------------------------------------------ + Bra + [a-c]{0,6}+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting byte set: a b c d + +/-- End of special auto-possessive tests --/ + +/^A\o{1239}B/ +Failed: non-octal character in \o{} (closing brace missing?) at offset 8 + +/^A\oB/ +Failed: missing opening brace after \o at offset 3 + +/^A\x{zz}B/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 5 + +/^A\x{12Z/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 7 + +/^A\x{/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 5 + +/[ab]++/BZO +------------------------------------------------------------------ + Bra + [ab]++ + Ket + End +------------------------------------------------------------------ + +/[^ab]*+/BZO +------------------------------------------------------------------ + Bra + [\x00-`c-\xff] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/a{4}+/BZO +------------------------------------------------------------------ + Bra + a{4} + Ket + End +------------------------------------------------------------------ + +/a{4}+/BZOi +------------------------------------------------------------------ + Bra + /i a{4} + Ket + End +------------------------------------------------------------------ + +/[a-[:digit:]]+/ +Failed: invalid range in character class at offset 3 + +/[A-[:digit:]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[.xxx.]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[=xxx=]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[!xxx!]]+/ +Failed: range out of order in character class at offset 3 + +/[A-[!xxx!]]+/ + A]]] + 0: A]]] + +/[a-\d]+/ +Failed: invalid range in character class at offset 4 + +/(?<0abc>xx)/ +Failed: group name must start with a non-digit at offset 3 + +/(?&1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 3 + +/(?<ab-cd>xx)/ +Failed: syntax error in subpattern name (missing terminator) at offset 5 + +/(?'0abc'xx)/ +Failed: group name must start with a non-digit at offset 3 + +/(?P<0abc>xx)/ +Failed: group name must start with a non-digit at offset 4 + +/\k<5ghj>/ +Failed: group name must start with a non-digit at offset 3 + +/\k'5ghj'/ +Failed: group name must start with a non-digit at offset 3 + +/\k{2fgh}/ +Failed: group name must start with a non-digit at offset 3 + +/(?P=8yuki)/ +Failed: group name must start with a non-digit at offset 4 + +/\g{4df}/ +Failed: group name must start with a non-digit at offset 3 + +/(?&1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 3 + +/(?P>1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 4 + +/\g'3gh'/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 7 + +/\g<5fg>/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 7 + +/(?(<4gh>)abc)/ +Failed: group name must start with a non-digit at offset 4 + +/(?('4gh')abc)/ +Failed: group name must start with a non-digit at offset 4 + +/(?(4gh)abc)/ +Failed: malformed number or name after (?( at offset 4 + +/(?(R&6yh)abc)/ +Failed: group name must start with a non-digit at offset 5 + +/-- Test the ugly "start or end of word" compatibility syntax --/ + +/[[:<:]]red[[:>:]]/BZ +------------------------------------------------------------------ + Bra + \b + Assert + \w + Ket + red + \b + AssertB + Reverse + \w + Ket + Ket + End +------------------------------------------------------------------ + little red riding hood + 0: red + a /red/ thing + 0: red + red is a colour + 0: red + put it all on red + 0: red + ** Failers +No match + no reduction +No match + Alfred Winifred +No match + +/[a[:<:]] should give error/ +Failed: unknown POSIX class name at offset 4 + /-- End of testinput2 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput20 b/ext/pcre/pcrelib/testdata/testoutput20 new file mode 100644 index 000000000..c1b20ee80 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput20 @@ -0,0 +1,24 @@ +/-- These DFA tests are for the handling of characters greater than 255 in + 16- or 32-bit, non-UTF mode. --/ + +/^\x{ffff}+/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + 0: \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + 0: \x{ffff} + +/-- End of testinput20 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput21-16 b/ext/pcre/pcrelib/testdata/testoutput21-16 new file mode 100644 index 000000000..0e21350f8 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput21-16 @@ -0,0 +1,100 @@ +/-- Tests for reloading pre-compiled patterns. The first one gives an error +right away, and can be any old pattern compiled in 8-bit mode ("abc" is +typical). The others require the link size to be 2. */x + +<!testsaved8 +Compiled pattern loaded from testsaved8 +No study data +Error -28 from pcre16_fullinfo(0) +Running in 16-bit mode but pattern was compiled in 8-bit mode + +%-- Generated from: + /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +<!testsaved16LE-1 +Compiled pattern loaded from testsaved16LE-1 +Study data loaded from testsaved16LE-1 +------------------------------------------------------------------ + 0 134 Bra + 2 ^ + 3 [La] + 20 43 CBra 1 + 23 20 Bra + 25 [ALal]+ + 43 20 Ket + 45 [\x00-,.-WY-wy-\xff] (neg)*? + 63 43 Ket + 65 12 CBraPos 2 + 68 [\x{150}-\x{250}\x{300}] + 77 27 Alt + 79 [^AS-Uas-u\x{800}\x{d800}-\x{dfff}] +104 39 KetRpos +106 [^\x08#\x{500}\x{1000}]{3,5} +133 $ +134 134 Ket +136 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + name 1 + other 2 +Options: anchored extended +No first char +No need char +Subject length lower bound = 6 +No set of starting bytes + +<!testsaved16BE-1 +Compiled pattern loaded from testsaved16BE-1 +Study data loaded from testsaved16BE-1 +------------------------------------------------------------------ + 0 134 Bra + 2 ^ + 3 [La] + 20 43 CBra 1 + 23 20 Bra + 25 [ALal]+ + 43 20 Ket + 45 [\x00-,.-WY-wy-\xff] (neg)*? + 63 43 Ket + 65 12 CBraPos 2 + 68 [\x{150}-\x{250}\x{300}] + 77 27 Alt + 79 [^AS-Uas-u\x{800}\x{d800}-\x{dfff}] +104 39 KetRpos +106 [^\x08#\x{500}\x{1000}]{3,5} +133 $ +134 134 Ket +136 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + name 1 + other 2 +Options: anchored extended +No first char +No need char +Subject length lower bound = 6 +No set of starting bytes + +<!testsaved32LE-1 +Compiled pattern loaded from testsaved32LE-1 +Study data loaded from testsaved32LE-1 +Error -28 from pcre16_fullinfo(0) +Running in 16-bit mode but pattern was compiled in 32-bit mode + +<!testsaved32BE-1 +Compiled pattern loaded from testsaved32BE-1 +Study data loaded from testsaved32BE-1 +Error -28 from pcre16_fullinfo(0) +Running in 16-bit mode but pattern was compiled in 32-bit mode + +/-- End of testinput21 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput21-32 b/ext/pcre/pcrelib/testdata/testoutput21-32 new file mode 100644 index 000000000..183487aca --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput21-32 @@ -0,0 +1,100 @@ +/-- Tests for reloading pre-compiled patterns. The first one gives an error +right away, and can be any old pattern compiled in 8-bit mode ("abc" is +typical). The others require the link size to be 2. */x + +<!testsaved8 +Compiled pattern loaded from testsaved8 +No study data +Error -28 from pcre32_fullinfo(0) +Running in 32-bit mode but pattern was compiled in 8-bit mode + +%-- Generated from: + /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +<!testsaved16LE-1 +Compiled pattern loaded from testsaved16LE-1 +Study data loaded from testsaved16LE-1 +Error -28 from pcre32_fullinfo(0) +Running in 32-bit mode but pattern was compiled in 16-bit mode + +<!testsaved16BE-1 +Compiled pattern loaded from testsaved16BE-1 +Study data loaded from testsaved16BE-1 +Error -28 from pcre32_fullinfo(0) +Running in 32-bit mode but pattern was compiled in 16-bit mode + +<!testsaved32LE-1 +Compiled pattern loaded from testsaved32LE-1 +Study data loaded from testsaved32LE-1 +------------------------------------------------------------------ + 0 94 Bra + 2 ^ + 3 [La] + 12 27 CBra 1 + 15 12 Bra + 17 [ALal]+ + 27 12 Ket + 29 [\x00-,.-WY-wy-\xff] (neg)*? + 39 27 Ket + 41 12 CBraPos 2 + 44 [\x{150}-\x{250}\x{300}] + 53 19 Alt + 55 [^AS-Uas-u\x{800}\x{d800}-\x{dfff}] + 72 31 KetRpos + 74 [^\x08#\x{500}\x{1000}]{3,5} + 93 $ + 94 94 Ket + 96 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + name 1 + other 2 +Options: anchored extended +No first char +No need char +Subject length lower bound = 6 +No set of starting bytes + +<!testsaved32BE-1 +Compiled pattern loaded from testsaved32BE-1 +Study data loaded from testsaved32BE-1 +------------------------------------------------------------------ + 0 94 Bra + 2 ^ + 3 [La] + 12 27 CBra 1 + 15 12 Bra + 17 [ALal]+ + 27 12 Ket + 29 [\x00-,.-WY-wy-\xff] (neg)*? + 39 27 Ket + 41 12 CBraPos 2 + 44 [\x{150}-\x{250}\x{300}] + 53 19 Alt + 55 [^AS-Uas-u\x{800}\x{d800}-\x{dfff}] + 72 31 KetRpos + 74 [^\x08#\x{500}\x{1000}]{3,5} + 93 $ + 94 94 Ket + 96 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + name 1 + other 2 +Options: anchored extended +No first char +No need char +Subject length lower bound = 6 +No set of starting bytes + +/-- End of testinput21 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput22-16 b/ext/pcre/pcrelib/testdata/testoutput22-16 new file mode 100644 index 000000000..f896b13e1 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput22-16 @@ -0,0 +1,81 @@ +/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */ + +%-- Generated from: + /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?<cb2>[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + +<!testsaved16LE-2 +Compiled pattern loaded from testsaved16LE-2 +Study data loaded from testsaved16LE-2 +------------------------------------------------------------------ + 0 101 Bra + 2 45 CBra 1 + 5 [Za\x{400}-\x{10ffff}]{4,} + 32 [\x{f123}\x{10039}\x{20000}-\x{21234}]? + 47 30 Alt + 49 [A-Cx-z\x{100000}-\x{1000a7}\x{101234}] + 77 75 Ket + 79 20 CBra 2 + 82 [\x00-`b-y{-\xff] (neg) + 99 20 Ket +101 101 Ket +103 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + cb2 2 + cbra1 1 +Options: extended utf +No first char +No need char +Subject length lower bound = 2 +No set of starting bytes + +<!testsaved16BE-2 +Compiled pattern loaded from testsaved16BE-2 +Study data loaded from testsaved16BE-2 +------------------------------------------------------------------ + 0 101 Bra + 2 45 CBra 1 + 5 [Za\x{400}-\x{10ffff}]{4,} + 32 [\x{f123}\x{10039}\x{20000}-\x{21234}]? + 47 30 Alt + 49 [A-Cx-z\x{100000}-\x{1000a7}\x{101234}] + 77 75 Ket + 79 20 CBra 2 + 82 [\x00-`b-y{-\xff] (neg) + 99 20 Ket +101 101 Ket +103 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + cb2 2 + cbra1 1 +Options: extended utf +No first char +No need char +Subject length lower bound = 2 +No set of starting bytes + +<!testsaved32LE-2 +Compiled pattern loaded from testsaved32LE-2 +Study data loaded from testsaved32LE-2 +Error -28 from pcre16_fullinfo(0) +Running in 16-bit mode but pattern was compiled in 32-bit mode + +<!testsaved32BE-2 +Compiled pattern loaded from testsaved32BE-2 +Study data loaded from testsaved32BE-2 +Error -28 from pcre16_fullinfo(0) +Running in 16-bit mode but pattern was compiled in 32-bit mode + +/-- End of testinput22 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput22-32 b/ext/pcre/pcrelib/testdata/testoutput22-32 new file mode 100644 index 000000000..783926b82 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput22-32 @@ -0,0 +1,81 @@ +/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */ + +%-- Generated from: + /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?<cb2>[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + +<!testsaved16LE-2 +Compiled pattern loaded from testsaved16LE-2 +Study data loaded from testsaved16LE-2 +Error -28 from pcre32_fullinfo(0) +Running in 32-bit mode but pattern was compiled in 16-bit mode + +<!testsaved16BE-2 +Compiled pattern loaded from testsaved16BE-2 +Study data loaded from testsaved16BE-2 +Error -28 from pcre32_fullinfo(0) +Running in 32-bit mode but pattern was compiled in 16-bit mode + +<!testsaved32LE-2 +Compiled pattern loaded from testsaved32LE-2 +Study data loaded from testsaved32LE-2 +------------------------------------------------------------------ + 0 70 Bra + 2 33 CBra 1 + 5 [Za\x{400}-\x{10ffff}]{4,} + 23 [\x{f123}\x{10039}\x{20000}-\x{21234}]? + 35 19 Alt + 37 [A-Cx-z\x{100000}-\x{1000a7}\x{101234}] + 54 52 Ket + 56 12 CBra 2 + 59 [\x00-`b-y{-\xff] (neg) + 68 12 Ket + 70 70 Ket + 72 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + cb2 2 + cbra1 1 +Options: extended utf +No first char +No need char +Subject length lower bound = 2 +No set of starting bytes + +<!testsaved32BE-2 +Compiled pattern loaded from testsaved32BE-2 +Study data loaded from testsaved32BE-2 +------------------------------------------------------------------ + 0 70 Bra + 2 33 CBra 1 + 5 [Za\x{400}-\x{10ffff}]{4,} + 23 [\x{f123}\x{10039}\x{20000}-\x{21234}]? + 35 19 Alt + 37 [A-Cx-z\x{100000}-\x{1000a7}\x{101234}] + 54 52 Ket + 56 12 CBra 2 + 59 [\x00-`b-y{-\xff] (neg) + 68 12 Ket + 70 70 Ket + 72 End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + cb2 2 + cbra1 1 +Options: extended utf +No first char +No need char +Subject length lower bound = 2 +No set of starting bytes + +/-- End of testinput22 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput23 b/ext/pcre/pcrelib/testdata/testoutput23 new file mode 100644 index 000000000..6f5384c34 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput23 @@ -0,0 +1,46 @@ +/-- Tests for the 16-bit library only */ + +< forbid 8W + +/-- Check maximum non-UTF character size --/ + +/\x{ffff}/ + A\x{ffff}B + 0: \x{ffff} + +/\x{10000}/ +Failed: character value in \x{} or \o{} is too large at offset 8 + +/\o{20000}/ + +/-- Check character ranges --/ + +/[\H]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\x{a1}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/[\V]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x{86}-\x{2027}\x{202a}-\x{ffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/-- End of testinput23 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput24 b/ext/pcre/pcrelib/testdata/testoutput24 new file mode 100644 index 000000000..0714a0fe1 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput24 @@ -0,0 +1,13 @@ +/-- Tests for the 16-bit library with UTF-16 support only */ + +< forbid W + +/bad/8 + \x{d800} +Error -10 (bad UTF-16 string) offset=0 reason=1 + +/short/8 + \P\P\x{d800} +Error -25 (short UTF-16 string) offset=0 reason=1 + +/-- End of testinput24 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput25 b/ext/pcre/pcrelib/testdata/testoutput25 new file mode 100644 index 000000000..7ad337836 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput25 @@ -0,0 +1,93 @@ +/-- Tests for the 32-bit library only */ + +< forbid 8w + +/-- Check maximum character size --/ + +/\x{110000}/ + +/\x{7fffffff}/ + +/\x{80000000}/ + +/\x{ffffffff}/ + +/\x{100000000}/ +Failed: character value in \x{} or \o{} is too large at offset 12 + +/\o{17777777777}/ + +/\o{20000000000}/ + +/\o{37777777777}/ + +/\o{40000000000}/ +Failed: character value in \x{} or \o{} is too large at offset 14 + +/\x{7fffffff}\x{7fffffff}/I +Capturing subpattern count = 0 +No options +First char = \x{7fffffff} +Need char = \x{7fffffff} + +/\x{80000000}\x{80000000}/I +Capturing subpattern count = 0 +No options +First char = \x{80000000} +Need char = \x{80000000} + +/\x{ffffffff}\x{ffffffff}/I +Capturing subpattern count = 0 +No options +First char = \x{ffffffff} +Need char = \x{ffffffff} + +/-- Non-UTF characters --/ + +/\C{2,3}/ + \x{400000}\x{400001}\x{400002}\x{400003} + 0: \x{400000}\x{400001}\x{400002} + +/\x{400000}\x{800000}/iDZ +------------------------------------------------------------------ + Bra + /i \x{400000}\x{800000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless +First char = \x{400000} +Need char = \x{800000} + +/-- Check character ranges --/ + +/[\H]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\x{a1}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffffffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/[\V]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x{86}-\x{2027}\x{202a}-\x{ffffffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No set of starting bytes + +/-- End of testinput25 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput26 b/ext/pcre/pcrelib/testdata/testoutput26 new file mode 100644 index 000000000..28f8d42a5 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutput26 @@ -0,0 +1,17 @@ +/-- Tests for the 32-bit library with UTF-32 support only */ + +< forbid W + +/-- Non-UTF characters --/ + +/\x{110000}/8 +Failed: character value in \x{} or \o{} is too large at offset 9 + +/\o{4200000}/8 +Failed: character value in \x{} or \o{} is too large at offset 10 + +/\C/8 + \x{110000} +Error -10 (bad UTF-32 string) offset=0 reason=3 + +/-- End of testinput26 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput3 b/ext/pcre/pcrelib/testdata/testoutput3 index 7b0a3e926..12ffc9911 100644 --- a/ext/pcre/pcrelib/testdata/testoutput3 +++ b/ext/pcre/pcrelib/testdata/testoutput3 @@ -1,6 +1,8 @@ /-- This set of tests checks local-specific features, using the fr_FR locale. It is not Perl-compatible. There is different version called wintestinput3 f or use on Windows, where the locale is called "french". --/ + +< forbid 8W /^[\w]+/ *** Failers diff --git a/ext/pcre/pcrelib/testdata/testoutput4 b/ext/pcre/pcrelib/testdata/testoutput4 index 2082721c5..0dbec4ecc 100644 --- a/ext/pcre/pcrelib/testdata/testoutput4 +++ b/ext/pcre/pcrelib/testdata/testoutput4 @@ -1,6 +1,8 @@ /-- This set of tests is for UTF support, excluding Unicode properties. It is compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit PCRE libraries. --/ + +< forbid 9?=ABCDEFfGILMNPTUWXZ< /a.b/8 acb @@ -1091,4 +1093,174 @@ MK: a\x{1234}b 0: a MK: a\x{a3}b +/-- Noncharacters --/ + +/./8 + \x{fffe} + 0: \x{fffe} + \x{ffff} + 0: \x{ffff} + \x{1fffe} + 0: \x{1fffe} + \x{1ffff} + 0: \x{1ffff} + \x{2fffe} + 0: \x{2fffe} + \x{2ffff} + 0: \x{2ffff} + \x{3fffe} + 0: \x{3fffe} + \x{3ffff} + 0: \x{3ffff} + \x{4fffe} + 0: \x{4fffe} + \x{4ffff} + 0: \x{4ffff} + \x{5fffe} + 0: \x{5fffe} + \x{5ffff} + 0: \x{5ffff} + \x{6fffe} + 0: \x{6fffe} + \x{6ffff} + 0: \x{6ffff} + \x{7fffe} + 0: \x{7fffe} + \x{7ffff} + 0: \x{7ffff} + \x{8fffe} + 0: \x{8fffe} + \x{8ffff} + 0: \x{8ffff} + \x{9fffe} + 0: \x{9fffe} + \x{9ffff} + 0: \x{9ffff} + \x{afffe} + 0: \x{afffe} + \x{affff} + 0: \x{affff} + \x{bfffe} + 0: \x{bfffe} + \x{bffff} + 0: \x{bffff} + \x{cfffe} + 0: \x{cfffe} + \x{cffff} + 0: \x{cffff} + \x{dfffe} + 0: \x{dfffe} + \x{dffff} + 0: \x{dffff} + \x{efffe} + 0: \x{efffe} + \x{effff} + 0: \x{effff} + \x{ffffe} + 0: \x{ffffe} + \x{fffff} + 0: \x{fffff} + \x{10fffe} + 0: \x{10fffe} + \x{10ffff} + 0: \x{10ffff} + \x{fdd0} + 0: \x{fdd0} + \x{fdd1} + 0: \x{fdd1} + \x{fdd2} + 0: \x{fdd2} + \x{fdd3} + 0: \x{fdd3} + \x{fdd4} + 0: \x{fdd4} + \x{fdd5} + 0: \x{fdd5} + \x{fdd6} + 0: \x{fdd6} + \x{fdd7} + 0: \x{fdd7} + \x{fdd8} + 0: \x{fdd8} + \x{fdd9} + 0: \x{fdd9} + \x{fdda} + 0: \x{fdda} + \x{fddb} + 0: \x{fddb} + \x{fddc} + 0: \x{fddc} + \x{fddd} + 0: \x{fddd} + \x{fdde} + 0: \x{fdde} + \x{fddf} + 0: \x{fddf} + \x{fde0} + 0: \x{fde0} + \x{fde1} + 0: \x{fde1} + \x{fde2} + 0: \x{fde2} + \x{fde3} + 0: \x{fde3} + \x{fde4} + 0: \x{fde4} + \x{fde5} + 0: \x{fde5} + \x{fde6} + 0: \x{fde6} + \x{fde7} + 0: \x{fde7} + \x{fde8} + 0: \x{fde8} + \x{fde9} + 0: \x{fde9} + \x{fdea} + 0: \x{fdea} + \x{fdeb} + 0: \x{fdeb} + \x{fdec} + 0: \x{fdec} + \x{fded} + 0: \x{fded} + \x{fdee} + 0: \x{fdee} + \x{fdef} + 0: \x{fdef} + +/^\d*\w{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^[^b]*\w{4}/8 + aaaa + 0: aaaa + aaa +No match + +/^[^b]*\w{4}/8i + aaaa + 0: aaaa + aaa +No match + +/^\x{100}*.{4}/8 + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} +No match + +/^\x{100}*.{4}/8i + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} +No match + +/^a+[a\x{200}]/8 + aa + 0: aa + /-- End of testinput4 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput5 b/ext/pcre/pcrelib/testdata/testoutput5 index 0e840540c..3fa581052 100644 --- a/ext/pcre/pcrelib/testdata/testoutput5 +++ b/ext/pcre/pcrelib/testdata/testoutput5 @@ -1,26 +1,47 @@ /-- This set of tests checks the API, internals, and non-Perl stuff for UTF support, excluding Unicode properties. However, tests that give different results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/ + +< forbid W /\x{110000}/8DZ -Failed: character value in \x{...} sequence is too large at offset 9 +Failed: character value in \x{} or \o{} is too large at offset 9 + +/\o{4200000}/8DZ +Failed: character value in \x{} or \o{} is too large at offset 10 /\x{ffffffff}/8 -Failed: character value in \x{...} sequence is too large at offset 11 +Failed: character value in \x{} or \o{} is too large at offset 11 + +/\o{37777777777}/8 +Failed: character value in \x{} or \o{} is too large at offset 14 /\x{100000000}/8 -Failed: character value in \x{...} sequence is too large at offset 12 +Failed: character value in \x{} or \o{} is too large at offset 12 + +/\o{77777777777}/8 +Failed: character value in \x{} or \o{} is too large at offset 14 /\x{d800}/8 Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 +/\o{154000}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9 + /\x{dfff}/8 Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 +/\o{157777}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9 + /\x{d7ff}/8 +/\o{153777}/8 + /\x{e000}/8 +/\o{170000}/8 + /^\x{100}a\x{1234}/8 \x{100}a\x{1234}bcd 0: \x{100}a\x{1234} @@ -146,11 +167,12 @@ No match /\x{100}*/8DZ ------------------------------------------------------------------ Bra - \x{100}* + \x{100}*+ Ket End ------------------------------------------------------------------ Capturing subpattern count = 0 +May match empty string Options: utf No first char No need char @@ -159,7 +181,7 @@ No need char ------------------------------------------------------------------ Bra a - \x{100}* + \x{100}*+ Ket End ------------------------------------------------------------------ @@ -172,7 +194,7 @@ No need char ------------------------------------------------------------------ Bra ab - \x{100}* + \x{100}*+ Ket End ------------------------------------------------------------------ @@ -373,6 +395,7 @@ Need char = 'z' End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string Options: utf No first char No need char @@ -404,6 +427,7 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string Options: utf No first char No need char @@ -424,6 +448,7 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string Options: utf No first char No need char @@ -455,6 +480,7 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 2 +May match empty string Options: utf No first char No need char @@ -768,7 +794,7 @@ No match /[\h]{3,}/8BZ ------------------------------------------------------------------ Bra - [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]{3,} + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]{3,}+ Ket End ------------------------------------------------------------------ @@ -1572,7 +1598,7 @@ Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 /[\h\x{e000}]+/8BZ ------------------------------------------------------------------ Bra - [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{e000}]+ + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{e000}]++ Ket End ------------------------------------------------------------------ @@ -1594,7 +1620,7 @@ Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 /[\H\x{d7ff}]+/8BZ ------------------------------------------------------------------ Bra - [\x00-\x08\x0a-\x1f!-\x9f\x{a1}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{10ffff}\x{d7ff}]+ + [\x00-\x08\x0a-\x1f!-\x9f\x{a1}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{10ffff}\x{d7ff}]++ Ket End ------------------------------------------------------------------ @@ -1616,7 +1642,7 @@ Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 /[\v\x{e000}]+/8BZ ------------------------------------------------------------------ Bra - [\x0a-\x0d\x85\x{2028}-\x{2029}\x{e000}]+ + [\x0a-\x0d\x85\x{2028}-\x{2029}\x{e000}]++ Ket End ------------------------------------------------------------------ @@ -1634,7 +1660,7 @@ Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 /[\V\x{d7ff}]+/8BZ ------------------------------------------------------------------ Bra - [\x00-\x09\x0e-\x84\x{86}-\x{2027}\x{202a}-\x{10ffff}\x{d7ff}]+ + [\x00-\x09\x0e-\x84\x{86}-\x{2027}\x{202a}-\x{10ffff}\x{d7ff}]++ Ket End ------------------------------------------------------------------ @@ -1808,20 +1834,18 @@ Partial match: \x{0d}\x{0d} /i [^\x{8000}]* /i [^\x{7fff}]{2} /i [^\x{7fff}]{0,7}? - Once /i [^\x{fffff}]{5} - /i [^\x{fffff}]? - Ket + /i [^\x{fffff}]?+ Ket End ------------------------------------------------------------------ /(?<=\x{1234}\x{1234})\bxy/I8 Capturing subpattern count = 0 +Max lookbehind = 2 Options: utf First char = 'x' Need char = 'y' -Max lookbehind = 2 /(?<!^)ETA/8 ETA @@ -1846,4 +1870,16 @@ No match /\ud800/<JS>8 Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 5 +/^a+[a\x{200}]/8BZ +------------------------------------------------------------------ + Bra + ^ + a+ + [a\x{200}] + Ket + End +------------------------------------------------------------------ + aa + 0: aa + /-- End of testinput5 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput6 b/ext/pcre/pcrelib/testdata/testoutput6 index 018274616..6c42fce1a 100644 --- a/ext/pcre/pcrelib/testdata/testoutput6 +++ b/ext/pcre/pcrelib/testdata/testoutput6 @@ -1,5 +1,7 @@ /-- This set of tests is for Unicode property support. It is compatible with Perl >= 5.15. --/ + +< forbid 9?=ABCDEFfGILMNPTUXZ< /^\pC\pL\pM\pN\pP\pS\pZ</8 \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}< @@ -543,16 +545,6 @@ No match abc No match -/\p{Lu}/8i - A - 0: A - aZ - 0: Z - ** Failers - 0: F - abc -No match - /\p{Ll}/8 a 0: a @@ -727,6 +719,8 @@ No match 0: \x{6e9} \x{060b} 0: \x{60b} + \x{061c} + 0: \x{61c} ** Failers No match X\x{06e9} @@ -1310,7 +1304,7 @@ No match /^>\s+/8W >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} - 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09} + 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b} /^>\pZ+/8W >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} @@ -1338,15 +1332,15 @@ No match /^[[:graph:]]*/8W A\x{a1}\x{a0} - 0: A + 0: A\x{a1} /^[[:print:]]*/8W A z\x{a0}\x{a1} - 0: A z + 0: A z\x{a0}\x{a1} /^[[:punct:]]*/8W .+\x{a1}\x{a0} - 0: .+ + 0: .+\x{a1} /\p{Zs}*?\R/ ** Failers @@ -1548,6 +1542,19 @@ No match 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X 0+ +/\X*Z/8Y + A\x{300} +No match + +/\X*(.)/8Y + A\x{1111}\x{ae4c}\x{1169} + 0: A\x{1111} + 1: \x{1111} + +/\X?abc/8Y +\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\? + 0: A\x{300}abc + /-- --/ /\x{1e9e}+/8i @@ -2134,4 +2141,308 @@ No match \x{0053}\x{0073}\x{017f} 0: Ss\x{17f} +/^\p{Any}*\d{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^\X*\w{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^A\s+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^[[:graph:]]+$/8W + Letter:ABC + 0: Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + 0: Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + 0: Number:9\x{660} + Punctuation:\x{66a},; + 0: Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + 0: Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + 0: \x{feff} + \x{fff9}\x{fffa}\x{fffb} + 0: \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + 0: \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + 0: \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers +No match + \x{09} +No match + \x{0a} +No match + \x{1D} +No match + \x{20} +No match + \x{85} +No match + \x{a0} +No match + \x{61c} +No match + \x{1680} +No match + \x{180e} +No match + \x{2028} +No match + \x{2029} +No match + \x{202f} +No match + \x{2065} +No match + \x{2066} +No match + \x{2067} +No match + \x{2068} +No match + \x{2069} +No match + \x{3000} +No match + \x{e0002} +No match + \x{e001f} +No match + \x{e0080} +No match + +/^[[:print:]]+$/8W + Space: \x{a0} + 0: Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + 0: \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + 0: \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + 0: \x{202f}\x{205f} + \x{3000} + 0: \x{3000} + Letter:ABC + 0: Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + 0: Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + 0: Number:9\x{660} + Punctuation:\x{66a},; + 0: Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + 0: Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + 0: \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + 0: \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + 0: \x{feff} + \x{fff9}\x{fffa}\x{fffb} + 0: \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + 0: \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + 0: \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + 0: ** Failers + \x{09} +No match + \x{1D} +No match + \x{85} +No match + \x{61c} +No match + \x{2028} +No match + \x{2029} +No match + \x{2065} +No match + \x{2066} +No match + \x{2067} +No match + \x{2068} +No match + \x{2069} +No match + \x{e0002} +No match + \x{e001f} +No match + \x{e0080} +No match + +/^[[:punct:]]+$/8W + \$+<=>^`|~ + 0: $+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + 0: !"#%&'()*,-./:;?@[\]_{} + \x{a1}\x{a7} + 0: \x{a1}\x{a7} + \x{37e} + 0: \x{37e} + ** Failers +No match + abcde +No match + +/^[[:^graph:]]+$/8W + \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e} + 0: \x{09}\x{0a}\x{1d} \x{85}\x{a0}\x{61c}\x{1680}\x{180e} + \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + 0: \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + \x{3000}\x{e0002}\x{e001f}\x{e0080} + 0: \x{3000}\x{e0002}\x{e001f}\x{e0080} + ** Failers +No match + Letter:ABC +No match + Mark:\x{300}\x{1d172}\x{1d17b} +No match + Number:9\x{660} +No match + Punctuation:\x{66a},; +No match + Symbol:\x{6de}<>\x{fffc} +No match + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} +No match + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} +No match + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} +No match + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} +No match + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} +No match + \x{feff} +No match + \x{fff9}\x{fffa}\x{fffb} +No match + \x{110bd} +No match + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} +No match + \x{e0001} +No match + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} +No match + +/^[[:^print:]]+$/8W + \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + 0: \x{09}\x{1d}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + 0: \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + ** Failers +No match + Space: \x{a0} +No match + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} +No match + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} +No match + \x{202f}\x{205f} +No match + \x{3000} +No match + Letter:ABC +No match + Mark:\x{300}\x{1d172}\x{1d17b} +No match + Number:9\x{660} +No match + Punctuation:\x{66a},; +No match + Symbol:\x{6de}<>\x{fffc} +No match + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} +No match + \x{180e} +No match + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} +No match + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} +No match + \x{202f} +No match + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} +No match + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} +No match + \x{feff} +No match + \x{fff9}\x{fffa}\x{fffb} +No match + \x{110bd} +No match + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} +No match + \x{e0001} +No match + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} +No match + +/^[[:^punct:]]+$/8W + abcde + 0: abcde + ** Failers +No match + \$+<=>^`|~ +No match + !\"#%&'()*,-./:;?@[\\]_{} +No match + \x{a1}\x{a7} +No match + \x{37e} +No match + /-- End of testinput6 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput7 b/ext/pcre/pcrelib/testdata/testoutput7 index 4f8b7b9bf..45ac72fd8 100644 --- a/ext/pcre/pcrelib/testdata/testoutput7 +++ b/ext/pcre/pcrelib/testdata/testoutput7 @@ -78,7 +78,7 @@ No need char /[\p{Nd}+-]+/8DZ ------------------------------------------------------------------ Bra - [+\-\p{Nd}]+ + [+\-\p{Nd}]++ Ket End ------------------------------------------------------------------ @@ -270,6 +270,20 @@ No need char End ------------------------------------------------------------------ +/^\p{Cf}/8 + \x{180e} + 0: \x{180e} + \x{061c} + 0: \x{61c} + \x{2066} + 0: \x{2066} + \x{2067} + 0: \x{2067} + \x{2068} + 0: \x{2068} + \x{2069} + 0: \x{2069} + /^\p{Cs}/8 \?\x{dfff} 0: \x{dfff} @@ -278,6 +292,22 @@ No match \x{09f} No match +/^\p{Mn}/8 + \x{1a1b} + 0: \x{1a1b} + +/^\p{Pe}/8 + \x{2309} + 0: \x{2309} + \x{230b} + 0: \x{230b} + +/^\p{Ps}/8 + \x{2308} + 0: \x{2308} + \x{230a} + 0: \x{230a} + /^\p{Sc}+/8 $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6} 0: $\x{a2}\x{a3}\x{a4}\x{a5} @@ -297,8 +327,6 @@ No match 0: \x{a0} \x{1680} 0: \x{1680} - \x{180e} - 0: \x{180e} \x{2000} 0: \x{2000} \x{2001} @@ -310,8 +338,9 @@ No match \x{200d} No match -/-- These four are here rather than in test 6 because Perl has problems with - the negative versions of the properties. --/ +/-- These are here rather than in test 6 because Perl has problems with + the negative versions of the properties and behaves has changed how + it behaves for caseless matching. --/ /\p{^Lu}/8i 1234 @@ -351,6 +380,16 @@ No match \x{1d00} No match +/\p{Lu}/8i + A + 0: A + aZ + 0: Z + ** Failers + 0: F + abc +No match + /[\x{c0}\x{391}]/8i \x{c0} 0: \x{c0} @@ -501,7 +540,7 @@ No match /^>\p{Xsp}+/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} /^>\p{Xsp}+?/8 >\x{1680}\x{2028}\x{0b} @@ -509,11 +548,11 @@ No match /^>\p{Xsp}*/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} /^>\p{Xsp}{2,9}/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} /^>\p{Xsp}{2,9}?/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} @@ -525,7 +564,7 @@ No match /^>[\p{Xsp}]+/8 > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} - 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} /^>\p{Xps}/8 >\x{1680}\x{2028}\x{0b} @@ -820,7 +859,7 @@ No match /[[:graph:]]/WBZ ------------------------------------------------------------------ Bra - [!-~] + [[:graph:]] Ket End ------------------------------------------------------------------ @@ -828,7 +867,7 @@ No match /[[:print:]]/WBZ ------------------------------------------------------------------ Bra - [ -~] + [[:print:]] Ket End ------------------------------------------------------------------ @@ -836,7 +875,7 @@ No match /[[:punct:]]/WBZ ------------------------------------------------------------------ Bra - [!-/:-@[-`{-~] + [[:punct:]] Ket End ------------------------------------------------------------------ @@ -910,7 +949,7 @@ No match /[[:^alpha:][:^cntrl:]]+/8WBZ ------------------------------------------------------------------ Bra - [ -~\x80-\xff\P{L}]+ + [ -~\x80-\xff\P{L}]++ Ket End ------------------------------------------------------------------ @@ -922,7 +961,7 @@ No match /[[:^cntrl:][:^alpha:]]+/8WBZ ------------------------------------------------------------------ Bra - [ -~\x80-\xff\P{L}]+ + [ -~\x80-\xff\P{L}]++ Ket End ------------------------------------------------------------------ @@ -934,7 +973,7 @@ No match /[[:alpha:]]+/8WBZ ------------------------------------------------------------------ Bra - [\p{L}]+ + [\p{L}]++ Ket End ------------------------------------------------------------------ @@ -944,7 +983,7 @@ No match /[[:^alpha:]\S]+/8WBZ ------------------------------------------------------------------ Bra - [\P{L}\P{Xsp}]+ + [\P{L}\P{Xsp}]++ Ket End ------------------------------------------------------------------ @@ -956,7 +995,7 @@ No match /[^\d]+/8WBZ ------------------------------------------------------------------ Bra - [^\p{Nd}]+ + [^\p{Nd}]++ Ket End ------------------------------------------------------------------ @@ -1070,8 +1109,8 @@ No match prop Nd B+ prop N *+ - B+ - prop Nd * + B++ + prop Nd *+ Ket End ------------------------------------------------------------------ @@ -1347,7 +1386,7 @@ Need char = 'B' (caseless) /[\x{3a3}]+/8iBZ ------------------------------------------------------------------ Bra - clist 03a3 03c2 03c3 + + clist 03a3 03c2 03c3 ++ Ket End ------------------------------------------------------------------ @@ -1355,7 +1394,7 @@ Need char = 'B' (caseless) /[^\x{3a3}]+/8iBZ ------------------------------------------------------------------ Bra - not clist 03a3 03c2 03c3 + + not clist 03a3 03c2 03c3 ++ Ket End ------------------------------------------------------------------ @@ -1469,5 +1508,759 @@ No match /is{2}t/8i iskt No match + +/-- This property is a PCRE special --/ + +/^\p{Xuc}/8 + $abc + 0: $ + @abc + 0: @ + `abc + 0: ` + \x{1234}abc + 0: \x{1234} + ** Failers +No match + abc +No match + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000}* + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@` + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\P{Xuc}/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^[\P{Xuc}]/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/-- Some auto-possessification tests --/ + +/\pN+\z/BZ +------------------------------------------------------------------ + Bra + prop N ++ + \z + Ket + End +------------------------------------------------------------------ + +/\PN+\z/BZ +------------------------------------------------------------------ + Bra + notprop N ++ + \z + Ket + End +------------------------------------------------------------------ + +/\pN+/BZ +------------------------------------------------------------------ + Bra + prop N ++ + Ket + End +------------------------------------------------------------------ + +/\PN+/BZ +------------------------------------------------------------------ + Bra + notprop N ++ + Ket + End +------------------------------------------------------------------ + +/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Any + + prop Any + prop Any + + notprop Any + prop Any + + prop L& + prop Any + + prop L + prop Any + + prop Lu + prop Any + + prop Han + prop Any + + prop Xan + prop Any + + prop Xsp + prop Any + + prop Xps + prop Xwd + + prop Any + prop Any + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop L& + + prop Any + prop L& + + prop L& + notprop L& ++ + prop L& + prop L& + + prop L + prop L& + + prop Lu + prop L& + + prop Han + prop L& + + prop Xan + prop L& ++ + notprop Xan + prop L& ++ + prop Xsp + prop L& ++ + prop Xps + prop Xwd + + prop L& + prop L& + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop N + + prop Any + prop N + + prop L& + prop N ++ + prop L + prop N + + notprop L + prop N ++ + notprop N + prop N ++ + prop Lu + prop N + + prop Han + prop N + + prop Xan + prop N ++ + prop Xsp + prop N ++ + prop Xps + prop Xwd + + prop N + prop N + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Lu + + prop Any + prop Lu + + prop L& + prop Lu + + prop L + prop Lu + + prop Lu + notprop Lu ++ + prop Lu + prop Lu ++ + prop Nd + prop Lu + + notprop Nd + prop Lu + + prop Han + prop Lu + + prop Xan + prop Lu ++ + prop Xsp + prop Lu ++ + prop Xps + prop Xwd + + prop Lu + prop Lu + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Han + + prop Lu + prop Han + + prop L& + prop Han + + prop L + prop Han + + prop Lu + prop Han ++ + prop Arabic + prop Arabic + + prop Arabic + prop Han + + prop Xan + prop Han + + prop Xsp + prop Han + + prop Xps + prop Xwd + + prop Han + prop Han + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Any + prop Xan + + prop L& + notprop Xan ++ + prop L& + prop Xan + + prop L + prop Xan + + prop Lu + prop Xan + + prop Han + prop Xan + + prop Xan + prop Xan ++ + notprop Xan + prop Xan ++ + prop Xsp + prop Xan ++ + prop Xps + prop Xwd + + prop Xan + prop Xan + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xsp + + prop Any + prop Xsp ++ + prop L& + prop Xsp ++ + prop L + prop Xsp ++ + prop Lu + prop Xsp + + prop Han + prop Xsp ++ + prop Xan + prop Xsp + + prop Xsp + notprop Xsp ++ + prop Xsp + prop Xsp + + prop Xps + prop Xwd ++ + prop Xsp + prop Xsp + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop Any + prop Xwd + + prop L& + prop Xwd + + prop L + prop Xwd + + prop Lu + prop Xwd + + prop Han + prop Xwd + + prop Xan + prop Xwd ++ + prop Xsp + prop Xwd ++ + prop Xps + prop Xwd + + prop Xwd + prop Xwd ++ + notprop Xwd + prop Xwd + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xuc + + prop Any + prop Xuc + + prop L& + prop Xuc + + prop L + prop Xuc + + prop Lu + prop Xuc + + prop Han + prop Xuc + + prop Xan + prop Xuc + + prop Xsp + prop Xuc + + prop Xps + prop Xwd + + prop Xuc + prop Xuc + + prop Xuc + prop Xuc ++ + notprop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx +------------------------------------------------------------------ + Bra + prop N ++ + prop Ll + prop N + + prop Nd + prop N + + notprop Nd + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop L + prop Xan + + prop N + prop Xan ++ + prop C + prop Xan + + notprop L + notprop Xan ++ + prop N + prop Xan + + notprop C + Ket + End +------------------------------------------------------------------ + +/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop L + + prop Xan + prop N + + prop Xan + prop C ++ + prop Xan + notprop L + + prop Xan + prop N + + prop Xan + notprop C + + prop Xan + prop L ++ + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Lu + prop Xan + + prop Nd + prop Xan ++ + prop Cc + prop Xan + + notprop Ll + notprop Xan ++ + prop No + prop Xan + + notprop Cf + Ket + End +------------------------------------------------------------------ + +/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop Lu + + prop Xan + prop Nd + + prop Xan + prop Cs ++ + prop Xan + notprop Lt + + prop Xan + prop Nl + + prop Xan + notprop Cc + + prop Xan + prop Lt ++ + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop P + prop Xwd + + prop Po + prop Xwd ++ + prop Xsp + prop Xan ++ + prop Xsp + prop Xsp ++ + prop Xan + prop Xsp ++ + prop Xwd + Ket + End +------------------------------------------------------------------ + +/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + notprop P + notprop Xwd + + prop Po + prop Xwd + + notprop Xsp + notprop Xan + + prop Xsp + prop Xsp + + notprop Xan + prop Xsp + + notprop Xwd + Ket + End +------------------------------------------------------------------ + +/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop Po + prop Xwd ++ + prop Pc + notprop Xwd + + prop Po + notprop Xwd + + prop Pc + prop Xwd + + notprop Po + prop Xwd + + notprop Pc + Ket + End +------------------------------------------------------------------ + +/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop Nl + + prop Xan + notprop Nl + + prop Xan + prop Nl ++ + notprop Xan + notprop Nl + + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Nl + notprop Xan ++ + prop Nl + prop Xan + + notprop Nl + notprop Xan + + notprop Nl + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Nd + notprop Xan ++ + prop Nd + prop Xan + + notprop Nd + notprop Xan + + notprop Nd + Ket + End +------------------------------------------------------------------ + +/-- End auto-possessification tests --/ + +/\w+/8CWBZ +------------------------------------------------------------------ + Bra + Callout 255 0 3 + prop Xwd ++ + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ + abcd +--->abcd + +0 ^ \w+ + +3 ^ ^ + 0: abcd + +/[\p{N}]?+/BZO +------------------------------------------------------------------ + Bra + [\p{N}]?+ + Ket + End +------------------------------------------------------------------ + +/[\p{L}ab]{2,3}+/BZO +------------------------------------------------------------------ + Bra + [ab\p{L}]{2,3}+ + Ket + End +------------------------------------------------------------------ + +/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx +------------------------------------------------------------------ + Bra + \D+ + extuni + \d+ + extuni + \S+ + extuni + \s+ + extuni + \W+ + extuni + \w+ + extuni + AllAny+ + extuni + \R+ + extuni + \H+ + extuni + \h+ + extuni + \V+ + extuni + \v+ + extuni + a+ + extuni + \x0a+ + extuni + Any+ + extuni + Ket + End +------------------------------------------------------------------ + +/.+\X/BZxs +------------------------------------------------------------------ + Bra + AllAny+ + extuni + Ket + End +------------------------------------------------------------------ + +/\X+$/BZxm +------------------------------------------------------------------ + Bra + extuni+ + /m $ + Ket + End +------------------------------------------------------------------ + +/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx +------------------------------------------------------------------ + Bra + extuni+ + \D + extuni+ + \d + extuni+ + \S + extuni+ + \s + extuni+ + \W + extuni+ + \w + extuni+ + Any + extuni+ + AllAny + extuni+ + \R + extuni+ + \H + extuni+ + \h + extuni+ + \V + extuni+ + \v + extuni+ + extuni + extuni+ + \Z + extuni++ + \z + extuni+ + $ + Ket + End +------------------------------------------------------------------ + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ +------------------------------------------------------------------ + Bra + prop Nd ++ + prop Xsp {0,5}+ + = + prop Xsp *+ + notprop Xsp ? + = + prop Xwd {0,4}+ + notprop Xwd *+ + Ket + End +------------------------------------------------------------------ /-- End of testinput7 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput8 b/ext/pcre/pcrelib/testdata/testoutput8 index 73e0eae87..bb68d3e64 100644 --- a/ext/pcre/pcrelib/testdata/testoutput8 +++ b/ext/pcre/pcrelib/testdata/testoutput8 @@ -1,5 +1,8 @@ -/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(). - The -dfa flag must be used with pcretest when running it. --/ +/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(), + excluding UTF and Unicode property support. The -dfa flag must be used with + pcretest when running it. --/ + +< forbid 8W /abc/ abc @@ -25,7 +28,7 @@ No match ab No match -/a*/ +/a*/O a 0: a 1: @@ -49,7 +52,7 @@ No match 16: a 17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -341,7 +344,7 @@ No match axyzq No match -/[^a]+/ +/[^a]+/O bac 0: b bcdefax @@ -359,7 +362,7 @@ No match aaaaa No match -/[^a]*/ +/[^a]*/O bac 0: b 1: @@ -380,7 +383,7 @@ No match aaaaa 0: -/[^a]{3,5}/ +/[^a]{3,5}/O xyz 0: xyz awxyza @@ -408,29 +411,18 @@ No match /\d*/ 1234b567 0: 1234 - 1: 123 - 2: 12 - 3: 1 - 4: xyz 0: /\D*/ a1234b567 0: a - 1: xyz 0: xyz - 1: xy - 2: x - 3: /\d+/ ab1234c56 0: 1234 - 1: 123 - 2: 12 - 3: 1 *** Failers No match xyz @@ -439,19 +431,8 @@ No match /\D+/ ab123c56 0: ab - 1: a *** Failers 0: *** Failers - 1: *** Failer - 2: *** Faile - 3: *** Fail - 4: *** Fai - 5: *** Fa - 6: *** F - 7: *** - 8: *** - 9: ** -10: * 789 No match @@ -478,9 +459,6 @@ No match /a+/ aaaa 0: aaaa - 1: aaa - 2: aa - 3: a /^.*xyz/ xyz @@ -886,9 +864,6 @@ No match 0: aaabcd 0: aaa - 1: aa - 2: a - 3: xyz 0: xyz 1: @@ -985,7 +960,7 @@ Partial match: abc xyzfo\P No match foob\P\>2 -Partial match: foob +Partial match at offset 3: foob foobar...\R\P\>4 0: ar xyzfo\P @@ -1577,18 +1552,6 @@ No match /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} - 1: .^$(*+)|{?,? - 2: .^$(*+)|{?, - 3: .^$(*+)|{? - 4: .^$(*+)|{ - 5: .^$(*+)| - 6: .^$(*+) - 7: .^$(*+ - 8: .^$(* - 9: .^$( -10: .^$ -11: .^ -12: . /^a*\w/ z @@ -1744,38 +1707,16 @@ No match /foo(?!bar)(.*)/ foobar is foolish see? 0: foolish see? - 1: foolish see - 2: foolish se - 3: foolish s - 4: foolish - 5: foolish - 6: foolis - 7: fooli - 8: fool - 9: foo /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc 0: rowbar etc - 1: rowbar et - 2: rowbar e - 3: rowbar - 4: rowbar barrel 0: barrel - 1: barre - 2: barr - 3: bar 2barrel 0: 2barrel - 1: 2barre - 2: 2barr - 3: 2bar A barrel 0: A barrel - 1: A barre - 2: A barr - 3: A bar /^(\D*)(?=\d)(?!123)/ abc456 @@ -1820,7 +1761,7 @@ No match the abc No match -/^[ab]{1,3}(ab*|b)/ +/^[ab]{1,3}(ab*|b)/O aabbbbb 0: aabbbbb 1: aabbbb @@ -1829,7 +1770,7 @@ No match 4: aab 5: aa -/^[ab]{1,3}?(ab*|b)/ +/^[ab]{1,3}?(ab*|b)/O aabbbbb 0: aabbbbb 1: aabbbb @@ -1838,7 +1779,7 @@ No match 4: aab 5: aa -/^[ab]{1,3}?(ab*?|b)/ +/^[ab]{1,3}?(ab*?|b)/O aabbbbb 0: aabbbbb 1: aabbbb @@ -1847,7 +1788,7 @@ No match 4: aab 5: aa -/^[ab]{1,3}(ab*?|b)/ +/^[ab]{1,3}(ab*?|b)/O aabbbbb 0: aabbbbb 1: aabbbb @@ -2705,10 +2646,6 @@ No match /\0*/ \0\0\0\0 0: \x00\x00\x00\x00 - 1: \x00\x00\x00 - 2: \x00\x00 - 3: \x00 - 4: /A\x0{2,3}Z/ The A\x0\x0Z @@ -2760,56 +2697,14 @@ No match /([^.]*)\.([^:]*):[T ]+(.*)/ track1.title:TBlah blah blah 0: track1.title:TBlah blah blah - 1: track1.title:TBlah blah bla - 2: track1.title:TBlah blah bl - 3: track1.title:TBlah blah b - 4: track1.title:TBlah blah - 5: track1.title:TBlah blah - 6: track1.title:TBlah bla - 7: track1.title:TBlah bl - 8: track1.title:TBlah b - 9: track1.title:TBlah -10: track1.title:TBlah -11: track1.title:TBla -12: track1.title:TBl -13: track1.title:TB -14: track1.title:T /([^.]*)\.([^:]*):[T ]+(.*)/i track1.title:TBlah blah blah 0: track1.title:TBlah blah blah - 1: track1.title:TBlah blah bla - 2: track1.title:TBlah blah bl - 3: track1.title:TBlah blah b - 4: track1.title:TBlah blah - 5: track1.title:TBlah blah - 6: track1.title:TBlah bla - 7: track1.title:TBlah bl - 8: track1.title:TBlah b - 9: track1.title:TBlah -10: track1.title:TBlah -11: track1.title:TBla -12: track1.title:TBl -13: track1.title:TB -14: track1.title:T /([^.]*)\.([^:]*):[t ]+(.*)/i track1.title:TBlah blah blah 0: track1.title:TBlah blah blah - 1: track1.title:TBlah blah bla - 2: track1.title:TBlah blah bl - 3: track1.title:TBlah blah b - 4: track1.title:TBlah blah - 5: track1.title:TBlah blah - 6: track1.title:TBlah bla - 7: track1.title:TBlah bl - 8: track1.title:TBlah b - 9: track1.title:TBlah -10: track1.title:TBlah -11: track1.title:TBla -12: track1.title:TBl -13: track1.title:TB -14: track1.title:T /^[W-c]+$/ WXY_^abc @@ -2882,13 +2777,10 @@ No match 0: b c::b 0: :: - 1: : /[-az]+/ az- 0: az- - 1: az - 2: a *** Failers 0: a b @@ -2897,8 +2789,6 @@ No match /[az-]+/ za- 0: za- - 1: za - 2: z *** Failers 0: a b @@ -2907,8 +2797,6 @@ No match /[a\-z]+/ a-z 0: a-z - 1: a- - 2: a *** Failers 0: a b @@ -2917,20 +2805,10 @@ No match /[a-z]+/ abcdxyz 0: abcdxyz - 1: abcdxy - 2: abcdx - 3: abcd - 4: abc - 5: ab - 6: a /[\d-]+/ 12-34 0: 12-34 - 1: 12-3 - 2: 12- - 3: 12 - 4: 1 *** Failers No match aaa @@ -2939,11 +2817,6 @@ No match /[\d-z]+/ 12-34z 0: 12-34z - 1: 12-34 - 2: 12-3 - 3: 12- - 4: 12 - 5: 1 *** Failers No match aaa @@ -3027,18 +2900,22 @@ No match abc\100\60 0: abc@0 -/abc\81/ - abc\081 - 0: abc\x0081 - abc\0\x38\x31 - 0: abc\x0081 - -/abc\91/ - abc\091 - 0: abc\x0091 - abc\0\x39\x31 - 0: abc\x0091 - +/^A\8B\9C$/ + A8B9C + 0: A8B9C + *** Failers +No match + A\08B\09C +No match + +/^[A\8B\9C]+$/ + A8B9C + 0: A8B9C + *** Failers +No match + A8B9C\x00 +No match + /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ abcdefghijk\12S 0: abcdefghijk\x0aS @@ -3077,16 +2954,13 @@ No match 1: baNOTccc 2: baNOTcc 3: baNOTc - 4: baNOT baNOTcccd 0: baNOTccc 1: baNOTcc 2: baNOTc - 3: baNOT baNOTccd 0: baNOTcc 1: baNOTc - 2: baNOT bacccd 0: baccc *** Failers @@ -3096,7 +2970,6 @@ No match 3: *** Fail 4: *** Fai 5: *** Fa - 6: *** F anything No match b\bc @@ -3115,23 +2988,14 @@ No match /[^a]+/ AAAaAbc 0: AAA - 1: AA - 2: A /[^a]+/i AAAaAbc 0: bc - 1: b /[^a]+/ bbb\nccc 0: bbb\x0accc - 1: bbb\x0acc - 2: bbb\x0ac - 3: bbb\x0a - 4: bbb - 5: bb - 6: b /[^k]$/ abc @@ -3208,20 +3072,8 @@ No match /(\.\d\d[1-9]?)\d+/ 1.230003938 0: .230003938 - 1: .23000393 - 2: .2300039 - 3: .230003 - 4: .23000 - 5: .2300 - 6: .230 1.875000282 0: .875000282 - 1: .87500028 - 2: .8750002 - 3: .875000 - 4: .87500 - 5: .8750 - 6: .875 1.235 0: .235 @@ -3243,10 +3095,6 @@ No match /\b(foo)\s+(\w+)/i Food is on the foo table 0: foo table - 1: foo tabl - 2: foo tab - 3: foo ta - 4: foo t /foo(.*)bar/ The food is under the bar in the barn. @@ -3258,9 +3106,9 @@ No match 0: food is under the bar in the bar 1: food is under the bar -/(.*)(\d*)/ +/(.*)(\d*)/O I have 2 numbers: 53147 -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: I have 2 numbers: 531 @@ -3287,15 +3135,11 @@ Matched, but too many subsidiary matches /(.*)(\d+)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 - 1: I have 2 numbers: 5314 - 2: I have 2 numbers: 531 - 3: I have 2 numbers: 53 - 4: I have 2 numbers: 5 - 5: I have 2 + 1: I have 2 -/(.*?)(\d*)/ +/(.*?)(\d*)/O I have 2 numbers: 53147 -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: I have 2 numbers: 531 @@ -3322,11 +3166,7 @@ Matched, but too many subsidiary matches /(.*?)(\d+)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 - 1: I have 2 numbers: 5314 - 2: I have 2 numbers: 531 - 3: I have 2 numbers: 53 - 4: I have 2 numbers: 5 - 5: I have 2 + 1: I have 2 /(.*)(\d+)$/ I have 2 numbers: 53147 @@ -3738,13 +3578,8 @@ No match 0: a ab 0: ab - 1: a abbbb 0: abbbb - 1: abbb - 2: abb - 3: ab - 4: a *** Failers 0: a bbbbb @@ -3930,19 +3765,8 @@ No match /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 0: .230003938 - 1: .23000393 - 2: .2300039 - 3: .230003 - 4: .23000 - 5: .2300 - 6: .230 1.875000282 0: .875000282 - 1: .87500028 - 2: .8750002 - 3: .875000 - 4: .87500 - 5: .8750 *** Failers No match 1.235 @@ -4561,7 +4385,6 @@ No match /.{3,4}/ abbbbc 0: abbb - 1: abb /ab{0,}bc/ abbbbc @@ -4929,9 +4752,6 @@ No match /[^ab]*/ cde 0: cde - 1: cd - 2: c - 3: /abc/ *** Failers @@ -4966,7 +4786,6 @@ No match /ab*/ xabyabbbz 0: ab - 1: a xayabbbz 0: a @@ -4995,8 +4814,7 @@ No match /a([bc]*)c*/ abc 0: abc - 1: ab - 2: a + 1: a /a([bc]*)(c*d)/ abcd @@ -5033,10 +4851,6 @@ No match /[a-zA-Z_][a-zA-Z0-9_]*/ alpha 0: alpha - 1: alph - 2: alp - 3: al - 4: a /^a(bc+|b[eh])g|.h$/ abh @@ -5079,8 +4893,6 @@ No match /(.*)c(.*)/ abcde 0: abcde - 1: abcd - 2: abc /\((.*), (.*)\)/ (a, b) @@ -5395,9 +5207,6 @@ No match /[^ab]*/i CDE 0: CDE - 1: CD - 2: C - 3: /abc/i @@ -5427,7 +5236,6 @@ No match /ab*/i XABYABBBZ 0: AB - 1: A XAYABBBZ 0: A @@ -5458,8 +5266,7 @@ No match /a([bc]*)c*/i ABC 0: ABC - 1: AB - 2: A + 1: A /a([bc]*)(c*d)/i ABCD @@ -5490,10 +5297,6 @@ No match /[a-zA-Z_][a-zA-Z0-9_]*/i ALPHA 0: ALPHA - 1: ALPH - 2: ALP - 3: AL - 4: A /^a(bc+|b[eh])g|.h$/i ABH @@ -5546,8 +5349,6 @@ No match /(.*)c(.*)/i ABCDE 0: ABCDE - 1: ABCD - 2: ABC /\((.*), (.*)\)/i (A, B) @@ -6052,17 +5853,14 @@ No match /([[:]+)/ a:[b]: 0: :[ - 1: : /([[=]+)/ a=[b]= 0: =[ - 1: = /([[.]+)/ a.[b]. 0: .[ - 1: . /((?>a+)b)/ aaab @@ -6196,26 +5994,12 @@ No match /a*/g abbab 0: a - 1: 0: 0: 0: a - 1: 0: 0: -/^[a-\d]/ - abcde - 0: a - -things - 0: - - 0digit - 0: 0 - *** Failers -No match - bcdef -No match - /^[\d-a]/ abcde 0: a @@ -6231,36 +6015,22 @@ No match /[[:space:]]+/ > \x09\x0a\x0c\x0d\x0b< 0: \x09\x0a\x0c\x0d\x0b - 1: \x09\x0a\x0c\x0d - 2: \x09\x0a\x0c - 3: \x09\x0a - 4: \x09 - 5: /[[:blank:]]+/ > \x09\x0a\x0c\x0d\x0b< 0: \x09 - 1: /[\s]+/ > \x09\x0a\x0c\x0d\x0b< - 0: \x09\x0a\x0c\x0d - 1: \x09\x0a\x0c - 2: \x09\x0a - 3: \x09 - 4: + 0: \x09\x0a\x0c\x0d\x0b /\s+/ > \x09\x0a\x0c\x0d\x0b< - 0: \x09\x0a\x0c\x0d - 1: \x09\x0a\x0c - 2: \x09\x0a - 3: \x09 - 4: + 0: \x09\x0a\x0c\x0d\x0b /ab/x ab -No match + 0: ab /(?!\A)x/m a\nxb\n @@ -6563,8 +6333,6 @@ Partial match: 123 /Content-Type\x3A[^\r\n]{6,}/ Content-Type:xxxxxyyy 0: Content-Type:xxxxxyyy - 1: Content-Type:xxxxxyy - 2: Content-Type:xxxxxy /Content-Type\x3A[^\r\n]{6,}z/ Content-Type:xxxxxyyyz @@ -6661,66 +6429,22 @@ No match /.*/<lf> abc\ndef 0: abc - 1: ab - 2: a - 3: abc\rdef 0: abc\x0ddef - 1: abc\x0dde - 2: abc\x0dd - 3: abc\x0d - 4: abc - 5: ab - 6: a - 7: abc\r\ndef 0: abc\x0d - 1: abc - 2: ab - 3: a - 4: \<cr>abc\ndef 0: abc\x0adef - 1: abc\x0ade - 2: abc\x0ad - 3: abc\x0a - 4: abc - 5: ab - 6: a - 7: \<cr>abc\rdef 0: abc - 1: ab - 2: a - 3: \<cr>abc\r\ndef 0: abc - 1: ab - 2: a - 3: \<crlf>abc\ndef 0: abc\x0adef - 1: abc\x0ade - 2: abc\x0ad - 3: abc\x0a - 4: abc - 5: ab - 6: a - 7: \<crlf>abc\rdef 0: abc\x0ddef - 1: abc\x0dde - 2: abc\x0dd - 3: abc\x0d - 4: abc - 5: ab - 6: a - 7: \<crlf>abc\r\ndef 0: abc - 1: ab - 2: a - 3: /\w+(.)(.)?def/s abc\ndef @@ -7033,10 +6757,8 @@ No match /\H*\h+\V?\v{3,4}/ \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a 0: \x09 \xa0X\x0a\x0b\x0c\x0d - 1: \x09 \xa0X\x0a\x0b\x0c \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a 0: \x09 \xa0\x0a\x0b\x0c\x0d - 1: \x09 \xa0\x0a\x0b\x0c \x09\x20\xa0\x0a\x0b\x0c 0: \x09 \xa0\x0a\x0b\x0c ** Failers @@ -7047,7 +6769,6 @@ No match /\H{3,4}/ XY ABCDE 0: ABCD - 1: ABC XY PQR ST 0: PQR @@ -7466,17 +7187,17 @@ Error -16 (item unsupported for DFA matching) xyzabc123pqr 0: 123 xyzabc12\P -Partial match: abc12 +Partial match at offset 6: abc12 xyzabc12\P\P -Partial match: abc12 +Partial match at offset 6: abc12 /\babc\b/ +++abc+++ 0: abc +++ab\P -Partial match: +ab +Partial match at offset 3: +ab +++ab\P\P -Partial match: +ab +Partial match at offset 3: +ab /(?=C)/g+ ABCDECBA @@ -7531,15 +7252,11 @@ No match xxxxabcd\P 0: abcd 0+ - 1: abc xxxxabcd\P\P Partial match: abcd dddxxx\R 0: ddd 0+ xxx - 1: dd - 2: d - 3: xxxxabcd\P\P Partial match: abcd xxx\R @@ -7549,27 +7266,22 @@ Partial match: abcd /abcd*/i xxxxabcd\P 0: abcd - 1: abc xxxxabcd\P\P Partial match: abcd XXXXABCD\P 0: ABCD - 1: ABC XXXXABCD\P\P Partial match: ABCD /abc\d*/ xxxxabc1\P 0: abc1 - 1: abc xxxxabc1\P\P Partial match: abc1 /abc[de]*/ xxxxabcde\P 0: abcde - 1: abcd - 2: abc xxxxabcde\P\P Partial match: abcde @@ -7625,7 +7337,7 @@ Error -16 (item unsupported for DFA matching) /(?<=abc)def/ abc\P\P -Partial match: abc +Partial match at offset 3: abc /abc$/ abc @@ -7684,11 +7396,8 @@ Partial match: abc /.+/ abc\>0 0: abc - 1: ab - 2: a abc\>1 0: bc - 1: b abc\>2 0: c abc\>3 @@ -7811,10 +7520,6 @@ No match /^(?!a){0}\w+/ aaaaa 0: aaaaa - 1: aaaa - 2: aaa - 3: aa - 4: a /(?<=(abc))?xyz/ abcxyz @@ -7846,9 +7551,9 @@ Error -17 (backreference condition or recursion test not supported for DFA match aaaabcde Error -26 (nested recursion at the same subject position) -/(a+)/ +/(a+)/O \O6aaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaa 1: aaa 2: aa @@ -7971,7 +7676,6 @@ Partial match: \x0d Partial match: \x0d\x0d \r\r\r\P 0: \x0d\x0d\x0d - 1: \x0d\x0d \r\r\r\P\P Partial match: \x0d\x0d\x0d @@ -8016,4 +7720,61 @@ Error -30 (invalid data in workspace for DFA restart) 0: xx\xa0xxxxxabcd 1: xx\xa0xxxxxabc +/abcd/ + abcd\O0 +Matched, but offsets vector is too small to show all matches + +/-- These tests show up auto-possessification --/ + +/[ab]*/ + aaaa + 0: aaaa + +/[ab]*?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/[ab]?/ + aaaa + 0: a + +/[ab]??/ + aaaa + 0: a + 1: + +/[ab]+/ + aaaa + 0: aaaa + +/[ab]+?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/[ab]{2,3}/ + aaaa + 0: aaa + +/[ab]{2,3}?/ + aaaa + 0: aaa + 1: aa + +/[ab]{2,}/ + aaaa + 0: aaaa + +/[ab]{2,}?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + /-- End of testinput8 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput9 b/ext/pcre/pcrelib/testdata/testoutput9 index 95cd618dc..efbbf1801 100644 --- a/ext/pcre/pcrelib/testdata/testoutput9 +++ b/ext/pcre/pcrelib/testdata/testoutput9 @@ -1,6 +1,8 @@ /-- This set of tests checks UTF-8 support with the DFA matching functionality - of pcre_dfa_exec(). The -dfa flag must be used with pcretest when running - it. --/ + of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must + be used with pcretest when running it. --/ + +< forbid W /\x{100}ab/8 \x{100}ab @@ -313,13 +315,9 @@ No match /[^a]+/8g bcd 0: bcd - 1: bc - 2: b \x{100}aY\x{256}Z 0: \x{100} 0: Y\x{256}Z - 1: Y\x{256} - 2: Y /^[^a]{2}/8 \x{100}bc @@ -328,8 +326,6 @@ No match /^[^a]{2,}/8 \x{100}bcAa 0: \x{100}bcA - 1: \x{100}bc - 2: \x{100}b /^[^a]{2,}?/8 \x{100}bca @@ -339,13 +335,9 @@ No match /[^a]+/8ig bcd 0: bcd - 1: bc - 2: b \x{100}aY\x{256}Z 0: \x{100} 0: Y\x{256}Z - 1: Y\x{256} - 2: Y /^[^a]{2}/8i \x{100}bc @@ -354,7 +346,6 @@ No match /^[^a]{2,}/8i \x{100}bcAa 0: \x{100}bc - 1: \x{100}b /^[^a]{2,}?/8i \x{100}bca @@ -370,28 +361,18 @@ No match 0: \x{100}\x{100} 0: \x{100} - 1: /\x{100}{0,3}/8 \x{100}\x{100} 0: \x{100}\x{100} - 1: \x{100} - 2: \x{100}\x{100}\x{100}\x{100} 0: \x{100}\x{100}\x{100} - 1: \x{100}\x{100} - 2: \x{100} - 3: /\x{100}*/8 abce 0: \x{100}\x{100}\x{100}\x{100} 0: \x{100}\x{100}\x{100}\x{100} - 1: \x{100}\x{100}\x{100} - 2: \x{100}\x{100} - 3: \x{100} - 4: /\x{100}{1,1}/8 abcd\x{100}\x{100}\x{100}\x{100} @@ -400,15 +381,10 @@ No match /\x{100}{1,3}/8 abcd\x{100}\x{100}\x{100}\x{100} 0: \x{100}\x{100}\x{100} - 1: \x{100}\x{100} - 2: \x{100} /\x{100}+/8 abcd\x{100}\x{100}\x{100}\x{100} 0: \x{100}\x{100}\x{100}\x{100} - 1: \x{100}\x{100}\x{100} - 2: \x{100}\x{100} - 3: \x{100} /\x{100}{3}/8 abcd\x{100}\x{100}\x{100}XX @@ -417,10 +393,8 @@ No match /\x{100}{3,5}/8 abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX 0: \x{100}\x{100}\x{100}\x{100}\x{100} - 1: \x{100}\x{100}\x{100}\x{100} - 2: \x{100}\x{100}\x{100} -/\x{100}{3,}/8 +/\x{100}{3,}/8O abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100} @@ -432,9 +406,9 @@ No match Xyyya\x{100}\x{100}bXzzz 0: X -/\D*/8 +/\D*/8O aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -458,9 +432,9 @@ Matched, but too many subsidiary matches 20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -/\D*/8 +/\D*/8O \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} -Matched, but too many subsidiary matches +Matched, but offsets vector is too small to show all matches 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} 2: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} @@ -507,33 +481,18 @@ Matched, but too many subsidiary matches /\D+/8 12abcd34 0: abcd - 1: abc - 2: ab - 3: a *** Failers 0: *** Failers - 1: *** Failer - 2: *** Faile - 3: *** Fail - 4: *** Fai - 5: *** Fa - 6: *** F - 7: *** - 8: *** - 9: ** -10: * 1234 No match /\D{2,3}/8 12abcd34 0: abc - 1: ab 12ab34 0: ab *** Failers 0: *** - 1: ** 1234 No match 12a34 @@ -556,7 +515,6 @@ No match /\d+/8 12abcd34 0: 12 - 1: 1 *** Failers No match @@ -565,7 +523,6 @@ No match 0: 12 1234abcd 0: 123 - 1: 12 *** Failers No match 1.4 @@ -585,30 +542,18 @@ No match /\S+/8 12abcd34 0: 12abcd34 - 1: 12abcd3 - 2: 12abcd - 3: 12abc - 4: 12ab - 5: 12a - 6: 12 - 7: 1 *** Failers 0: *** - 1: ** - 2: * \ \ No match /\S{2,3}/8 12abcd34 0: 12a - 1: 12 1234abcd 0: 123 - 1: 12 *** Failers 0: *** - 1: ** \ \ No match @@ -654,15 +599,8 @@ No match /\w+/8 12 34 0: 12 - 1: 1 *** Failers 0: Failers - 1: Failer - 2: Faile - 3: Fail - 4: Fai - 5: Fa - 6: F +++=*! No match @@ -671,10 +609,8 @@ No match 0: ab abcd ce 0: abc - 1: ab *** Failers 0: Fai - 1: Fa a.b.c No match @@ -693,26 +629,18 @@ No match /\W+/8 12====34 0: ==== - 1: === - 2: == - 3: = *** Failers 0: *** - 1: *** - 2: ** - 3: * abcd No match /\W{2,3}/8 ab====cd 0: === - 1: == ab==cd 0: == *** Failers 0: *** - 1: ** a.b.c No match @@ -825,8 +753,6 @@ No match 0: \x{200} ab\x{200}\x{100}\x{200}\x{100}cd 0: \x{200}\x{100}\x{200} - 1: \x{200}\x{100} - 2: \x{200} *** Failers No match @@ -849,8 +775,6 @@ No match 0: \x{200} ab\x{200}\x{100}\x{200}\x{100}cd 0: \x{200}\x{100}\x{200} - 1: \x{200}\x{100} - 2: \x{200} *** Failers No match @@ -1126,21 +1050,21 @@ No match a\r No match -/\h+\V?\v{3,4}/8 +/\h+\V?\v{3,4}/8O \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} -/\V?\v{3,4}/8 +/\V?\v{3,4}/8O \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a 0: X\x{0a}\x{0b}\x{0c}\x{0d} 1: X\x{0a}\x{0b}\x{0c} -/\h+\V?\v{3,4}/8 +/\h+\V?\v{3,4}/8O >\x09\x20\x{a0}X\x0a\x0a\x0a< 0: \x{09} \x{a0}X\x{0a}\x{0a}\x{0a} -/\V?\v{3,4}/8 +/\V?\v{3,4}/8O >\x09\x20\x{a0}X\x0a\x0a\x0a< 0: X\x{0a}\x{0a}\x{0a} @@ -1154,7 +1078,7 @@ No match \x{a0} X\x0a No match -/\H*\h+\V?\v{3,4}/8 +/\H*\h+\V?\v{3,4}/8O \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} @@ -1178,7 +1102,7 @@ No match \x{2009} X\x0a No match -/\H*\h+\V?\v{3,4}/8 +/\H*\h+\V?\v{3,4}/8O \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d} 1: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c} @@ -1279,34 +1203,28 @@ No match /abcd*/8 xxxxabcd\P 0: abcd - 1: abc xxxxabcd\P\P Partial match: abcd /abcd*/i8 xxxxabcd\P 0: abcd - 1: abc xxxxabcd\P\P Partial match: abcd XXXXABCD\P 0: ABCD - 1: ABC XXXXABCD\P\P Partial match: ABCD /abc\d*/8 xxxxabc1\P 0: abc1 - 1: abc xxxxabc1\P\P Partial match: abc1 /abc[de]*/8 xxxxabcde\P 0: abcde - 1: abcd - 2: abc xxxxabcde\P\P Partial match: abcde @@ -1340,7 +1258,6 @@ Partial match: \x{0d} Partial match: \x{0d}\x{0d} \r\r\r\P 0: \x{0d}\x{0d}\x{0d} - 1: \x{0d}\x{0d} \r\r\r\P\P Partial match: \x{0d}\x{0d}\x{0d} @@ -1366,6 +1283,5 @@ Partial match: \x{0d}\x{0d}\x{0d} /[^\x{100}]+/8 \x{100}\x{101}X 0: \x{101}X - 1: \x{101} /-- End of testinput9 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutputEBC b/ext/pcre/pcrelib/testdata/testoutputEBC new file mode 100644 index 000000000..abbfdc43f --- /dev/null +++ b/ext/pcre/pcrelib/testdata/testoutputEBC @@ -0,0 +1,182 @@ +/-- This is a specialized test for checking, when PCRE is compiled with the +EBCDIC option but in an ASCII environment, that newline and white space +functionality is working. It catches cases where explicit values such as 0x0a +have been used instead of names like CHAR_LF. Needless to say, it is not a +genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash +must be in EBCDIC code. In data, newlines and other spacing characters must be +in EBCDIC, but can be specified as escapes. --/ + +/-- Test default newline and variations --/ + +/^A/m + ABC + 0: A + 12\x15ABC + 0: A + +/^A/m<any> + 12\x15ABC + 0: A + 12\x0dABC + 0: A + 12\x0d\x15ABC + 0: A + 12\x25ABC + 0: A + +/^A/m<anycrlf> + 12\x15ABC + 0: A + 12\x0dABC + 0: A + 12\x0d\x15ABC + 0: A + ** Fail +No match + 12\x25ABC +No match + +/-- Test \h --/ + +/^A\ˆ/ + A B + 0: A\x20 + +/-- Test \H --/ + +/^A\È/ + AB + 0: AB + ** Fail +No match + A B +No match + +/-- Test \R --/ + +/^A\Ù/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \v --/ + +/^A\¥/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \V --/ + +/^A\å/ + A B + 0: A\x20 + ** Fail +No match + A\x15B +No match + A\x0dB +No match + A\x25B +No match + A\x0bB +No match + A\x0cB +No match + +/-- For repeated items, use an atomic group so that the output is the same +for DFA matching (otherwise it may show multiple matches). --/ + +/-- Test \h+ --/ + +/^A(?>\ˆ+)/ + A B + 0: A\x20 + +/-- Test \H+ --/ + +/^A(?>\È+)/ + AB + 0: AB + ** Fail +No match + A B +No match + +/-- Test \R+ --/ + +/^A(?>\Ù+)/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \v+ --/ + +/^A(?>\¥+)/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \V+ --/ + +/^A(?>\å+)/ + A B + 0: A\x20B + ** Fail +No match + A\x15B +No match + A\x0dB +No match + A\x25B +No match + A\x0bB +No match + A\x0cB +No match + +/-- End --/ diff --git a/ext/pcre/pcrelib/testdata/wintestinput3 b/ext/pcre/pcrelib/testdata/wintestinput3 new file mode 100644 index 000000000..04e76a6dc --- /dev/null +++ b/ext/pcre/pcrelib/testdata/wintestinput3 @@ -0,0 +1,91 @@ +/^[\w]+/ + *** Failers + École + +/^[\w]+/Lfrench + École + +/^[\w]+/ + *** Failers + École + +/^[\W]+/ + École + +/^[\W]+/Lfrench + *** Failers + École + +/[\b]/ + \b + *** Failers + a + +/[\b]/Lfrench + \b + *** Failers + a + +/^\w+/ + *** Failers + École + +/^\w+/Lfrench + École + +/(.+)\b(.+)/ + École + +/(.+)\b(.+)/Lfrench + *** Failers + École + +/École/i + École + *** Failers + école + +/École/iLfrench + École + école + +/\w/IS + +/\w/ISLfrench + +/^[\xc8-\xc9]/iLfrench + École + école + +/^[\xc8-\xc9]/Lfrench + École + *** Failers + école + +/\W+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[\W]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[^[:alpha:]]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/\w+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[\w]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench + +/ End of testinput3 / diff --git a/ext/pcre/pcrelib/testdata/wintestoutput3 b/ext/pcre/pcrelib/testdata/wintestoutput3 new file mode 100644 index 000000000..008800706 --- /dev/null +++ b/ext/pcre/pcrelib/testdata/wintestoutput3 @@ -0,0 +1,166 @@ +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfrench + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfrench + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfrench + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfrench + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfrench + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfrench + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfrench +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting byte set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + ƒ Š Œ Ž š œ ž Ÿ ª ² ³ µ ¹ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö + Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý + þ ÿ + +/^[\xc8-\xc9]/iLfrench + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfrench + École + 0: É + *** Failers +No match + école +No match + +/\W+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench +------------------------------------------------------------------ + Bra + [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff] + [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/ End of testinput3 / diff --git a/ext/pcre/pcrelib/ucp.h b/ext/pcre/pcrelib/ucp.h index 21039106e..d8b34bfcc 100644 --- a/ext/pcre/pcrelib/ucp.h +++ b/ext/pcre/pcrelib/ucp.h @@ -11,7 +11,10 @@ should always be at the end of each enum, for backwards compatibility. IMPORTANT: Note also that the specific numeric values of the enums have to be the same as the values that are generated by the maint/MultiStage2.py script, -where the equivalent property descriptive names are listed in vectors. */ +where the equivalent property descriptive names are listed in vectors. + +ALSO: The specific values of the first two enums are assumed for the table +called catposstab in pcre_compile.c. */ /* These are the general character categories. */ diff --git a/ext/pcre/tests/bug37911.phpt b/ext/pcre/tests/bug37911.phpt index f7881191b..2b7481a46 100644 --- a/ext/pcre/tests/bug37911.phpt +++ b/ext/pcre/tests/bug37911.phpt @@ -37,5 +37,5 @@ array(3) { string(4) "blub" } -Warning: preg_replace_callback(): Numeric named subpatterns are not allowed in %sbug37911.php on line 14 +Warning: preg_replace_callback(): Compilation failed: group name must start with a non-digit at offset %d in %sbug37911.php on line %d NULL diff --git a/ext/pcre/tests/grep2.phpt b/ext/pcre/tests/grep2.phpt index 0cf8d4aeb..1a8476c39 100644 --- a/ext/pcre/tests/grep2.phpt +++ b/ext/pcre/tests/grep2.phpt @@ -40,6 +40,12 @@ array(1) { string(1) "1" } bool(true) -array(0) { +array(3) { + [5]=> + string(1) "a" + ["xyz"]=> + string(2) "q6" + [6]=> + string(3) "h20" } -bool(true) +bool(false) diff --git a/ext/pcre/tests/match_flags3.phpt b/ext/pcre/tests/match_flags3.phpt index f22205e3d..84deb0b80 100644 --- a/ext/pcre/tests/match_flags3.phpt +++ b/ext/pcre/tests/match_flags3.phpt @@ -42,5 +42,5 @@ array(1) { } } -Warning: preg_match(): Numeric named subpatterns are not allowed in %smatch_flags3.php on line 14 +Warning: preg_match(): Compilation failed: group name must start with a non-digit at offset %d in %smatch_flags3.php on line %d bool(false) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 3ede0ec20..d17867d1f 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -196,7 +196,7 @@ static char *dsn_from_uri(char *uri, char *buf, size_t buflen TSRMLS_DC) /* {{{ } /* }}} */ -/* {{{ proto void PDO::__construct(string dsn, string username, string passwd [, array options]) +/* {{{ proto void PDO::__construct(string dsn[, string username[, string passwd [, array options]]]) */ static PHP_METHOD(PDO, dbh_constructor) { @@ -1226,7 +1226,7 @@ static PHP_METHOD(PDO, getAvailableDrivers) /* }}} */ /* {{{ arginfo */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_pdo___construct, 0, 0, 3) +ZEND_BEGIN_ARG_INFO_EX(arginfo_pdo___construct, 0, 0, 1) ZEND_ARG_INFO(0, dsn) ZEND_ARG_INFO(0, username) ZEND_ARG_INFO(0, passwd) diff --git a/ext/pdo_pgsql/tests/bug62479.phpt b/ext/pdo_pgsql/tests/bug62479.phpt index 2e19f1500..a12bb8d1f 100644 --- a/ext/pdo_pgsql/tests/bug62479.phpt +++ b/ext/pdo_pgsql/tests/bug62479.phpt @@ -30,7 +30,7 @@ $testQuery = 'SELECT 1 as verification'; // Create temp user with space in password $sql = sprintf($template, 'my password'); $pdo->query($sql); -$testConn = new PDO($_ENV['PDOTEST_DSN'], $user, "my password"); +$testConn = new PDO($conf['ENV']['PDOTEST_DSN'], $user, "my password"); $result = $testConn->query($testQuery)->fetch(); $check = $result[0]; var_dump($check); @@ -42,7 +42,7 @@ $pdo->query($dropUser); $sql = sprintf($template, "my pass''word"); $pdo->query($sql); -$testConn = new PDO($_ENV['PDOTEST_DSN'], $user, "my pass'word"); +$testConn = new PDO($conf['ENV']['PDOTEST_DSN'], $user, "my pass'word"); $result = $testConn->query($testQuery)->fetch(); $check = $result[0]; var_dump($check); diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 20b281e6c..95cb8f6cf 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -37,6 +37,9 @@ #include "ext/standard/php_standard.h" #include "ext/standard/php_smart_str.h" #include "ext/ereg/php_regex.h" +#ifdef PHP_WIN32 +# include "win32/time.h" +#endif #undef PACKAGE_BUGREPORT #undef PACKAGE_NAME diff --git a/ext/readline/tests/libedit_info_001.phpt b/ext/readline/tests/libedit_info_001.phpt index e30047738..1d79f4ad0 100644 --- a/ext/readline/tests/libedit_info_001.phpt +++ b/ext/readline/tests/libedit_info_001.phpt @@ -1,8 +1,9 @@ --TEST-- readline_info(): Basic test --SKIPIF-- -<?php if (!extension_loaded("readline")) die("skip"); ?> +<?php if (!extension_loaded("readline")) die("skip"); if (READLINE_LIB != "libedit") die("skip libedit only"); +?> --FILE-- <?php diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 4d5a18b36..47140436e 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -145,10 +145,12 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC) if (fstat(data->fd, &sbuf)) { close(data->fd); + data->fd = -1; return; } if (S_ISLNK(sbuf.st_mode) && php_check_open_basedir(buf TSRMLS_CC)) { close(data->fd); + data->fd = -1; return; } } diff --git a/ext/session/session.c b/ext/session/session.c index e16b79f58..38aee7d68 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -1297,6 +1297,49 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */ #define COOKIE_SECURE "; secure" #define COOKIE_HTTPONLY "; HttpOnly" +/* + * Remove already sent session ID cookie. + * It must be directly removed from SG(sapi_header) because sapi_add_header_ex() + * removes all of matching cookie. i.e. It deletes all of Set-Cookie headers. + */ +static void php_session_remove_cookie(TSRMLS_D) { + sapi_header_struct *header; + zend_llist *l = &SG(sapi_headers).headers; + zend_llist_element *next; + zend_llist_element *current; + char *session_cookie, *e_session_name; + int session_cookie_len, len = sizeof("Set-Cookie")-1; + + e_session_name = php_url_encode(PS(session_name), strlen(PS(session_name)), NULL); + spprintf(&session_cookie, 0, "Set-Cookie: %s=", e_session_name); + efree(e_session_name); + + session_cookie_len = strlen(session_cookie); + current = l->head; + while (current) { + header = (sapi_header_struct *)(current->data); + next = current->next; + if (header->header_len > len && header->header[len] == ':' + && !strncmp(header->header, session_cookie, session_cookie_len)) { + if (current->prev) { + current->prev->next = next; + } else { + l->head = next; + } + if (next) { + next->prev = current->prev; + } else { + l->tail = current->prev; + } + sapi_free_header(header); + efree(current); + --l->count; + } + current = next; + } + efree(session_cookie); +} + static void php_session_send_cookie(TSRMLS_D) /* {{{ */ { smart_str ncookie = {0}; @@ -1365,8 +1408,7 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */ smart_str_0(&ncookie); - /* 'replace' must be 0 here, else a previous Set-Cookie - header, probably sent with setcookie() will be replaced! */ + php_session_remove_cookie(TSRMLS_C); /* remove already sent session ID cookie */ sapi_add_header_ex(ncookie.c, ncookie.len, 0, 0 TSRMLS_CC); } /* }}} */ diff --git a/ext/session/tests/bug60634.phpt b/ext/session/tests/bug60634.phpt index e2dfd15b3..86dcb1152 100644 --- a/ext/session/tests/bug60634.phpt +++ b/ext/session/tests/bug60634.phpt @@ -43,3 +43,4 @@ echo "um, hi\n"; --EXPECTF-- write: goodbye cruel world close: goodbye cruel world + diff --git a/ext/session/tests/bug60634_error_4.phpt b/ext/session/tests/bug60634_error_4.phpt index f21d077b5..d0b5786af 100644 --- a/ext/session/tests/bug60634_error_4.phpt +++ b/ext/session/tests/bug60634_error_4.phpt @@ -49,3 +49,4 @@ Stack trace: #1 {main} thrown in %s on line %d close: goodbye cruel world + diff --git a/ext/standard/html_tables/html_table_gen.php b/ext/standard/html_tables/html_table_gen.php index 7e7314fa3..68dec133f 100644 --- a/ext/standard/html_tables/html_table_gen.php +++ b/ext/standard/html_tables/html_table_gen.php @@ -80,8 +80,11 @@ static const struct { { "Shift_JIS", cs_sjis }, { "SJIS", cs_sjis }, { "932", cs_sjis }, + { "SJIS-win", cs_sjis }, + { "CP932", cs_sjis }, { "EUCJP", cs_eucjp }, { "EUC-JP", cs_eucjp }, + { "eucJP-win", cs_eucjp }, { "KOI8-R", cs_koi8r }, { "koi8-ru", cs_koi8r }, { "koi8r", cs_koi8r }, diff --git a/ext/standard/math.c b/ext/standard/math.c index 2be049f20..65702ddf1 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -604,43 +604,7 @@ PHP_FUNCTION(pow) return; } - /* make sure we're dealing with numbers */ - convert_scalar_to_number(zbase TSRMLS_CC); - convert_scalar_to_number(zexp TSRMLS_CC); - - /* if both base and exponent were longs, we'll try to get a long out */ - if (Z_TYPE_P(zbase) == IS_LONG && Z_TYPE_P(zexp) == IS_LONG && Z_LVAL_P(zexp) >= 0) { - long l1 = 1, l2 = Z_LVAL_P(zbase), i = Z_LVAL_P(zexp); - - if (i == 0) { - RETURN_LONG(1L); - } else if (l2 == 0) { - RETURN_LONG(0); - } - - /* calculate pow(long,long) in O(log exp) operations, bail if overflow */ - while (i >= 1) { - long overflow; - double dval = 0.0; - - if (i % 2) { - --i; - ZEND_SIGNED_MULTIPLY_LONG(l1,l2,l1,dval,overflow); - if (overflow) RETURN_DOUBLE(dval * pow(l2,i)); - } else { - i /= 2; - ZEND_SIGNED_MULTIPLY_LONG(l2,l2,l2,dval,overflow); - if (overflow) RETURN_DOUBLE((double)l1 * pow(dval,i)); - } - if (i == 0) { - RETURN_LONG(l1); - } - } - } - convert_to_double(zbase); - convert_to_double(zexp); - - RETURN_DOUBLE(pow(Z_DVAL_P(zbase), Z_DVAL_P(zexp))); + pow_function(return_value, zbase, zexp TSRMLS_CC); } /* }}} */ diff --git a/ext/standard/tests/math/pow-operator.phpt b/ext/standard/tests/math/pow-operator.phpt new file mode 100644 index 000000000..f80cae196 --- /dev/null +++ b/ext/standard/tests/math/pow-operator.phpt @@ -0,0 +1,22 @@ +--TEST-- +Various pow() tests +--FILE-- +<?php // $Id$ + +$x = 2; +$x **= 3; + +$tests = <<<TESTS + -3 ** 2 === -9 + (-3) **2 === 9 + 2 ** 3 ** 2 === 512 + (2 ** 3) ** 2 === 64 + $x === 8 +TESTS; + + echo "On failure, please mail result to php-dev@lists.php.net\n"; + include(dirname(__FILE__) . '/../../../../tests/quicktester.inc'); + +--EXPECT-- +On failure, please mail result to php-dev@lists.php.net +OK diff --git a/ext/standard/tests/math/pow_variation1.phpt b/ext/standard/tests/math/pow_variation1.phpt index df511906b..5576e5b49 100644 --- a/ext/standard/tests/math/pow_variation1.phpt +++ b/ext/standard/tests/math/pow_variation1.phpt @@ -149,7 +149,7 @@ int(0) int(0) -- Iteration 19 -- -float(0) +int(0) -- Iteration 20 -- int(0) diff --git a/ext/standard/tests/math/pow_variation1_64bit.phpt b/ext/standard/tests/math/pow_variation1_64bit.phpt index 24b482680..e1986ba85 100644 --- a/ext/standard/tests/math/pow_variation1_64bit.phpt +++ b/ext/standard/tests/math/pow_variation1_64bit.phpt @@ -149,7 +149,7 @@ int(0) int(0) -- Iteration 19 -- -float(0) +int(0) -- Iteration 20 -- int(0) @@ -173,4 +173,4 @@ int(0) -- Iteration 26 -- %s -===Done===
\ No newline at end of file +===Done=== diff --git a/ext/standard/tests/math/pow_variation2.phpt b/ext/standard/tests/math/pow_variation2.phpt index b1800bb15..f57193672 100644 --- a/ext/standard/tests/math/pow_variation2.phpt +++ b/ext/standard/tests/math/pow_variation2.phpt @@ -145,7 +145,7 @@ float(1) float(1) -- Iteration 19 -- -float(1) +int(1) -- Iteration 20 -- float(1) @@ -169,4 +169,4 @@ float(1) -- Iteration 26 -- %s -===Done===
\ No newline at end of file +===Done=== diff --git a/ext/standard/tests/math/tan_basiclong_64bit.phpt b/ext/standard/tests/math/tan_basiclong_64bit.phpt index 8ab083d50..3c8abe9d2 100644 --- a/ext/standard/tests/math/tan_basiclong_64bit.phpt +++ b/ext/standard/tests/math/tan_basiclong_64bit.phpt @@ -1,5 +1,7 @@ --TEST-- Test tan function : 64bit long tests +--INI-- +precision=5 --SKIPIF-- <?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); @@ -28,33 +30,34 @@ foreach ($longVals as $longVal) { ===DONE=== --EXPECT-- --- testing: 9223372036854775807 --- -float(84.739312968756) +float(84.739) --- testing: -9223372036854775808 --- -float(-84.739312968756) +float(-84.739) --- testing: 2147483647 --- -float(1.0523779637351) +float(1.0524) --- testing: -2147483648 --- -float(4.0842894552986) +float(4.0843) --- testing: 9223372034707292160 --- -float(-0.25738520049439) +float(-0.25739) --- testing: -9223372034707292160 --- -float(0.25738520049439) +float(0.25739) --- testing: 2147483648 --- -float(-4.0842894552986) +float(-4.0843) --- testing: -2147483649 --- -float(0.34328416030117) +float(0.34328) --- testing: 4294967294 --- -float(-19.579238091943) +float(-19.579) --- testing: 4294967295 --- -float(-0.57225137018055) +float(-0.57225) --- testing: 4294967293 --- -float(0.71667000824652) +float(0.71667) --- testing: 9223372036854775806 --- -float(84.739312968756) ---- testing: 9.2233720368548E+18 --- -float(84.739312968756) +float(84.739) +--- testing: 9.2234E+18 --- +float(84.739) --- testing: -9223372036854775807 --- -float(-84.739312968756) ---- testing: -9.2233720368548E+18 --- -float(-84.739312968756) +float(-84.739) +--- testing: -9.2234E+18 --- +float(-84.739) ===DONE=== + diff --git a/ext/tokenizer/tests/bug60097.phpt b/ext/tokenizer/tests/bug60097.phpt index 2116866c9..c3f417a7d 100644 --- a/ext/tokenizer/tests/bug60097.phpt +++ b/ext/tokenizer/tests/bug60097.phpt @@ -17,7 +17,7 @@ array(14) { [0]=> array(3) { [0]=> - int(374) + int(376) [1]=> string(6) "<?php " @@ -27,7 +27,7 @@ array(14) { [1]=> array(3) { [0]=> - int(378) + int(380) [1]=> string(8) "<<<DOC1 " @@ -37,7 +37,7 @@ array(14) { [2]=> array(3) { [0]=> - int(381) + int(383) [1]=> string(1) "{" [2]=> @@ -46,7 +46,7 @@ array(14) { [3]=> array(3) { [0]=> - int(310) + int(312) [1]=> string(2) "$s" [2]=> @@ -57,7 +57,7 @@ array(14) { [5]=> array(3) { [0]=> - int(378) + int(380) [1]=> string(8) "<<<DOC2 " @@ -67,7 +67,7 @@ array(14) { [6]=> array(3) { [0]=> - int(379) + int(381) [1]=> string(4) "DOC2" [2]=> @@ -76,7 +76,7 @@ array(14) { [7]=> array(3) { [0]=> - int(377) + int(379) [1]=> string(1) " " @@ -90,7 +90,7 @@ array(14) { [10]=> array(3) { [0]=> - int(315) + int(317) [1]=> string(1) " " @@ -100,7 +100,7 @@ array(14) { [11]=> array(3) { [0]=> - int(379) + int(381) [1]=> string(4) "DOC1" [2]=> @@ -111,7 +111,7 @@ array(14) { [13]=> array(3) { [0]=> - int(377) + int(379) [1]=> string(1) " " diff --git a/ext/zip/lib/zipconf.h b/ext/zip/lib/zipconf.h index 1cb5c0467..955d85b4e 100644 --- a/ext/zip/lib/zipconf.h +++ b/ext/zip/lib/zipconf.h @@ -7,7 +7,7 @@ This file was generated automatically by CMake
based on ../cmake-zipconf.h.in.
*/
-#define LIBZIP_VERSION "0.11.1"
+#define LIBZIP_VERSION "0.11.2"
/* #undef HAVE_INTTYPES_H_LIBZIP */
#if defined(_WIN32)
diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 591b907aa..ffe453041 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -38,7 +38,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.12.4-dev" +#define PHP_ZIP_VERSION "1.12.4" #if ((PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION >= 6) # define PHP_ZIP_USE_OO 1 diff --git a/main/php_ini.c b/main/php_ini.c index 1faec6877..e20ba4ba7 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -630,63 +630,81 @@ int php_init_config(TSRMLS_D) zend_llist scanned_ini_list; zend_llist_element *element; int l, total_l = 0; + char *bufpath, *debpath, *endpath; + int lenpath; - if ((ndir = php_scandir(php_ini_scanned_path, &namelist, 0, php_alphasort)) > 0) { - zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1); - memset(&fh2, 0, sizeof(fh2)); + zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1); + memset(&fh2, 0, sizeof(fh2)); - for (i = 0; i < ndir; i++) { + bufpath = estrdup(php_ini_scanned_path); + for (debpath = bufpath ; debpath ; debpath=endpath) { + endpath = strchr(debpath, DEFAULT_DIR_SEPARATOR); + if (endpath) { + *(endpath++) = 0; + } + if (!debpath[0]) { + /* empty string means default builtin value + to allow "/foo/phd.d:" or ":/foo/php.d" */ + debpath = PHP_CONFIG_FILE_SCAN_DIR; + } + lenpath = strlen(debpath); - /* check for any file with .ini extension */ - if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) { - free(namelist[i]); - continue; - } - /* Reset active ini section */ - RESET_ACTIVE_INI_HASH(); + if (lenpath > 0 && (ndir = php_scandir(debpath, &namelist, 0, php_alphasort)) > 0) { - if (IS_SLASH(php_ini_scanned_path[php_ini_scanned_path_len - 1])) { - snprintf(ini_file, MAXPATHLEN, "%s%s", php_ini_scanned_path, namelist[i]->d_name); - } else { - snprintf(ini_file, MAXPATHLEN, "%s%c%s", php_ini_scanned_path, DEFAULT_SLASH, namelist[i]->d_name); - } - if (VCWD_STAT(ini_file, &sb) == 0) { - if (S_ISREG(sb.st_mode)) { - if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) { - fh2.filename = ini_file; - fh2.type = ZEND_HANDLE_FP; - - if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) { - /* Here, add it to the list of ini files read */ - l = strlen(ini_file); - total_l += l + 2; - p = estrndup(ini_file, l); - zend_llist_add_element(&scanned_ini_list, &p); + for (i = 0; i < ndir; i++) { + + /* check for any file with .ini extension */ + if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) { + free(namelist[i]); + continue; + } + /* Reset active ini section */ + RESET_ACTIVE_INI_HASH(); + + if (IS_SLASH(debpath[lenpath - 1])) { + snprintf(ini_file, MAXPATHLEN, "%s%s", debpath, namelist[i]->d_name); + } else { + snprintf(ini_file, MAXPATHLEN, "%s%c%s", debpath, DEFAULT_SLASH, namelist[i]->d_name); + } + if (VCWD_STAT(ini_file, &sb) == 0) { + if (S_ISREG(sb.st_mode)) { + if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) { + fh2.filename = ini_file; + fh2.type = ZEND_HANDLE_FP; + + if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) { + /* Here, add it to the list of ini files read */ + l = strlen(ini_file); + total_l += l + 2; + p = estrndup(ini_file, l); + zend_llist_add_element(&scanned_ini_list, &p); + } } } } + free(namelist[i]); } - free(namelist[i]); + free(namelist); } - free(namelist); + } + efree(bufpath); - if (total_l) { - int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0; - php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1); - if (!php_ini_scanned_files_len) { - *php_ini_scanned_files = '\0'; - } - total_l += php_ini_scanned_files_len; - for (element = scanned_ini_list.head; element; element = element->next) { - if (php_ini_scanned_files_len) { - strlcat(php_ini_scanned_files, ",\n", total_l); - } - strlcat(php_ini_scanned_files, *(char **)element->data, total_l); - strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l); + if (total_l) { + int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0; + php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1); + if (!php_ini_scanned_files_len) { + *php_ini_scanned_files = '\0'; + } + total_l += php_ini_scanned_files_len; + for (element = scanned_ini_list.head; element; element = element->next) { + if (php_ini_scanned_files_len) { + strlcat(php_ini_scanned_files, ",\n", total_l); } + strlcat(php_ini_scanned_files, *(char **)element->data, total_l); + strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l); } - zend_llist_destroy(&scanned_ini_list); } + zend_llist_destroy(&scanned_ini_list); } else { /* Make sure an empty php_ini_scanned_path ends up as NULL */ php_ini_scanned_path = NULL; diff --git a/main/php_version.h b/main/php_version.h index 8ee8939ce..5397c471c 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -3,6 +3,6 @@ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 6 #define PHP_RELEASE_VERSION 0 -#define PHP_EXTRA_VERSION "alpha1" -#define PHP_VERSION "5.6.0alpha1" +#define PHP_EXTRA_VERSION "alpha2" +#define PHP_VERSION "5.6.0alpha2" #define PHP_VERSION_ID 50600 @@ -35,7 +35,7 @@ if test "${1}" = "1" -a "${2}" -lt "28"; then fi IFS="$old_IFS" -if test "$PHPROOTx" == "x"; then +if test "x$PHPROOT" == "x"; then PHPROOT=git@git.php.net:php-src.git; fi diff --git a/php.ini-development b/php.ini-development index 4fbd07f0a..0ca81e8ff 100644 --- a/php.ini-development +++ b/php.ini-development @@ -138,16 +138,6 @@ ; Development Value: "GP" ; Production Value: "GP" -; session.bug_compat_42 -; Default Value: On -; Development Value: On -; Production Value: Off - -; session.bug_compat_warn -; Default Value: On -; Development Value: On -; Production Value: Off - ; session.gc_divisor ; Default Value: 100 ; Development Value: 1000 @@ -1488,31 +1478,6 @@ session.gc_maxlifetime = 1440 ; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): ; find /path/to/sessions -cmin +24 -type f | xargs rm -; PHP 4.2 and less have an undocumented feature/bug that allows you to -; to initialize a session variable in the global scope. -; PHP 4.3 and later will warn you if this feature is used. -; You can disable the feature and the warning separately. At this time, -; the warning is only displayed, if bug_compat_42 is enabled. This feature -; introduces some serious security problems if not handled correctly. We -; recommend you not use this feature on production servers. You -; should enable this on development servers and enable the warning as well. If you -; do not enable the feature on development servers, you won't be warned when it's -; used, so debugging errors caused by this can be difficult to track down. -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/session.bug-compat-42 -session.bug_compat_42 = On - -; This setting controls whether or not you are warned by PHP when initializing a -; session value into the global space. session.bug_compat_42 must be enabled before -; these warnings can be issued by PHP. See the directive above for more information. -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/session.bug-compat-warn -session.bug_compat_warn = On - ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be ; considered as valid. diff --git a/php.ini-production b/php.ini-production index 53f0b51a7..3b6f5e3cf 100644 --- a/php.ini-production +++ b/php.ini-production @@ -138,16 +138,6 @@ ; Development Value: "GP" ; Production Value: "GP" -; session.bug_compat_42 -; Default Value: On -; Development Value: On -; Production Value: Off - -; session.bug_compat_warn -; Default Value: On -; Development Value: On -; Production Value: Off - ; session.gc_divisor ; Default Value: 100 ; Development Value: 1000 @@ -1488,31 +1478,6 @@ session.gc_maxlifetime = 1440 ; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): ; find /path/to/sessions -cmin +24 -type f | xargs rm -; PHP 4.2 and less have an undocumented feature/bug that allows you to -; to initialize a session variable in the global scope. -; PHP 4.3 and later will warn you if this feature is used. -; You can disable the feature and the warning separately. At this time, -; the warning is only displayed, if bug_compat_42 is enabled. This feature -; introduces some serious security problems if not handled correctly. We -; recommend you not use this feature on production servers. You -; should enable this on development servers and enable the warning as well. If you -; do not enable the feature on development servers, you won't be warned when it's -; used, so debugging errors caused by this can be difficult to track down. -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/session.bug-compat-42 -session.bug_compat_42 = Off - -; This setting controls whether or not you are warned by PHP when initializing a -; session value into the global space. session.bug_compat_42 must be enabled before -; these warnings can be issued by PHP. See the directive above for more information. -; Default Value: On -; Development Value: On -; Production Value: Off -; http://php.net/session.bug-compat-warn -session.bug_compat_warn = Off - ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be ; considered as valid. diff --git a/run-tests.php b/run-tests.php index cd6038e9b..f4e1599c5 100755 --- a/run-tests.php +++ b/run-tests.php @@ -581,7 +581,7 @@ if (isset($argc) && $argc > 1) { if (!$valgrind_header) { error("Valgrind returned no version info, cannot proceed.\nPlease check if Valgrind is installed."); } else { - $valgrind_version = preg_replace("/valgrind-([0-9])\.([0-9])\.([0-9]+)([.-\w]+)?(\s+)/", '$1$2$3', $valgrind_header, 1, $replace_count); + $valgrind_version = preg_replace("/valgrind-(\d)\.(\d)\.(\d+)([.\w_-]+)?(\s+)/", '$1$2$3', $valgrind_header, 1, $replace_count); if ($replace_count != 1 || !is_numeric($valgrind_version)) { error("Valgrind returned invalid version info (\"$valgrind_header\"), cannot proceed."); } diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index e7f841c0b..6cb1645e6 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -831,7 +831,13 @@ int main(int argc, char **argv) /* {{{ */ zend_bool remote = 0; int run = 0; int step = 0; - char *bp_tmp_file; + +#ifdef _WIN32 + char *bp_tmp_file = NULL; +#else + char bp_tmp_file[] = "/tmp/phpdbg.XXXXXX"; +#endif + #ifndef _WIN32 char *address; int listen[2]; @@ -871,10 +877,26 @@ int main(int argc, char **argv) /* {{{ */ phpdbg_main: if (!cleaning) { + +#ifdef _WIN32 bp_tmp_file = malloc(L_tmpnam); - tmpnam(bp_tmp_file); - if (bp_tmp_file == NULL) { - phpdbg_error("Unable to create temporary file"); + + if (bp_tmp_file) { + if (!tmpnam(bp_tmp_file)) { + free(bp_tmp_file); + bp_tmp_file = NULL; + } + } +#else + if (!mkstemp(bp_tmp_file)) { + memset(bp_tmp_file, 0, sizeof(bp_tmp_file)); + } +#endif + + if (!bp_tmp_file) { + phpdbg_error( + "Unable to create temporary file"); + return 1; } } ini_entries = NULL; @@ -1117,8 +1139,7 @@ phpdbg_main: phpdbg->ini_entries = ini_entries; if (phpdbg->startup(phpdbg) == SUCCESS) { - - zend_activate(TSRMLS_C); + php_request_startup(TSRMLS_C); /* do not install sigint handlers for remote consoles */ /* sending SIGINT then provides a decent way of shutting down the server */ @@ -1186,20 +1207,11 @@ phpdbg_main: /* set default prompt */ phpdbg_set_prompt(PROMPT TSRMLS_CC); - zend_try { - zend_activate_modules(TSRMLS_C); - } zend_end_try(); - if (show_banner) { /* print blurb */ phpdbg_welcome((cleaning > 0) TSRMLS_CC); } - zend_try { - /* activate globals, they can be overwritten */ - zend_activate_auto_globals(TSRMLS_C); - } zend_end_try(); - /* initialize from file */ PHPDBG_G(flags) |= PHPDBG_IS_INITIALIZING; zend_try { @@ -1269,12 +1281,6 @@ phpdbg_interact: } zend_end_try(); } while(!cleaning && !(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)); - /* this must be forced */ - CG(unclean_shutdown) = 0; - - /* this is just helpful */ - PG(report_memleaks) = 0; - phpdbg_out: #ifndef _WIN32 if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) { @@ -1297,24 +1303,14 @@ phpdbg_out: if (ini_override) { free(ini_override); } + + /* this must be forced */ + CG(unclean_shutdown) = 0; + + /* this is just helpful */ + PG(report_memleaks) = 0; - if (PG(modules_activated)) { - zend_try { - zend_deactivate_modules(TSRMLS_C); - } zend_end_try(); - } - - zend_deactivate(TSRMLS_C); - - zend_try { - zend_post_deactivate_modules(TSRMLS_C); - } zend_end_try(); - -#ifdef ZEND_SIGNALS - zend_try { - zend_signal_deactivate(TSRMLS_C); - } zend_end_try(); -#endif + php_request_shutdown((void*)0); zend_try { php_module_shutdown(TSRMLS_C); @@ -1342,7 +1338,11 @@ phpdbg_out: free(sapi_name); } +#ifdef _WIN32 free(bp_tmp_file); +#else + unlink(bp_tmp_file); +#endif return 0; } /* }}} */ diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h index 6b7afb237..68c505ca6 100644 --- a/sapi/phpdbg/phpdbg.h +++ b/sapi/phpdbg/phpdbg.h @@ -149,7 +149,7 @@ #define PHPDBG_AUTHORS "Felipe Pena, Joe Watkins and Bob Weinand" /* Ordered by last name */ #define PHPDBG_URL "http://phpdbg.com" #define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" -#define PHPDBG_VERSION "0.3.1" +#define PHPDBG_VERSION "0.3.2" #define PHPDBG_INIT_FILENAME ".phpdbginit" /* }}} */ diff --git a/sapi/phpdbg/phpdbg_cmd.c b/sapi/phpdbg/phpdbg_cmd.c index c70085124..1d78c5332 100644 --- a/sapi/phpdbg/phpdbg_cmd.c +++ b/sapi/phpdbg/phpdbg_cmd.c @@ -479,7 +479,7 @@ disconnect: #ifndef HAVE_LIBREADLINE if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) { - if (!phpdbg_write(phpdbg_get_prompt(TSRMLS_C))) { + if (!phpdbg_write("%s", phpdbg_get_prompt(TSRMLS_C))) { goto disconnect; } } @@ -595,6 +595,8 @@ PHPDBG_API int phpdbg_do_cmd(const phpdbg_command_t *command, phpdbg_input_t *in (command->alias == *input->argv[0]->string))) { phpdbg_param_t param; + phpdbg_command_t *initial_last_cmd; + phpdbg_param_t initial_last_param; param.type = EMPTY_PARAM; @@ -657,15 +659,20 @@ PHPDBG_API int phpdbg_do_cmd(const phpdbg_command_t *command, phpdbg_input_t *in } } + initial_last_param = PHPDBG_G(lparam); + initial_last_cmd = (phpdbg_command_t *)PHPDBG_G(lcmd); + PHPDBG_G(lparam) = param; + PHPDBG_G(lcmd) = (phpdbg_command_t *)command; + rc = command->handler(¶m, input TSRMLS_CC); /* only set last command when it is worth it! */ - if ((rc != FAILURE) && - !(PHPDBG_G(flags) & PHPDBG_IS_INITIALIZING)) { - PHPDBG_G(lcmd) = (phpdbg_command_t*) command; - phpdbg_clear_param( - &PHPDBG_G(lparam) TSRMLS_CC); - PHPDBG_G(lparam) = param; + if (rc != FAILURE && !(PHPDBG_G(flags) & PHPDBG_IS_INITIALIZING)) { + phpdbg_clear_param(&initial_last_param TSRMLS_CC); + } else if (PHPDBG_G(lcmd) == command && !memcmp(&PHPDBG_G(lparam),& initial_last_param, sizeof(phpdbg_param_t))) { + PHPDBG_G(lparam) = initial_last_param; + PHPDBG_G(lcmd) = initial_last_cmd; + phpdbg_clear_param(¶m TSRMLS_CC); } break; } diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index cb4640795..f586bb5a8 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -552,6 +552,7 @@ PHPDBG_COMMAND(run) /* {{{ */ zend_op_array *orig_op_array = EG(active_op_array); zval **orig_retval_ptr = EG(return_value_ptr_ptr); zend_bool restore = 1; + zend_execute_data *ex = EG(current_execute_data); if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { @@ -566,6 +567,11 @@ PHPDBG_COMMAND(run) /* {{{ */ zend_rebuild_symbol_table(TSRMLS_C); } + /* clean up from last execution */ + if (ex && ex->symbol_table) { + zend_hash_clean(ex->symbol_table); + } + /* clean seek state */ PHPDBG_G(flags) &= ~PHPDBG_SEEK_MASK; zend_hash_clean( diff --git a/win32/build/libs_version.txt b/win32/build/libs_version.txt index 44420ddec..ece70412b 100644 --- a/win32/build/libs_version.txt +++ b/win32/build/libs_version.txt @@ -1,9 +1,9 @@ bz2-1.0.6 cclient-2007f freetype-2.4.10 -icu-51.2 +icu-52.1 jpeglib-9 -libcurl-7.30.0 +libcurl-7.35.0 libiconv-1.14 libmcrypt-2.5.8 libmpir-2.6.0 @@ -13,4 +13,4 @@ libssh2-1.4.2 libtidy-20090406 libxslt-1.1.27 libxml-2.9.1 -openssl-1.0.1e +openssl-1.0.1f |