summaryrefslogtreecommitdiff
path: root/Zend/zend_language_scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_language_scanner.c')
-rw-r--r--Zend/zend_language_scanner.c1428
1 files changed, 905 insertions, 523 deletions
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index d6543fadd2..39b02f0e42 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.0.1 */
+/* Generated by re2c 1.1.1 */
#line 1 "Zend/zend_language_scanner.l"
/*
+----------------------------------------------------------------------+
@@ -18,13 +18,11 @@
| Nuno Lopes <nlopess@php.net> |
| Scott MacVicar <scottmac@php.net> |
| Flex version authors: |
- | Andi Gutmans <andi@zend.com> |
- | Zeev Suraski <zeev@zend.com> |
+ | Andi Gutmans <andi@php.net> |
+ | Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
#if 0
# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
#else
@@ -120,6 +118,7 @@ do { \
#define GET_DOUBLE_QUOTES_SCANNED_LENGTH() SCNG(scanned_string_len)
#define IS_LABEL_START(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || (c) == '_' || (c) >= 0x80)
+#define IS_LABEL_SUCCESSOR(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9') || (c) == '_' || (c) >= 0x80)
#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7')
#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F'))
@@ -184,6 +183,7 @@ void startup_scanner(void)
CG(extra_fn_flags) = 0;
zend_stack_init(&SCNG(state_stack), sizeof(int));
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
}
static void heredoc_label_dtor(zend_heredoc_label *heredoc_label) {
@@ -197,6 +197,7 @@ void shutdown_scanner(void)
zend_stack_destroy(&SCNG(state_stack));
zend_ptr_stack_clean(&SCNG(heredoc_label_stack), (void (*)(void *)) &heredoc_label_dtor, 1);
zend_ptr_stack_destroy(&SCNG(heredoc_label_stack));
+ SCNG(heredoc_scan_ahead) = 0;
SCNG(on_event) = NULL;
}
@@ -561,7 +562,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
}
zend_set_compiled_filename(compiled_filename);
- zend_string_release(compiled_filename);
+ zend_string_release_ex(compiled_filename, 0);
if (CG(start_lineno)) {
CG(zend_lineno) = CG(start_lineno);
@@ -651,9 +652,7 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_string *opened_path = NULL;
if (Z_TYPE_P(filename) != IS_STRING) {
- tmp = *filename;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
+ ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
file_handle.filename = Z_STRVAL_P(filename);
@@ -671,13 +670,13 @@ zend_op_array *compile_filename(int type, zval *filename)
zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path);
if (opened_path) {
- zend_string_release(opened_path);
+ zend_string_release_ex(opened_path, 0);
}
}
zend_destroy_file_handle(&file_handle);
- if (filename==&tmp) {
- zval_dtor(&tmp);
+ if (UNEXPECTED(filename == &tmp)) {
+ zval_ptr_dtor(&tmp);
}
return retval;
}
@@ -721,7 +720,7 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename)
new_compiled_filename = zend_string_init(filename, strlen(filename), 0);
zend_set_compiled_filename(new_compiled_filename);
- zend_string_release(new_compiled_filename);
+ zend_string_release_ex(new_compiled_filename, 0);
CG(zend_lineno) = 1;
CG(increment_lineno) = 0;
RESET_DOC_COMMENT();
@@ -756,22 +755,25 @@ zend_op_array *compile_string(zval *source_string, char *filename)
zend_op_array *op_array = NULL;
zval tmp;
- if (Z_STRLEN_P(source_string)==0) {
- return NULL;
+ if (UNEXPECTED(Z_TYPE_P(source_string) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(source_string));
+ } else {
+ ZVAL_COPY(&tmp, source_string);
}
- ZVAL_DUP(&tmp, source_string);
- convert_to_string(&tmp);
- source_string = &tmp;
+ if (Z_STRLEN(tmp)==0) {
+ zval_ptr_dtor(&tmp);
+ return NULL;
+ }
zend_save_lexical_state(&original_lex_state);
- if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) {
+ if (zend_prepare_string_for_scanning(&tmp, filename) == SUCCESS) {
BEGIN(ST_IN_SCRIPTING);
op_array = zend_compile(ZEND_EVAL_CODE);
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(&tmp);
+ zval_ptr_dtor(&tmp);
return op_array;
}
@@ -806,13 +808,18 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name)
{
zend_lex_state original_lex_state;
- zval tmp = *str;
+ zval tmp;
- str = &tmp;
- zval_copy_ctor(str);
+ if (UNEXPECTED(Z_TYPE_P(str) != IS_STRING)) {
+ ZVAL_STR(&tmp, zval_get_string_func(str));
+ str = &tmp;
+ }
zend_save_lexical_state(&original_lex_state);
if (zend_prepare_string_for_scanning(str, str_name)==FAILURE) {
zend_restore_lexical_state(&original_lex_state);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return FAILURE;
}
BEGIN(INITIAL);
@@ -822,7 +829,9 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
SCNG(script_filtered) = NULL;
}
zend_restore_lexical_state(&original_lex_state);
- zval_dtor(str);
+ if (UNEXPECTED(str == &tmp)) {
+ zval_ptr_dtor(&tmp);
+ }
return SUCCESS;
}
@@ -869,6 +878,8 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); \
ZVAL_STRINGL(zendlval, s, sz); \
efree(s); \
+ } else if (yyleng == 1) { \
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext))); \
} else { \
ZVAL_STRINGL(zendlval, yytext, yyleng); \
}
@@ -878,11 +889,38 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
register char *s, *t;
char *end;
+ if (len <= 1) {
+ if (len < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*str;
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
+
ZVAL_STRINGL(zendlval, str, len);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
@@ -894,23 +932,18 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
switch(*s) {
case 'n':
*t++ = '\n';
- Z_STRLEN_P(zendlval)--;
break;
case 'r':
*t++ = '\r';
- Z_STRLEN_P(zendlval)--;
break;
case 't':
*t++ = '\t';
- Z_STRLEN_P(zendlval)--;
break;
case 'f':
*t++ = '\f';
- Z_STRLEN_P(zendlval)--;
break;
case 'v':
*t++ = '\v';
- Z_STRLEN_P(zendlval)--;
break;
case 'e':
#ifdef ZEND_WIN32
@@ -918,7 +951,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
#else
*t++ = '\e';
#endif
- Z_STRLEN_P(zendlval)--;
break;
case '"':
case '`':
@@ -930,20 +962,15 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
case '\\':
case '$':
*t++ = *s;
- Z_STRLEN_P(zendlval)--;
break;
case 'x':
case 'X':
if (ZEND_IS_HEX(*(s+1))) {
char hex_buf[3] = { 0, 0, 0 };
- Z_STRLEN_P(zendlval)--; /* for the 'x' */
-
hex_buf[0] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_HEX(*(s+1))) {
hex_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
*t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
} else {
@@ -959,7 +986,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
size_t len = 0;
zend_bool valid = 1;
unsigned long codepoint;
- size_t byte_len = 0;
if (*start != '{') {
/* we silently let this pass to avoid breaking code
@@ -1015,27 +1041,20 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
/* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
if (codepoint < 0x80) {
- byte_len = 1;
*t++ = codepoint;
} else if (codepoint <= 0x7FF) {
- byte_len = 2;
*t++ = (codepoint >> 6) + 0xC0;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0xFFFF) {
- byte_len = 3;
*t++ = (codepoint >> 12) + 0xE0;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
} else if (codepoint <= 0x10FFFF) {
- byte_len = 4;
*t++ = (codepoint >> 18) + 0xF0;
*t++ = ((codepoint >> 12) & 0x3F) + 0x80;
*t++ = ((codepoint >> 6) & 0x3F) + 0x80;
*t++ = (codepoint & 0x3F) + 0x80;
}
-
- Z_STRLEN_P(zendlval) -= 2; /* \u */
- Z_STRLEN_P(zendlval) -= (len - byte_len);
}
break;
default:
@@ -1044,13 +1063,10 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
char octal_buf[4] = { 0, 0, 0, 0 };
octal_buf[0] = *s;
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[1] = *(++s);
- Z_STRLEN_P(zendlval)--;
if (ZEND_IS_OCT(*(s+1))) {
octal_buf[2] = *(++s);
- Z_STRLEN_P(zendlval)--;
}
}
if (octal_buf[2] &&
@@ -1076,6 +1092,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
unsigned char *str;
@@ -1089,27 +1108,145 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
return SUCCESS;
}
-static zend_always_inline int emit_token(int token, int token_line)
+#define HEREDOC_USING_SPACES 1
+#define HEREDOC_USING_TABS 2
+
+static const char *next_newline(const char *str, const char *end, size_t *newline_len) {
+ for (; str < end; str++) {
+ if (*str == '\r') {
+ *newline_len = str + 1 < end && *(str + 1) == '\n' ? 2 : 1;
+ } else if (*str == '\n') {
+ *newline_len = 1;
+ return str;
+ }
+ }
+ *newline_len = 0;
+ return NULL;
+}
+
+static zend_bool strip_multiline_string_indentation(
+ zval *zendlval, int indentation, zend_bool using_spaces,
+ zend_bool newline_at_start, zend_bool newline_at_end)
{
- if (SCNG(on_event)) {
- SCNG(on_event)(ON_TOKEN, token, token_line, SCNG(on_event_context));
+ const char *str = Z_STRVAL_P(zendlval), *end = str + Z_STRLEN_P(zendlval);
+ char *copy = Z_STRVAL_P(zendlval);
+
+ int newline_count = 0;
+ size_t newline_len;
+ const char *nl;
+
+ if (!newline_at_start) {
+ nl = next_newline(str, end, &newline_len);
+ if (!nl) {
+ return 1;
+ }
+
+ str = nl + newline_len;
+ copy = (char *) nl + newline_len;
+ newline_count++;
+ } else {
+ nl = str;
}
- return token;
-}
+ /* <= intentional */
+ while (str <= end && nl) {
+ size_t skip;
+ nl = next_newline(str, end, &newline_len);
+ if (!nl && newline_at_end) {
+ nl = end;
+ }
-#define RETURN_TOKEN(token) return emit_token(token, start_line);
+ /* Try to skip indentation */
+ for (skip = 0; skip < indentation; skip++, str++) {
+ if (str == nl) {
+ /* Don't require full indentation on whitespace-only lines */
+ break;
+ }
+
+ if (str == end || (*str != ' ' && *str != '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception_ex(zend_ce_parse_error, 0,
+ "Invalid body indentation level (expecting an indentation level of at least %d)", indentation);
+ goto error;
+ }
-int lex_scan(zval *zendlval)
+ if ((!using_spaces && *str == ' ') || (using_spaces && *str == '\t')) {
+ CG(zend_lineno) += newline_count;
+ zend_throw_exception(zend_ce_parse_error,
+ "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ goto error;
+ }
+ }
+
+ if (str == end) {
+ break;
+ }
+
+ size_t len = nl ? (nl - str + newline_len) : (end - str);
+ memmove(copy, str, len);
+ str += len;
+ copy += len;
+ newline_count++;
+ }
+
+ *copy = '\0';
+ Z_STRLEN_P(zendlval) = copy - Z_STRVAL_P(zendlval);
+ return 1;
+
+error:
+ zval_ptr_dtor_str(zendlval);
+ ZVAL_UNDEF(zendlval);
+
+ return 0;
+}
+
+static void copy_heredoc_label_stack(void *void_heredoc_label)
{
+ zend_heredoc_label *heredoc_label = void_heredoc_label;
+ zend_heredoc_label *new_heredoc_label = emalloc(sizeof(zend_heredoc_label));
+
+ *new_heredoc_label = *heredoc_label;
+ new_heredoc_label->label = estrndup(heredoc_label->label, heredoc_label->length);
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) new_heredoc_label);
+}
+
+#define PARSER_MODE() \
+ EXPECTED(elem != NULL)
+
+#define RETURN_TOKEN(_token) do { \
+ token = _token; \
+ goto emit_token; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_VAL(_token) do { \
+ token = _token; \
+ goto emit_token_with_val; \
+ } while (0)
+
+#define RETURN_TOKEN_WITH_STR(_token, _offset) do { \
+ token = _token; \
+ offset = _offset; \
+ goto emit_token_with_str; \
+ } while (0)
+
+#define SKIP_TOKEN(_token) do { \
+ token = _token; \
+ goto skip_token; \
+ } while (0)
+
+int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem)
+{
+int token;
+int offset;
int start_line = CG(zend_lineno);
+ ZVAL_UNDEF(zendlval);
restart:
SCNG(yy_text) = YYCURSOR;
-#line 1113 "Zend/zend_language_scanner.c"
+#line 1250 "Zend/zend_language_scanner.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
@@ -1317,7 +1454,7 @@ yy3:
++YYCURSOR;
YYDEBUG(4, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2390 "Zend/zend_language_scanner.l"
+#line 2750 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -1326,7 +1463,7 @@ yy3:
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
goto restart;
}
-#line 1330 "Zend/zend_language_scanner.c"
+#line 1467 "Zend/zend_language_scanner.c"
yy5:
YYDEBUG(5, *YYCURSOR);
++YYCURSOR;
@@ -1338,12 +1475,11 @@ yy5:
}
YYDEBUG(7, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1292 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
{
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_WHITESPACE);
+ goto return_whitespace;
}
-#line 1347 "Zend/zend_language_scanner.c"
+#line 1483 "Zend/zend_language_scanner.c"
yy8:
YYDEBUG(8, *YYCURSOR);
yych = *++YYCURSOR;
@@ -1351,17 +1487,17 @@ yy8:
yy9:
YYDEBUG(9, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1577 "Zend/zend_language_scanner.l"
+#line 1712 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(yytext[0]);
}
-#line 1359 "Zend/zend_language_scanner.c"
+#line 1495 "Zend/zend_language_scanner.c"
yy10:
YYDEBUG(10, *YYCURSOR);
++YYCURSOR;
YYDEBUG(11, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2038 "Zend/zend_language_scanner.l"
+#line 2224 "Zend/zend_language_scanner.l"
{
int bprefix = (yytext[0] != '"') ? 1 : 0;
@@ -1369,8 +1505,12 @@ yy10:
switch (*YYCURSOR++) {
case '"':
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"');
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
case '$':
if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
break;
@@ -1402,13 +1542,13 @@ yy10:
BEGIN(ST_DOUBLE_QUOTES);
RETURN_TOKEN('"');
}
-#line 1406 "Zend/zend_language_scanner.c"
+#line 1546 "Zend/zend_language_scanner.c"
yy12:
YYDEBUG(12, *YYCURSOR);
++YYCURSOR;
YYDEBUG(13, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1898 "Zend/zend_language_scanner.l"
+#line 2051 "Zend/zend_language_scanner.l"
{
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
@@ -1435,9 +1575,12 @@ yy12:
yyleng = YYCURSOR - SCNG(yy_text);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
-#line 1441 "Zend/zend_language_scanner.c"
+#line 1584 "Zend/zend_language_scanner.c"
yy14:
YYDEBUG(14, *YYCURSOR);
yych = *++YYCURSOR;
@@ -1468,7 +1611,7 @@ yy17:
++YYCURSOR;
YYDEBUG(18, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1969 "Zend/zend_language_scanner.l"
+#line 2134 "Zend/zend_language_scanner.l"
{
register char *s, *t;
char *end;
@@ -1491,41 +1634,62 @@ yy17:
* for ' (unrecognized by parser), instead of old flex fallback to "Unexpected character..."
* rule, which continued in ST_IN_SCRIPTING state after the quote */
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
}
+ if (yyleng-bprefix-2 <= 1) {
+ if (yyleng-bprefix-2 < 1) {
+ ZVAL_EMPTY_STRING(zendlval);
+ } else {
+ zend_uchar c = (zend_uchar)*(yytext+bprefix+1);
+ if (c == '\n' || c == '\r') {
+ CG(zend_lineno)++;
+ }
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+ }
+ goto skip_escape_conversion;
+ }
ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2);
/* convert escape sequences */
- s = t = Z_STRVAL_P(zendlval);
+ s = Z_STRVAL_P(zendlval);
end = s+Z_STRLEN_P(zendlval);
+ while (1) {
+ if (UNEXPECTED(*s=='\\')) {
+ break;
+ }
+ if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+ CG(zend_lineno)++;
+ }
+ s++;
+ if (s == end) {
+ goto skip_escape_conversion;
+ }
+ }
+
+ t = s;
while (s<end) {
if (*s=='\\') {
s++;
-
- switch(*s) {
- case '\\':
- case '\'':
- *t++ = *s;
- Z_STRLEN_P(zendlval)--;
- break;
- default:
- *t++ = '\\';
- *t++ = *s;
- break;
+ if (*s == '\\' || *s == '\'') {
+ *t++ = *s;
+ } else {
+ *t++ = '\\';
+ *t++ = *s;
}
} else {
*t++ = *s;
}
-
if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
CG(zend_lineno)++;
}
s++;
}
*t = 0;
+ Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
char *str = NULL;
@@ -1534,9 +1698,9 @@ yy17:
SCNG(output_filter)((unsigned char **)&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
ZVAL_STRINGL(zendlval, str, sz);
}
- RETURN_TOKEN(T_CONSTANT_ENCAPSED_STRING);
+ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
}
-#line 1540 "Zend/zend_language_scanner.c"
+#line 1704 "Zend/zend_language_scanner.c"
yy19:
YYDEBUG(19, *YYCURSOR);
yyaccept = 0;
@@ -1660,7 +1824,7 @@ yy26:
yy27:
YYDEBUG(27, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1647 "Zend/zend_language_scanner.l"
+#line 1781 "Zend/zend_language_scanner.l"
{
char *end;
if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
@@ -1673,7 +1837,10 @@ yy27:
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_LNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
} else {
errno = 0;
@@ -1690,21 +1857,26 @@ yy27:
zend_throw_exception(zend_ce_parse_error,
"Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
}
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
/* Also not an assert for the same reason */
if (end != yytext + yyleng) {
zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
ZVAL_UNDEF(zendlval);
- RETURN_TOKEN(T_DNUMBER);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
ZEND_ASSERT(!errno);
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
-#line 1708 "Zend/zend_language_scanner.c"
+#line 1880 "Zend/zend_language_scanner.c"
yy28:
YYDEBUG(28, *YYCURSOR);
yyaccept = 1;
@@ -1786,12 +1958,11 @@ yy35:
yy36:
YYDEBUG(36, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1892 "Zend/zend_language_scanner.l"
+#line 2046 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 1795 "Zend/zend_language_scanner.c"
+#line 1966 "Zend/zend_language_scanner.c"
yy37:
YYDEBUG(37, *YYCURSOR);
yyaccept = 2;
@@ -2076,11 +2247,11 @@ yy58:
++YYCURSOR;
YYDEBUG(59, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1317 "Zend/zend_language_scanner.l"
+#line 1452 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NS_SEPARATOR);
}
-#line 2084 "Zend/zend_language_scanner.c"
+#line 2255 "Zend/zend_language_scanner.c"
yy60:
YYDEBUG(60, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2096,23 +2267,23 @@ yy62:
++YYCURSOR;
YYDEBUG(63, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2128 "Zend/zend_language_scanner.l"
+#line 2403 "Zend/zend_language_scanner.l"
{
BEGIN(ST_BACKQUOTE);
RETURN_TOKEN('`');
}
-#line 2105 "Zend/zend_language_scanner.c"
+#line 2276 "Zend/zend_language_scanner.c"
yy64:
YYDEBUG(64, *YYCURSOR);
++YYCURSOR;
YYDEBUG(65, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1582 "Zend/zend_language_scanner.l"
+#line 1717 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_IN_SCRIPTING);
RETURN_TOKEN('{');
}
-#line 2116 "Zend/zend_language_scanner.c"
+#line 2287 "Zend/zend_language_scanner.c"
yy66:
YYDEBUG(66, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2124,7 +2295,7 @@ yy67:
++YYCURSOR;
YYDEBUG(68, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1594 "Zend/zend_language_scanner.l"
+#line 1729 "Zend/zend_language_scanner.l"
{
RESET_DOC_COMMENT();
if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -2132,7 +2303,7 @@ yy67:
}
RETURN_TOKEN('}');
}
-#line 2136 "Zend/zend_language_scanner.c"
+#line 2307 "Zend/zend_language_scanner.c"
yy69:
YYDEBUG(69, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2140,11 +2311,11 @@ yy69:
yy70:
YYDEBUG(70, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1481 "Zend/zend_language_scanner.l"
+#line 1616 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_NOT_EQUAL);
}
-#line 2148 "Zend/zend_language_scanner.c"
+#line 2319 "Zend/zend_language_scanner.c"
yy71:
YYDEBUG(71, *YYCURSOR);
++YYCURSOR;
@@ -2169,42 +2340,41 @@ yy71:
yy73:
YYDEBUG(73, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 2178 "Zend/zend_language_scanner.c"
+#line 2348 "Zend/zend_language_scanner.c"
yy74:
YYDEBUG(74, *YYCURSOR);
++YYCURSOR;
YYDEBUG(75, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1525 "Zend/zend_language_scanner.l"
+#line 1660 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MOD_EQUAL);
}
-#line 2188 "Zend/zend_language_scanner.c"
+#line 2358 "Zend/zend_language_scanner.c"
yy76:
YYDEBUG(76, *YYCURSOR);
++YYCURSOR;
YYDEBUG(77, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1553 "Zend/zend_language_scanner.l"
+#line 1688 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOLEAN_AND);
}
-#line 2198 "Zend/zend_language_scanner.c"
+#line 2368 "Zend/zend_language_scanner.c"
yy78:
YYDEBUG(78, *YYCURSOR);
++YYCURSOR;
YYDEBUG(79, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1537 "Zend/zend_language_scanner.l"
+#line 1672 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_AND_EQUAL);
}
-#line 2208 "Zend/zend_language_scanner.c"
+#line 2378 "Zend/zend_language_scanner.c"
yy80:
YYDEBUG(80, *YYCURSOR);
++YYCURSOR;
@@ -2334,72 +2504,72 @@ yy92:
if (yych == '=') goto yy205;
YYDEBUG(93, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1509 "Zend/zend_language_scanner.l"
+#line 1644 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_POW);
}
-#line 2342 "Zend/zend_language_scanner.c"
+#line 2512 "Zend/zend_language_scanner.c"
yy94:
YYDEBUG(94, *YYCURSOR);
++YYCURSOR;
YYDEBUG(95, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1505 "Zend/zend_language_scanner.l"
+#line 1640 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MUL_EQUAL);
}
-#line 2352 "Zend/zend_language_scanner.c"
+#line 2522 "Zend/zend_language_scanner.c"
yy96:
YYDEBUG(96, *YYCURSOR);
++YYCURSOR;
YYDEBUG(97, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1461 "Zend/zend_language_scanner.l"
+#line 1596 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INC);
}
-#line 2362 "Zend/zend_language_scanner.c"
+#line 2532 "Zend/zend_language_scanner.c"
yy98:
YYDEBUG(98, *YYCURSOR);
++YYCURSOR;
YYDEBUG(99, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1497 "Zend/zend_language_scanner.l"
+#line 1632 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PLUS_EQUAL);
}
-#line 2372 "Zend/zend_language_scanner.c"
+#line 2542 "Zend/zend_language_scanner.c"
yy100:
YYDEBUG(100, *YYCURSOR);
++YYCURSOR;
YYDEBUG(101, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1465 "Zend/zend_language_scanner.l"
+#line 1600 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DEC);
}
-#line 2382 "Zend/zend_language_scanner.c"
+#line 2552 "Zend/zend_language_scanner.c"
yy102:
YYDEBUG(102, *YYCURSOR);
++YYCURSOR;
YYDEBUG(103, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1501 "Zend/zend_language_scanner.l"
+#line 1636 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_MINUS_EQUAL);
}
-#line 2392 "Zend/zend_language_scanner.c"
+#line 2562 "Zend/zend_language_scanner.c"
yy104:
YYDEBUG(104, *YYCURSOR);
++YYCURSOR;
YYDEBUG(105, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1287 "Zend/zend_language_scanner.l"
+#line 1424 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_PROPERTY);
RETURN_TOKEN(T_OBJECT_OPERATOR);
}
-#line 2403 "Zend/zend_language_scanner.c"
+#line 2573 "Zend/zend_language_scanner.c"
yy106:
YYDEBUG(106, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2422,26 +2592,26 @@ yy107:
yy109:
YYDEBUG(109, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1740 "Zend/zend_language_scanner.l"
+#line 1886 "Zend/zend_language_scanner.l"
{
const char *end;
ZVAL_DOUBLE(zendlval, zend_strtod(yytext, &end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
-#line 2435 "Zend/zend_language_scanner.c"
+#line 2605 "Zend/zend_language_scanner.c"
yy110:
YYDEBUG(110, *YYCURSOR);
++YYCURSOR;
YYDEBUG(111, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1521 "Zend/zend_language_scanner.l"
+#line 1656 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONCAT_EQUAL);
}
-#line 2445 "Zend/zend_language_scanner.c"
+#line 2615 "Zend/zend_language_scanner.c"
yy112:
YYDEBUG(112, *YYCURSOR);
yyaccept = 4;
@@ -2450,7 +2620,7 @@ yy112:
yy113:
YYDEBUG(113, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1927 "Zend/zend_language_scanner.l"
+#line 2083 "Zend/zend_language_scanner.l"
{
int doc_com;
@@ -2478,22 +2648,28 @@ yy113:
if (doc_com) {
CG(doc_comment) = zend_string_init(yytext, yyleng, 0);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_DOC_COMMENT);
+ }
RETURN_TOKEN(T_DOC_COMMENT);
}
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_COMMENT);
+ }
RETURN_TOKEN(T_COMMENT);
}
-#line 2487 "Zend/zend_language_scanner.c"
+#line 2663 "Zend/zend_language_scanner.c"
yy114:
YYDEBUG(114, *YYCURSOR);
++YYCURSOR;
YYDEBUG(115, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1517 "Zend/zend_language_scanner.l"
+#line 1652 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DIV_EQUAL);
}
-#line 2497 "Zend/zend_language_scanner.c"
+#line 2673 "Zend/zend_language_scanner.c"
yy116:
YYDEBUG(116, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2525,11 +2701,11 @@ yy119:
++YYCURSOR;
YYDEBUG(120, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1313 "Zend/zend_language_scanner.l"
+#line 1448 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM);
}
-#line 2533 "Zend/zend_language_scanner.c"
+#line 2709 "Zend/zend_language_scanner.c"
yy121:
YYDEBUG(121, *YYCURSOR);
yyaccept = 5;
@@ -2540,22 +2716,22 @@ yy121:
yy122:
YYDEBUG(122, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1569 "Zend/zend_language_scanner.l"
+#line 1704 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SL);
}
-#line 2548 "Zend/zend_language_scanner.c"
+#line 2724 "Zend/zend_language_scanner.c"
yy123:
YYDEBUG(123, *YYCURSOR);
yych = *++YYCURSOR;
if (yych == '>') goto yy223;
YYDEBUG(124, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1489 "Zend/zend_language_scanner.l"
+#line 1624 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL);
}
-#line 2559 "Zend/zend_language_scanner.c"
+#line 2735 "Zend/zend_language_scanner.c"
yy125:
YYDEBUG(125, *YYCURSOR);
++YYCURSOR;
@@ -2566,42 +2742,42 @@ yy126:
if (yych == '=') goto yy225;
YYDEBUG(127, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1477 "Zend/zend_language_scanner.l"
+#line 1612 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_EQUAL);
}
-#line 2574 "Zend/zend_language_scanner.c"
+#line 2750 "Zend/zend_language_scanner.c"
yy128:
YYDEBUG(128, *YYCURSOR);
++YYCURSOR;
YYDEBUG(129, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1445 "Zend/zend_language_scanner.l"
+#line 1580 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DOUBLE_ARROW);
}
-#line 2584 "Zend/zend_language_scanner.c"
+#line 2760 "Zend/zend_language_scanner.c"
yy130:
YYDEBUG(130, *YYCURSOR);
++YYCURSOR;
YYDEBUG(131, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1493 "Zend/zend_language_scanner.l"
+#line 1628 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_GREATER_OR_EQUAL);
}
-#line 2594 "Zend/zend_language_scanner.c"
+#line 2770 "Zend/zend_language_scanner.c"
yy132:
YYDEBUG(132, *YYCURSOR);
yych = *++YYCURSOR;
if (yych == '=') goto yy227;
YYDEBUG(133, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1573 "Zend/zend_language_scanner.l"
+#line 1708 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SR);
}
-#line 2605 "Zend/zend_language_scanner.c"
+#line 2781 "Zend/zend_language_scanner.c"
yy134:
YYDEBUG(134, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2610,25 +2786,28 @@ yy134:
yy135:
YYDEBUG(135, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1960 "Zend/zend_language_scanner.l"
+#line 2122 "Zend/zend_language_scanner.l"
{
BEGIN(INITIAL);
if (yytext[yyleng-1] != '>') {
CG(increment_lineno) = 1;
}
- RETURN_TOKEN(T_CLOSE_TAG); /* implicit ';' at php-end tag */
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(';'); /* implicit ';' at php-end tag */
+ }
+ RETURN_TOKEN(T_CLOSE_TAG);
}
-#line 2622 "Zend/zend_language_scanner.c"
+#line 2801 "Zend/zend_language_scanner.c"
yy136:
YYDEBUG(136, *YYCURSOR);
++YYCURSOR;
YYDEBUG(137, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1325 "Zend/zend_language_scanner.l"
+#line 1460 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_COALESCE);
}
-#line 2632 "Zend/zend_language_scanner.c"
+#line 2811 "Zend/zend_language_scanner.c"
yy138:
YYDEBUG(138, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2655,11 +2834,11 @@ yy141:
}
YYDEBUG(142, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1227 "Zend/zend_language_scanner.l"
+#line 1364 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_AS);
}
-#line 2663 "Zend/zend_language_scanner.c"
+#line 2842 "Zend/zend_language_scanner.c"
yy143:
YYDEBUG(143, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2745,11 +2924,11 @@ yy150:
}
YYDEBUG(151, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1195 "Zend/zend_language_scanner.l"
+#line 1332 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DO);
}
-#line 2753 "Zend/zend_language_scanner.c"
+#line 2932 "Zend/zend_language_scanner.c"
yy152:
YYDEBUG(152, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2834,11 +3013,11 @@ yy163:
}
YYDEBUG(164, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1171 "Zend/zend_language_scanner.l"
+#line 1308 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IF);
}
-#line 2842 "Zend/zend_language_scanner.c"
+#line 3021 "Zend/zend_language_scanner.c"
yy165:
YYDEBUG(165, *YYCURSOR);
yych = *++YYCURSOR;
@@ -2899,11 +3078,11 @@ yy171:
}
YYDEBUG(172, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1557 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_OR);
}
-#line 2907 "Zend/zend_language_scanner.c"
+#line 3086 "Zend/zend_language_scanner.c"
yy173:
YYDEBUG(173, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3017,11 +3196,11 @@ yy186:
++YYCURSOR;
YYDEBUG(187, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1545 "Zend/zend_language_scanner.l"
+#line 1680 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_XOR_EQUAL);
}
-#line 3025 "Zend/zend_language_scanner.c"
+#line 3204 "Zend/zend_language_scanner.c"
yy188:
YYDEBUG(188, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3049,31 +3228,31 @@ yy189:
++YYCURSOR;
YYDEBUG(190, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1541 "Zend/zend_language_scanner.l"
+#line 1676 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OR_EQUAL);
}
-#line 3057 "Zend/zend_language_scanner.c"
+#line 3236 "Zend/zend_language_scanner.c"
yy191:
YYDEBUG(191, *YYCURSOR);
++YYCURSOR;
YYDEBUG(192, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1549 "Zend/zend_language_scanner.l"
+#line 1684 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOLEAN_OR);
}
-#line 3067 "Zend/zend_language_scanner.c"
+#line 3246 "Zend/zend_language_scanner.c"
yy193:
YYDEBUG(193, *YYCURSOR);
++YYCURSOR;
YYDEBUG(194, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1473 "Zend/zend_language_scanner.l"
+#line 1608 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_NOT_IDENTICAL);
}
-#line 3077 "Zend/zend_language_scanner.c"
+#line 3256 "Zend/zend_language_scanner.c"
yy195:
YYDEBUG(195, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3139,21 +3318,21 @@ yy205:
++YYCURSOR;
YYDEBUG(206, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1513 "Zend/zend_language_scanner.l"
+#line 1648 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_POW_EQUAL);
}
-#line 3147 "Zend/zend_language_scanner.c"
+#line 3326 "Zend/zend_language_scanner.c"
yy207:
YYDEBUG(207, *YYCURSOR);
++YYCURSOR;
YYDEBUG(208, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1321 "Zend/zend_language_scanner.l"
+#line 1456 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELLIPSIS);
}
-#line 3157 "Zend/zend_language_scanner.c"
+#line 3336 "Zend/zend_language_scanner.c"
yy209:
YYDEBUG(209, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3177,7 +3356,7 @@ yy210:
}
YYDEBUG(212, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1619 "Zend/zend_language_scanner.l"
+#line 1753 "Zend/zend_language_scanner.l"
{
char *bin = yytext + 2; /* Skip "0b" */
int len = yyleng - 2;
@@ -3197,15 +3376,15 @@ yy210:
ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2));
ZEND_ASSERT(!errno && end == yytext + yyleng);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == yytext + yyleng);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
-#line 3209 "Zend/zend_language_scanner.c"
+#line 3388 "Zend/zend_language_scanner.c"
yy213:
YYDEBUG(213, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3231,7 +3410,7 @@ yy216:
}
YYDEBUG(218, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1691 "Zend/zend_language_scanner.l"
+#line 1833 "Zend/zend_language_scanner.l"
{
char *hex = yytext + 2; /* Skip "0x" */
int len = yyleng - 2;
@@ -3251,15 +3430,15 @@ yy216:
ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16));
ZEND_ASSERT(!errno && end == hex + len);
}
- RETURN_TOKEN(T_LNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
} else {
ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, (const char **)&end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
ZEND_ASSERT(end == hex + len);
- RETURN_TOKEN(T_DNUMBER);
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
-#line 3263 "Zend/zend_language_scanner.c"
+#line 3442 "Zend/zend_language_scanner.c"
yy219:
YYDEBUG(219, *YYCURSOR);
++YYCURSOR;
@@ -3294,41 +3473,41 @@ yy221:
++YYCURSOR;
YYDEBUG(222, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1529 "Zend/zend_language_scanner.l"
+#line 1664 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SL_EQUAL);
}
-#line 3302 "Zend/zend_language_scanner.c"
+#line 3481 "Zend/zend_language_scanner.c"
yy223:
YYDEBUG(223, *YYCURSOR);
++YYCURSOR;
YYDEBUG(224, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1485 "Zend/zend_language_scanner.l"
+#line 1620 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SPACESHIP);
}
-#line 3312 "Zend/zend_language_scanner.c"
+#line 3491 "Zend/zend_language_scanner.c"
yy225:
YYDEBUG(225, *YYCURSOR);
++YYCURSOR;
YYDEBUG(226, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1604 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IS_IDENTICAL);
}
-#line 3322 "Zend/zend_language_scanner.c"
+#line 3501 "Zend/zend_language_scanner.c"
yy227:
YYDEBUG(227, *YYCURSOR);
++YYCURSOR;
YYDEBUG(228, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1533 "Zend/zend_language_scanner.l"
+#line 1668 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SR_EQUAL);
}
-#line 3332 "Zend/zend_language_scanner.c"
+#line 3511 "Zend/zend_language_scanner.c"
yy229:
YYDEBUG(229, *YYCURSOR);
++YYCURSOR;
@@ -3352,11 +3531,11 @@ yy232:
}
YYDEBUG(233, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1561 "Zend/zend_language_scanner.l"
+#line 1696 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_AND);
}
-#line 3360 "Zend/zend_language_scanner.c"
+#line 3539 "Zend/zend_language_scanner.c"
yy234:
YYDEBUG(234, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3437,11 +3616,11 @@ yy245:
}
YYDEBUG(246, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1129 "Zend/zend_language_scanner.l"
+#line 1266 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXIT);
}
-#line 3445 "Zend/zend_language_scanner.c"
+#line 3624 "Zend/zend_language_scanner.c"
yy247:
YYDEBUG(247, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3523,11 +3702,11 @@ yy255:
yy256:
YYDEBUG(256, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1199 "Zend/zend_language_scanner.l"
+#line 1336 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FOR);
}
-#line 3531 "Zend/zend_language_scanner.c"
+#line 3710 "Zend/zend_language_scanner.c"
yy257:
YYDEBUG(257, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3596,11 +3775,11 @@ yy267:
}
YYDEBUG(268, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1329 "Zend/zend_language_scanner.l"
+#line 1464 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NEW);
}
-#line 3604 "Zend/zend_language_scanner.c"
+#line 3783 "Zend/zend_language_scanner.c"
yy269:
YYDEBUG(269, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3673,11 +3852,11 @@ yy278:
}
YYDEBUG(279, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1155 "Zend/zend_language_scanner.l"
+#line 1292 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRY);
}
-#line 3681 "Zend/zend_language_scanner.c"
+#line 3860 "Zend/zend_language_scanner.c"
yy280:
YYDEBUG(280, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3692,11 +3871,11 @@ yy281:
}
YYDEBUG(282, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1393 "Zend/zend_language_scanner.l"
+#line 1528 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_USE);
}
-#line 3700 "Zend/zend_language_scanner.c"
+#line 3879 "Zend/zend_language_scanner.c"
yy283:
YYDEBUG(283, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3705,11 +3884,11 @@ yy283:
}
YYDEBUG(284, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1337 "Zend/zend_language_scanner.l"
+#line 1472 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_VAR);
}
-#line 3713 "Zend/zend_language_scanner.c"
+#line 3892 "Zend/zend_language_scanner.c"
yy285:
YYDEBUG(285, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3724,11 +3903,11 @@ yy286:
}
YYDEBUG(287, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1565 "Zend/zend_language_scanner.l"
+#line 1700 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LOGICAL_XOR);
}
-#line 3732 "Zend/zend_language_scanner.c"
+#line 3911 "Zend/zend_language_scanner.c"
yy288:
YYDEBUG(288, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3942,11 +4121,11 @@ yy317:
}
YYDEBUG(318, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1239 "Zend/zend_language_scanner.l"
+#line 1376 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CASE);
}
-#line 3950 "Zend/zend_language_scanner.c"
+#line 4129 "Zend/zend_language_scanner.c"
yy319:
YYDEBUG(319, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3997,11 +4176,11 @@ yy326:
}
YYDEBUG(327, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1259 "Zend/zend_language_scanner.l"
+#line 1396 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ECHO);
}
-#line 4005 "Zend/zend_language_scanner.c"
+#line 4184 "Zend/zend_language_scanner.c"
yy328:
YYDEBUG(328, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4025,11 +4204,11 @@ yy328:
yy329:
YYDEBUG(329, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1183 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELSE);
}
-#line 4033 "Zend/zend_language_scanner.c"
+#line 4212 "Zend/zend_language_scanner.c"
yy330:
YYDEBUG(330, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4074,11 +4253,11 @@ yy336:
}
YYDEBUG(337, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1369 "Zend/zend_language_scanner.l"
+#line 1504 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EVAL);
}
-#line 4082 "Zend/zend_language_scanner.c"
+#line 4261 "Zend/zend_language_scanner.c"
yy338:
YYDEBUG(338, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4087,11 +4266,11 @@ yy338:
}
YYDEBUG(339, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1125 "Zend/zend_language_scanner.l"
+#line 1262 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXIT);
}
-#line 4095 "Zend/zend_language_scanner.c"
+#line 4274 "Zend/zend_language_scanner.c"
yy340:
YYDEBUG(340, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4130,11 +4309,11 @@ yy345:
}
YYDEBUG(346, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1255 "Zend/zend_language_scanner.l"
+#line 1392 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_GOTO);
}
-#line 4138 "Zend/zend_language_scanner.c"
+#line 4317 "Zend/zend_language_scanner.c"
yy347:
YYDEBUG(347, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4183,11 +4362,11 @@ yy352:
}
YYDEBUG(353, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1449 "Zend/zend_language_scanner.l"
+#line 1584 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LIST);
}
-#line 4191 "Zend/zend_language_scanner.c"
+#line 4370 "Zend/zend_language_scanner.c"
yy354:
YYDEBUG(354, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4374,11 +4553,11 @@ yy383:
++YYCURSOR;
YYDEBUG(385, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1341 "Zend/zend_language_scanner.l"
+#line 1476 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INT_CAST);
}
-#line 4382 "Zend/zend_language_scanner.c"
+#line 4561 "Zend/zend_language_scanner.c"
yy386:
YYDEBUG(386, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4475,11 +4654,13 @@ yy396:
yy397:
YYDEBUG(397, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2080 "Zend/zend_language_scanner.l"
+#line 2270 "Zend/zend_language_scanner.l"
{
char *s;
- int bprefix = (yytext[0] != '<') ? 1 : 0;
+ unsigned char *saved_cursor;
+ int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0;
zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label));
+ zend_bool is_heredoc = 1;
CG(zend_lineno)++;
heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0);
@@ -4492,6 +4673,7 @@ yy397:
if (*s == '\'') {
s++;
heredoc_label->length -= 2;
+ is_heredoc = 0;
BEGIN(ST_NOWDOC);
} else {
@@ -4504,25 +4686,107 @@ yy397:
}
heredoc_label->label = estrndup(s, heredoc_label->length);
+ heredoc_label->indentation = 0;
+ saved_cursor = YYCURSOR;
+
+ zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ YYCURSOR = saved_cursor;
+ RETURN_TOKEN(T_START_HEREDOC);
+ }
/* Check for ending label on the next line */
if (heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (!IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
+ }
- if (*end == ';') {
- end++;
- }
+ YYCURSOR = saved_cursor;
+ heredoc_label->indentation = indentation;
- if (*end == '\n' || *end == '\r') {
BEGIN(ST_END_HEREDOC);
+ RETURN_TOKEN(T_START_HEREDOC);
}
}
- zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label);
+ YYCURSOR = saved_cursor;
+
+ if (is_heredoc && !SCNG(heredoc_scan_ahead)) {
+ zend_lex_state current_state;
+ int heredoc_nesting_level = 1;
+ int first_token = 0;
+
+ zend_save_lexical_state(&current_state);
+
+ SCNG(heredoc_scan_ahead) = 1;
+ SCNG(heredoc_indentation) = 0;
+ SCNG(heredoc_indentation_uses_spaces) = 0;
+ LANG_SCNG(on_event) = NULL;
+
+ zend_ptr_stack_reverse_apply(&current_state.heredoc_label_stack, copy_heredoc_label_stack);
+
+ zend_exception_save();
+ while (heredoc_nesting_level) {
+ zval zv;
+ int retval;
+
+ ZVAL_UNDEF(&zv);
+ retval = lex_scan(&zv, NULL);
+ zval_ptr_dtor_nogc(&zv);
+
+ if (EG(exception)) {
+ zend_clear_exception();
+ break;
+ }
+
+ if (!first_token) {
+ first_token = retval;
+ }
+
+ switch (retval) {
+ case T_START_HEREDOC:
+ ++heredoc_nesting_level;
+ break;
+ case T_END_HEREDOC:
+ --heredoc_nesting_level;
+ break;
+ case END:
+ heredoc_nesting_level = 0;
+ }
+ }
+ zend_exception_restore();
+
+ if (
+ (first_token == T_VARIABLE
+ || first_token == T_DOLLAR_OPEN_CURLY_BRACES
+ || first_token == T_CURLY_OPEN
+ ) && SCNG(heredoc_indentation)) {
+ zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation));
+ }
+
+ heredoc_label->indentation = SCNG(heredoc_indentation);
+ heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces);
+
+ zend_restore_lexical_state(&current_state);
+ SCNG(heredoc_scan_ahead) = 0;
+ CG(increment_lineno) = 0;
+ }
RETURN_TOKEN(T_START_HEREDOC);
}
-#line 4526 "Zend/zend_language_scanner.c"
+#line 4790 "Zend/zend_language_scanner.c"
yy398:
YYDEBUG(398, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4542,11 +4806,11 @@ yy400:
}
YYDEBUG(401, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1453 "Zend/zend_language_scanner.l"
+#line 1588 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ARRAY);
}
-#line 4550 "Zend/zend_language_scanner.c"
+#line 4814 "Zend/zend_language_scanner.c"
yy402:
YYDEBUG(402, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4555,11 +4819,11 @@ yy402:
}
YYDEBUG(403, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1247 "Zend/zend_language_scanner.l"
+#line 1384 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BREAK);
}
-#line 4563 "Zend/zend_language_scanner.c"
+#line 4827 "Zend/zend_language_scanner.c"
yy404:
YYDEBUG(404, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4574,11 +4838,11 @@ yy405:
}
YYDEBUG(406, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1159 "Zend/zend_language_scanner.l"
+#line 1296 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CATCH);
}
-#line 4582 "Zend/zend_language_scanner.c"
+#line 4846 "Zend/zend_language_scanner.c"
yy407:
YYDEBUG(407, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4587,11 +4851,11 @@ yy407:
}
YYDEBUG(408, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1267 "Zend/zend_language_scanner.l"
+#line 1404 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLASS);
}
-#line 4595 "Zend/zend_language_scanner.c"
+#line 4859 "Zend/zend_language_scanner.c"
yy409:
YYDEBUG(409, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4600,11 +4864,11 @@ yy409:
}
YYDEBUG(410, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1333 "Zend/zend_language_scanner.l"
+#line 1468 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLONE);
}
-#line 4608 "Zend/zend_language_scanner.c"
+#line 4872 "Zend/zend_language_scanner.c"
yy411:
YYDEBUG(411, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4613,11 +4877,11 @@ yy411:
}
YYDEBUG(412, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1137 "Zend/zend_language_scanner.l"
+#line 1274 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONST);
}
-#line 4621 "Zend/zend_language_scanner.c"
+#line 4885 "Zend/zend_language_scanner.c"
yy413:
YYDEBUG(413, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4650,11 +4914,11 @@ yy417:
}
YYDEBUG(418, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1409 "Zend/zend_language_scanner.l"
+#line 1544 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EMPTY);
}
-#line 4658 "Zend/zend_language_scanner.c"
+#line 4922 "Zend/zend_language_scanner.c"
yy419:
YYDEBUG(419, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4675,11 +4939,11 @@ yy421:
}
YYDEBUG(422, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1179 "Zend/zend_language_scanner.l"
+#line 1316 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDIF);
}
-#line 4683 "Zend/zend_language_scanner.c"
+#line 4947 "Zend/zend_language_scanner.c"
yy423:
YYDEBUG(423, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4721,11 +4985,11 @@ yy426:
yy427:
YYDEBUG(427, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1425 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FINAL);
}
-#line 4729 "Zend/zend_language_scanner.c"
+#line 4993 "Zend/zend_language_scanner.c"
yy428:
YYDEBUG(428, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4782,11 +5046,11 @@ yy436:
}
YYDEBUG(437, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1405 "Zend/zend_language_scanner.l"
+#line 1540 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ISSET);
}
-#line 4790 "Zend/zend_language_scanner.c"
+#line 5054 "Zend/zend_language_scanner.c"
yy438:
YYDEBUG(438, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4801,11 +5065,11 @@ yy439:
}
YYDEBUG(440, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1263 "Zend/zend_language_scanner.l"
+#line 1400 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PRINT);
}
-#line 4809 "Zend/zend_language_scanner.c"
+#line 5073 "Zend/zend_language_scanner.c"
yy441:
YYDEBUG(441, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4856,11 +5120,11 @@ yy448:
}
YYDEBUG(449, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1167 "Zend/zend_language_scanner.l"
+#line 1304 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_THROW);
}
-#line 4864 "Zend/zend_language_scanner.c"
+#line 5128 "Zend/zend_language_scanner.c"
yy450:
YYDEBUG(450, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4869,11 +5133,11 @@ yy450:
}
YYDEBUG(451, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1275 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRAIT);
}
-#line 4877 "Zend/zend_language_scanner.c"
+#line 5141 "Zend/zend_language_scanner.c"
yy452:
YYDEBUG(452, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4882,11 +5146,11 @@ yy452:
}
YYDEBUG(453, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1441 "Zend/zend_language_scanner.l"
+#line 1576 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_UNSET);
}
-#line 4890 "Zend/zend_language_scanner.c"
+#line 5154 "Zend/zend_language_scanner.c"
yy454:
YYDEBUG(454, *YYCURSOR);
yych = *++YYCURSOR;
@@ -4895,11 +5159,11 @@ yy454:
}
YYDEBUG(455, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1187 "Zend/zend_language_scanner.l"
+#line 1324 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_WHILE);
}
-#line 4903 "Zend/zend_language_scanner.c"
+#line 5167 "Zend/zend_language_scanner.c"
yy456:
YYDEBUG(456, *YYCURSOR);
yyaccept = 6;
@@ -4917,11 +5181,11 @@ yy456:
yy457:
YYDEBUG(457, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1151 "Zend/zend_language_scanner.l"
+#line 1288 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_YIELD);
}
-#line 4925 "Zend/zend_language_scanner.c"
+#line 5189 "Zend/zend_language_scanner.c"
yy458:
YYDEBUG(458, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5013,11 +5277,11 @@ yy471:
++YYCURSOR;
YYDEBUG(473, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1361 "Zend/zend_language_scanner.l"
+#line 1496 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_BOOL_CAST);
}
-#line 5021 "Zend/zend_language_scanner.c"
+#line 5285 "Zend/zend_language_scanner.c"
yy474:
YYDEBUG(474, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5047,11 +5311,11 @@ yy478:
++YYCURSOR;
YYDEBUG(479, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1345 "Zend/zend_language_scanner.l"
+#line 1480 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DOUBLE_CAST);
}
-#line 5055 "Zend/zend_language_scanner.c"
+#line 5319 "Zend/zend_language_scanner.c"
yy480:
YYDEBUG(480, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5116,11 +5380,11 @@ yy489:
}
YYDEBUG(490, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1175 "Zend/zend_language_scanner.l"
+#line 1312 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ELSEIF);
}
-#line 5124 "Zend/zend_language_scanner.c"
+#line 5388 "Zend/zend_language_scanner.c"
yy491:
YYDEBUG(491, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5150,11 +5414,11 @@ yy492:
yy493:
YYDEBUG(493, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1203 "Zend/zend_language_scanner.l"
+#line 1340 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDFOR);
}
-#line 5158 "Zend/zend_language_scanner.c"
+#line 5422 "Zend/zend_language_scanner.c"
yy494:
YYDEBUG(494, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5199,11 +5463,11 @@ yy500:
}
YYDEBUG(501, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1401 "Zend/zend_language_scanner.l"
+#line 1536 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_GLOBAL);
}
-#line 5207 "Zend/zend_language_scanner.c"
+#line 5471 "Zend/zend_language_scanner.c"
yy502:
YYDEBUG(502, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5260,11 +5524,11 @@ yy510:
}
YYDEBUG(511, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1572 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PUBLIC);
}
-#line 5268 "Zend/zend_language_scanner.c"
+#line 5532 "Zend/zend_language_scanner.c"
yy512:
YYDEBUG(512, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5279,11 +5543,11 @@ yy513:
}
YYDEBUG(514, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1141 "Zend/zend_language_scanner.l"
+#line 1278 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_RETURN);
}
-#line 5287 "Zend/zend_language_scanner.c"
+#line 5551 "Zend/zend_language_scanner.c"
yy515:
YYDEBUG(515, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5292,11 +5556,11 @@ yy515:
}
YYDEBUG(516, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1417 "Zend/zend_language_scanner.l"
+#line 1552 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_STATIC);
}
-#line 5300 "Zend/zend_language_scanner.c"
+#line 5564 "Zend/zend_language_scanner.c"
yy517:
YYDEBUG(517, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5305,11 +5569,11 @@ yy517:
}
YYDEBUG(518, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1231 "Zend/zend_language_scanner.l"
+#line 1368 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_SWITCH);
}
-#line 5313 "Zend/zend_language_scanner.c"
+#line 5577 "Zend/zend_language_scanner.c"
yy519:
YYDEBUG(519, *YYCURSOR);
++YYCURSOR;
@@ -5389,11 +5653,11 @@ yy530:
++YYCURSOR;
YYDEBUG(531, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1353 "Zend/zend_language_scanner.l"
+#line 1488 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ARRAY_CAST);
}
-#line 5397 "Zend/zend_language_scanner.c"
+#line 5661 "Zend/zend_language_scanner.c"
yy532:
YYDEBUG(532, *YYCURSOR);
++YYCURSOR;
@@ -5439,11 +5703,11 @@ yy538:
++YYCURSOR;
YYDEBUG(539, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1365 "Zend/zend_language_scanner.l"
+#line 1500 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_UNSET_CAST);
}
-#line 5447 "Zend/zend_language_scanner.c"
+#line 5711 "Zend/zend_language_scanner.c"
yy540:
YYDEBUG(540, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5470,11 +5734,11 @@ yy543:
}
YYDEBUG(544, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1215 "Zend/zend_language_scanner.l"
+#line 1352 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DECLARE);
}
-#line 5478 "Zend/zend_language_scanner.c"
+#line 5742 "Zend/zend_language_scanner.c"
yy545:
YYDEBUG(545, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5483,11 +5747,11 @@ yy545:
}
YYDEBUG(546, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1243 "Zend/zend_language_scanner.l"
+#line 1380 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DEFAULT);
}
-#line 5491 "Zend/zend_language_scanner.c"
+#line 5755 "Zend/zend_language_scanner.c"
yy547:
YYDEBUG(547, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5520,11 +5784,11 @@ yy551:
}
YYDEBUG(552, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1279 "Zend/zend_language_scanner.l"
+#line 1416 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_EXTENDS);
}
-#line 5528 "Zend/zend_language_scanner.c"
+#line 5792 "Zend/zend_language_scanner.c"
yy553:
YYDEBUG(553, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5533,11 +5797,11 @@ yy553:
}
YYDEBUG(554, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1163 "Zend/zend_language_scanner.l"
+#line 1300 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FINALLY);
}
-#line 5541 "Zend/zend_language_scanner.c"
+#line 5805 "Zend/zend_language_scanner.c"
yy555:
YYDEBUG(555, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5546,11 +5810,11 @@ yy555:
}
YYDEBUG(556, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1207 "Zend/zend_language_scanner.l"
+#line 1344 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FOREACH);
}
-#line 5554 "Zend/zend_language_scanner.c"
+#line 5818 "Zend/zend_language_scanner.c"
yy557:
YYDEBUG(557, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5584,11 +5848,11 @@ yy559:
yy560:
YYDEBUG(560, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1373 "Zend/zend_language_scanner.l"
+#line 1508 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INCLUDE);
}
-#line 5592 "Zend/zend_language_scanner.c"
+#line 5856 "Zend/zend_language_scanner.c"
yy561:
YYDEBUG(561, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5621,11 +5885,11 @@ yy565:
}
YYDEBUG(566, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1429 "Zend/zend_language_scanner.l"
+#line 1564 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PRIVATE);
}
-#line 5629 "Zend/zend_language_scanner.c"
+#line 5893 "Zend/zend_language_scanner.c"
yy567:
YYDEBUG(567, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5653,11 +5917,11 @@ yy568:
yy569:
YYDEBUG(569, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1381 "Zend/zend_language_scanner.l"
+#line 1516 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_REQUIRE);
}
-#line 5661 "Zend/zend_language_scanner.c"
+#line 5925 "Zend/zend_language_scanner.c"
yy570:
YYDEBUG(570, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5677,11 +5941,11 @@ yy572:
}
YYDEBUG(573, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1773 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_DIR);
}
-#line 5685 "Zend/zend_language_scanner.c"
+#line 5949 "Zend/zend_language_scanner.c"
yy574:
YYDEBUG(574, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5726,21 +5990,21 @@ yy581:
++YYCURSOR;
YYDEBUG(582, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1349 "Zend/zend_language_scanner.l"
+#line 1484 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_STRING_CAST);
}
-#line 5734 "Zend/zend_language_scanner.c"
+#line 5998 "Zend/zend_language_scanner.c"
yy583:
YYDEBUG(583, *YYCURSOR);
++YYCURSOR;
YYDEBUG(584, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1357 "Zend/zend_language_scanner.l"
+#line 1492 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OBJECT_CAST);
}
-#line 5744 "Zend/zend_language_scanner.c"
+#line 6008 "Zend/zend_language_scanner.c"
yy585:
YYDEBUG(585, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5749,11 +6013,11 @@ yy585:
}
YYDEBUG(586, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1421 "Zend/zend_language_scanner.l"
+#line 1556 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ABSTRACT);
}
-#line 5757 "Zend/zend_language_scanner.c"
+#line 6021 "Zend/zend_language_scanner.c"
yy587:
YYDEBUG(587, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5762,11 +6026,11 @@ yy587:
}
YYDEBUG(588, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1457 "Zend/zend_language_scanner.l"
+#line 1592 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CALLABLE);
}
-#line 5770 "Zend/zend_language_scanner.c"
+#line 6034 "Zend/zend_language_scanner.c"
yy589:
YYDEBUG(589, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5775,11 +6039,11 @@ yy589:
}
YYDEBUG(590, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1251 "Zend/zend_language_scanner.l"
+#line 1388 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CONTINUE);
}
-#line 5783 "Zend/zend_language_scanner.c"
+#line 6047 "Zend/zend_language_scanner.c"
yy591:
YYDEBUG(591, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5806,11 +6070,11 @@ yy594:
}
YYDEBUG(595, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1191 "Zend/zend_language_scanner.l"
+#line 1328 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDWHILE);
}
-#line 5814 "Zend/zend_language_scanner.c"
+#line 6078 "Zend/zend_language_scanner.c"
yy596:
YYDEBUG(596, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5819,11 +6083,11 @@ yy596:
}
YYDEBUG(597, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1133 "Zend/zend_language_scanner.l"
+#line 1270 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FUNCTION);
}
-#line 5827 "Zend/zend_language_scanner.c"
+#line 6091 "Zend/zend_language_scanner.c"
yy598:
YYDEBUG(598, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5891,11 +6155,11 @@ yy608:
}
YYDEBUG(609, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1769 "Zend/zend_language_scanner.l"
+#line 1915 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FILE);
}
-#line 5899 "Zend/zend_language_scanner.c"
+#line 6163 "Zend/zend_language_scanner.c"
yy610:
YYDEBUG(610, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5916,11 +6180,11 @@ yy612:
}
YYDEBUG(613, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1765 "Zend/zend_language_scanner.l"
+#line 1911 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_LINE);
}
-#line 5924 "Zend/zend_language_scanner.c"
+#line 6188 "Zend/zend_language_scanner.c"
yy614:
YYDEBUG(614, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5957,11 +6221,11 @@ yy619:
}
YYDEBUG(620, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1235 "Zend/zend_language_scanner.l"
+#line 1372 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDSWITCH);
}
-#line 5965 "Zend/zend_language_scanner.c"
+#line 6229 "Zend/zend_language_scanner.c"
yy621:
YYDEBUG(621, *YYCURSOR);
yych = *++YYCURSOR;
@@ -5988,11 +6252,11 @@ yy624:
}
YYDEBUG(625, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1397 "Zend/zend_language_scanner.l"
+#line 1532 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INSTEADOF);
}
-#line 5996 "Zend/zend_language_scanner.c"
+#line 6260 "Zend/zend_language_scanner.c"
yy626:
YYDEBUG(626, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6001,11 +6265,11 @@ yy626:
}
YYDEBUG(627, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1271 "Zend/zend_language_scanner.l"
+#line 1408 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INTERFACE);
}
-#line 6009 "Zend/zend_language_scanner.c"
+#line 6273 "Zend/zend_language_scanner.c"
yy628:
YYDEBUG(628, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6014,11 +6278,11 @@ yy628:
}
YYDEBUG(629, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1389 "Zend/zend_language_scanner.l"
+#line 1524 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NAMESPACE);
}
-#line 6022 "Zend/zend_language_scanner.c"
+#line 6286 "Zend/zend_language_scanner.c"
yy630:
YYDEBUG(630, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6027,11 +6291,11 @@ yy630:
}
YYDEBUG(631, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1433 "Zend/zend_language_scanner.l"
+#line 1568 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_PROTECTED);
}
-#line 6035 "Zend/zend_language_scanner.c"
+#line 6299 "Zend/zend_language_scanner.c"
yy632:
YYDEBUG(632, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6052,11 +6316,11 @@ yy634:
}
YYDEBUG(635, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1749 "Zend/zend_language_scanner.l"
+#line 1895 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_CLASS_C);
}
-#line 6060 "Zend/zend_language_scanner.c"
+#line 6324 "Zend/zend_language_scanner.c"
yy636:
YYDEBUG(636, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6088,11 +6352,11 @@ yy640:
}
YYDEBUG(641, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1753 "Zend/zend_language_scanner.l"
+#line 1899 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_TRAIT_C);
}
-#line 6096 "Zend/zend_language_scanner.c"
+#line 6360 "Zend/zend_language_scanner.c"
yy642:
YYDEBUG(642, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6101,11 +6365,11 @@ yy642:
}
YYDEBUG(643, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1219 "Zend/zend_language_scanner.l"
+#line 1356 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDDECLARE);
}
-#line 6109 "Zend/zend_language_scanner.c"
+#line 6373 "Zend/zend_language_scanner.c"
yy644:
YYDEBUG(644, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6114,11 +6378,11 @@ yy644:
}
YYDEBUG(645, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1211 "Zend/zend_language_scanner.l"
+#line 1348 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_ENDFOREACH);
}
-#line 6122 "Zend/zend_language_scanner.c"
+#line 6386 "Zend/zend_language_scanner.c"
yy646:
YYDEBUG(646, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6127,11 +6391,11 @@ yy646:
}
YYDEBUG(647, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1283 "Zend/zend_language_scanner.l"
+#line 1420 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_IMPLEMENTS);
}
-#line 6135 "Zend/zend_language_scanner.c"
+#line 6399 "Zend/zend_language_scanner.c"
yy648:
YYDEBUG(648, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6146,11 +6410,11 @@ yy649:
}
YYDEBUG(650, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1223 "Zend/zend_language_scanner.l"
+#line 1360 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INSTANCEOF);
}
-#line 6154 "Zend/zend_language_scanner.c"
+#line 6418 "Zend/zend_language_scanner.c"
yy651:
YYDEBUG(651, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6198,11 +6462,11 @@ yy655:
}
YYDEBUG(656, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1761 "Zend/zend_language_scanner.l"
+#line 1907 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_METHOD_C);
}
-#line 6206 "Zend/zend_language_scanner.c"
+#line 6470 "Zend/zend_language_scanner.c"
yy657:
YYDEBUG(657, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6226,13 +6490,13 @@ yy660:
++YYCURSOR;
YYDEBUG(661, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1145 "Zend/zend_language_scanner.l"
+#line 1282 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
HANDLE_NEWLINES(yytext, yyleng);
RETURN_TOKEN(T_YIELD_FROM);
}
-#line 6236 "Zend/zend_language_scanner.c"
+#line 6500 "Zend/zend_language_scanner.c"
yy662:
YYDEBUG(662, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6257,11 +6521,11 @@ yy665:
}
YYDEBUG(666, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1377 "Zend/zend_language_scanner.l"
+#line 1512 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_INCLUDE_ONCE);
}
-#line 6265 "Zend/zend_language_scanner.c"
+#line 6529 "Zend/zend_language_scanner.c"
yy667:
YYDEBUG(667, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6270,11 +6534,11 @@ yy667:
}
YYDEBUG(668, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1385 "Zend/zend_language_scanner.l"
+#line 1520 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_REQUIRE_ONCE);
}
-#line 6278 "Zend/zend_language_scanner.c"
+#line 6542 "Zend/zend_language_scanner.c"
yy669:
YYDEBUG(669, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6283,11 +6547,11 @@ yy669:
}
YYDEBUG(670, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1757 "Zend/zend_language_scanner.l"
+#line 1903 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_FUNC_C);
}
-#line 6291 "Zend/zend_language_scanner.c"
+#line 6555 "Zend/zend_language_scanner.c"
yy671:
YYDEBUG(671, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6313,11 +6577,11 @@ yy674:
}
YYDEBUG(675, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1777 "Zend/zend_language_scanner.l"
+#line 1923 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_NS_C);
}
-#line 6321 "Zend/zend_language_scanner.c"
+#line 6585 "Zend/zend_language_scanner.c"
yy676:
YYDEBUG(676, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6331,11 +6595,11 @@ yy677:
}
YYDEBUG(678, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1413 "Zend/zend_language_scanner.l"
+#line 1548 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_HALT_COMPILER);
}
-#line 6339 "Zend/zend_language_scanner.c"
+#line 6603 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_LOOKING_FOR_PROPERTY:
@@ -6401,13 +6665,13 @@ yy681:
yy682:
YYDEBUG(682, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1307 "Zend/zend_language_scanner.l"
+#line 1442 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
goto restart;
}
-#line 6411 "Zend/zend_language_scanner.c"
+#line 6675 "Zend/zend_language_scanner.c"
yy683:
YYDEBUG(683, *YYCURSOR);
++YYCURSOR;
@@ -6419,12 +6683,11 @@ yy683:
}
YYDEBUG(685, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1292 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
{
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_WHITESPACE);
+ goto return_whitespace;
}
-#line 6428 "Zend/zend_language_scanner.c"
+#line 6691 "Zend/zend_language_scanner.c"
yy686:
YYDEBUG(686, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6441,23 +6704,22 @@ yy687:
}
YYDEBUG(689, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1301 "Zend/zend_language_scanner.l"
+#line 1437 "Zend/zend_language_scanner.l"
{
yy_pop_state();
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 6451 "Zend/zend_language_scanner.c"
+#line 6713 "Zend/zend_language_scanner.c"
yy690:
YYDEBUG(690, *YYCURSOR);
++YYCURSOR;
YYDEBUG(691, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1297 "Zend/zend_language_scanner.l"
+#line 1433 "Zend/zend_language_scanner.l"
{
RETURN_TOKEN(T_OBJECT_OPERATOR);
}
-#line 6461 "Zend/zend_language_scanner.c"
+#line 6723 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_BACKQUOTE:
@@ -6510,7 +6772,7 @@ yyc_ST_BACKQUOTE:
yy695:
YYDEBUG(695, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2217 "Zend/zend_language_scanner.l"
+#line 2495 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -6548,10 +6810,14 @@ yy695:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '`');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '`') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
-#line 6555 "Zend/zend_language_scanner.c"
+#line 6821 "Zend/zend_language_scanner.c"
yy696:
YYDEBUG(696, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6575,12 +6841,12 @@ yy697:
++YYCURSOR;
YYDEBUG(698, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2161 "Zend/zend_language_scanner.l"
+#line 2435 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN('`');
}
-#line 6584 "Zend/zend_language_scanner.c"
+#line 6850 "Zend/zend_language_scanner.c"
yy699:
YYDEBUG(699, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6601,36 +6867,34 @@ yy700:
yy702:
YYDEBUG(702, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6610 "Zend/zend_language_scanner.c"
+#line 6875 "Zend/zend_language_scanner.c"
yy703:
YYDEBUG(703, *YYCURSOR);
++YYCURSOR;
YYDEBUG(704, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 6621 "Zend/zend_language_scanner.c"
+#line 6886 "Zend/zend_language_scanner.c"
yy705:
YYDEBUG(705, *YYCURSOR);
++YYCURSOR;
YYDEBUG(706, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 6634 "Zend/zend_language_scanner.c"
+#line 6898 "Zend/zend_language_scanner.c"
yy707:
YYDEBUG(707, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6644,14 +6908,13 @@ yy709:
++YYCURSOR;
YYDEBUG(710, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6655 "Zend/zend_language_scanner.c"
+#line 6918 "Zend/zend_language_scanner.c"
yy711:
YYDEBUG(711, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6669,14 +6932,13 @@ yy712:
++YYCURSOR;
YYDEBUG(713, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6680 "Zend/zend_language_scanner.c"
+#line 6942 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_DOUBLE_QUOTES:
@@ -6729,7 +6991,7 @@ yyc_ST_DOUBLE_QUOTES:
yy717:
YYDEBUG(717, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2167 "Zend/zend_language_scanner.l"
+#line 2441 "Zend/zend_language_scanner.l"
{
if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -6775,21 +7037,25 @@ yy717:
double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
- zend_scan_escape_string(zendlval, yytext, yyleng, '"');
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '"') == SUCCESS)
+ || !PARSER_MODE()) {
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ } else {
+ RETURN_TOKEN(T_ERROR);
+ }
}
-#line 6782 "Zend/zend_language_scanner.c"
+#line 7048 "Zend/zend_language_scanner.c"
yy718:
YYDEBUG(718, *YYCURSOR);
++YYCURSOR;
YYDEBUG(719, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2156 "Zend/zend_language_scanner.l"
+#line 2430 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN('"');
}
-#line 6793 "Zend/zend_language_scanner.c"
+#line 7059 "Zend/zend_language_scanner.c"
yy720:
YYDEBUG(720, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6828,36 +7094,34 @@ yy722:
yy724:
YYDEBUG(724, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6837 "Zend/zend_language_scanner.c"
+#line 7102 "Zend/zend_language_scanner.c"
yy725:
YYDEBUG(725, *YYCURSOR);
++YYCURSOR;
YYDEBUG(726, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 6848 "Zend/zend_language_scanner.c"
+#line 7113 "Zend/zend_language_scanner.c"
yy727:
YYDEBUG(727, *YYCURSOR);
++YYCURSOR;
YYDEBUG(728, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 6861 "Zend/zend_language_scanner.c"
+#line 7125 "Zend/zend_language_scanner.c"
yy729:
YYDEBUG(729, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6871,14 +7135,13 @@ yy731:
++YYCURSOR;
YYDEBUG(732, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6882 "Zend/zend_language_scanner.c"
+#line 7145 "Zend/zend_language_scanner.c"
yy733:
YYDEBUG(733, *YYCURSOR);
yych = *++YYCURSOR;
@@ -6896,14 +7159,13 @@ yy734:
++YYCURSOR;
YYDEBUG(735, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 6907 "Zend/zend_language_scanner.c"
+#line 7169 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_HEREDOC:
@@ -6952,11 +7214,10 @@ yyc_ST_HEREDOC:
yy739:
YYDEBUG(739, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2259 "Zend/zend_language_scanner.l"
+#line 2541 "Zend/zend_language_scanner.l"
{
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = 0;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -6972,28 +7233,55 @@ yy739:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto heredoc_scan_done;
+ if (SCNG(heredoc_scan_ahead)) {
+ SCNG(heredoc_indentation) = indentation;
+ SCNG(heredoc_indentation_uses_spaces) = (spacing == HEREDOC_USING_SPACES);
+ } else {
+ YYCURSOR -= indentation;
}
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto heredoc_scan_done;
}
continue;
case '$':
@@ -7020,12 +7308,33 @@ yy739:
}
heredoc_scan_done:
+
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ zend_string *copy = Z_STR_P(zendlval);
+
+ if (!strip_multiline_string_indentation(
+ zendlval, heredoc_label->indentation, heredoc_label->indentation_uses_spaces,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
- zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) {
+ zend_string_efree(copy);
+ RETURN_TOKEN(T_ERROR);
+ }
+
+ zend_string_efree(copy);
+ } else {
+ HANDLE_NEWLINES(yytext, yyleng - newline);
+ }
+
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7029 "Zend/zend_language_scanner.c"
+#line 7338 "Zend/zend_language_scanner.c"
yy740:
YYDEBUG(740, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7064,36 +7373,34 @@ yy742:
yy744:
YYDEBUG(744, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7073 "Zend/zend_language_scanner.c"
+#line 7381 "Zend/zend_language_scanner.c"
yy745:
YYDEBUG(745, *YYCURSOR);
++YYCURSOR;
YYDEBUG(746, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1588 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
{
yy_push_state(ST_LOOKING_FOR_VARNAME);
RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
}
-#line 7084 "Zend/zend_language_scanner.c"
+#line 7392 "Zend/zend_language_scanner.c"
yy747:
YYDEBUG(747, *YYCURSOR);
++YYCURSOR;
YYDEBUG(748, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2423 "Zend/zend_language_scanner.l"
{
- Z_LVAL_P(zendlval) = (zend_long) '{';
yy_push_state(ST_IN_SCRIPTING);
yyless(1);
RETURN_TOKEN(T_CURLY_OPEN);
}
-#line 7097 "Zend/zend_language_scanner.c"
+#line 7404 "Zend/zend_language_scanner.c"
yy749:
YYDEBUG(749, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7107,14 +7414,13 @@ yy751:
++YYCURSOR;
YYDEBUG(752, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 2018 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7118 "Zend/zend_language_scanner.c"
+#line 7424 "Zend/zend_language_scanner.c"
yy753:
YYDEBUG(753, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7132,14 +7438,13 @@ yy754:
++YYCURSOR;
YYDEBUG(755, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 2010 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY);
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7143 "Zend/zend_language_scanner.c"
+#line 7448 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_LOOKING_FOR_VARNAME:
@@ -7196,14 +7501,14 @@ yy758:
yy759:
YYDEBUG(759, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1612 "Zend/zend_language_scanner.l"
+#line 1746 "Zend/zend_language_scanner.l"
{
yyless(0);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
goto restart;
}
-#line 7207 "Zend/zend_language_scanner.c"
+#line 7512 "Zend/zend_language_scanner.c"
yy760:
YYDEBUG(760, *YYCURSOR);
yych = *(YYMARKER = ++YYCURSOR);
@@ -7250,15 +7555,14 @@ yy764:
++YYCURSOR;
YYDEBUG(765, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1603 "Zend/zend_language_scanner.l"
+#line 1738 "Zend/zend_language_scanner.l"
{
yyless(yyleng - 1);
- zend_copy_value(zendlval, yytext, yyleng);
yy_pop_state();
yy_push_state(ST_IN_SCRIPTING);
- RETURN_TOKEN(T_STRING_VARNAME);
+ RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0);
}
-#line 7262 "Zend/zend_language_scanner.c"
+#line 7566 "Zend/zend_language_scanner.c"
}
/* *********************************** */
yyc_ST_VAR_OFFSET:
@@ -7347,7 +7651,7 @@ yy768:
++YYCURSOR;
YYDEBUG(769, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2390 "Zend/zend_language_scanner.l"
+#line 2750 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7356,33 +7660,33 @@ yy768:
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
goto restart;
}
-#line 7360 "Zend/zend_language_scanner.c"
+#line 7664 "Zend/zend_language_scanner.c"
yy770:
YYDEBUG(770, *YYCURSOR);
++YYCURSOR;
YYDEBUG(771, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1884 "Zend/zend_language_scanner.l"
+#line 2038 "Zend/zend_language_scanner.l"
{
/* Invalid rule to return a more explicit parse error with proper line number */
yyless(0);
yy_pop_state();
ZVAL_NULL(zendlval);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7374 "Zend/zend_language_scanner.c"
+#line 7678 "Zend/zend_language_scanner.c"
yy772:
YYDEBUG(772, *YYCURSOR);
++YYCURSOR;
yy773:
YYDEBUG(773, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1879 "Zend/zend_language_scanner.l"
+#line 2033 "Zend/zend_language_scanner.l"
{
/* Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error */
RETURN_TOKEN(yytext[0]);
}
-#line 7386 "Zend/zend_language_scanner.c"
+#line 7690 "Zend/zend_language_scanner.c"
yy774:
YYDEBUG(774, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7417,7 +7721,7 @@ yy775:
yy776:
YYDEBUG(776, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1719 "Zend/zend_language_scanner.l"
+#line 1861 "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)) {
char *end;
@@ -7431,9 +7735,9 @@ yy776:
string:
ZVAL_STRINGL(zendlval, yytext, yyleng);
}
- RETURN_TOKEN(T_NUM_STRING);
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
-#line 7437 "Zend/zend_language_scanner.c"
+#line 7741 "Zend/zend_language_scanner.c"
yy777:
YYDEBUG(777, *YYCURSOR);
++YYCURSOR;
@@ -7455,23 +7759,22 @@ yy779:
}
YYDEBUG(781, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1892 "Zend/zend_language_scanner.l"
+#line 2046 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_STRING);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
}
-#line 7464 "Zend/zend_language_scanner.c"
+#line 7767 "Zend/zend_language_scanner.c"
yy782:
YYDEBUG(782, *YYCURSOR);
++YYCURSOR;
YYDEBUG(783, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1874 "Zend/zend_language_scanner.l"
+#line 2028 "Zend/zend_language_scanner.l"
{
yy_pop_state();
RETURN_TOKEN(']');
}
-#line 7475 "Zend/zend_language_scanner.c"
+#line 7778 "Zend/zend_language_scanner.c"
yy784:
YYDEBUG(784, *YYCURSOR);
++YYCURSOR;
@@ -7496,12 +7799,11 @@ yy784:
yy786:
YYDEBUG(786, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 2024 "Zend/zend_language_scanner.l"
{
- zend_copy_value(zendlval, (yytext+1), (yyleng-1));
- RETURN_TOKEN(T_VARIABLE);
+ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
-#line 7505 "Zend/zend_language_scanner.c"
+#line 7807 "Zend/zend_language_scanner.c"
yy787:
YYDEBUG(787, *YYCURSOR);
++YYCURSOR;
@@ -7513,12 +7815,16 @@ yy787:
yy789:
YYDEBUG(789, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1735 "Zend/zend_language_scanner.l"
+#line 1877 "Zend/zend_language_scanner.l"
{ /* Offset must be treated as a string */
- ZVAL_STRINGL(zendlval, yytext, yyleng);
- RETURN_TOKEN(T_NUM_STRING);
+ if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
+ } else {
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
+ }
+ RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
-#line 7522 "Zend/zend_language_scanner.c"
+#line 7828 "Zend/zend_language_scanner.c"
yy790:
YYDEBUG(790, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7568,7 +7874,7 @@ yyc_INITIAL:
yy800:
YYDEBUG(800, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1804 "Zend/zend_language_scanner.l"
+#line 1959 "Zend/zend_language_scanner.l"
{
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7607,13 +7913,15 @@ inline_char_handler:
if (readsize < yyleng) {
yyless(readsize);
}
+ } else if (yyleng == 1) {
+ ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
} else {
- ZVAL_STRINGL(zendlval, yytext, yyleng);
+ ZVAL_STRINGL(zendlval, yytext, yyleng);
}
HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_INLINE_HTML);
+ RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
}
-#line 7617 "Zend/zend_language_scanner.c"
+#line 7925 "Zend/zend_language_scanner.c"
yy801:
YYDEBUG(801, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7629,27 +7937,33 @@ yy801:
yy803:
YYDEBUG(803, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1795 "Zend/zend_language_scanner.l"
+#line 1947 "Zend/zend_language_scanner.l"
{
if (CG(short_tags)) {
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
} else {
goto inline_char_handler;
}
}
-#line 7642 "Zend/zend_language_scanner.c"
+#line 7953 "Zend/zend_language_scanner.c"
yy804:
YYDEBUG(804, *YYCURSOR);
++YYCURSOR;
YYDEBUG(805, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1782 "Zend/zend_language_scanner.l"
+#line 1928 "Zend/zend_language_scanner.l"
{
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ RETURN_TOKEN(T_ECHO);
+ }
RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
}
-#line 7653 "Zend/zend_language_scanner.c"
+#line 7967 "Zend/zend_language_scanner.c"
yy806:
YYDEBUG(806, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7680,13 +7994,16 @@ yy810:
yy811:
YYDEBUG(811, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 1788 "Zend/zend_language_scanner.l"
+#line 1937 "Zend/zend_language_scanner.l"
{
HANDLE_NEWLINE(yytext[yyleng-1]);
BEGIN(ST_IN_SCRIPTING);
+ if (PARSER_MODE()) {
+ SKIP_TOKEN(T_OPEN_TAG);
+ }
RETURN_TOKEN(T_OPEN_TAG);
}
-#line 7690 "Zend/zend_language_scanner.c"
+#line 8007 "Zend/zend_language_scanner.c"
yy812:
YYDEBUG(812, *YYCURSOR);
yych = *++YYCURSOR;
@@ -7701,12 +8018,12 @@ yyc_ST_END_HEREDOC:
++YYCURSOR;
YYDEBUG(816, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2134 "Zend/zend_language_scanner.l"
+#line 2409 "Zend/zend_language_scanner.l"
{
zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
- YYCURSOR += heredoc_label->length - 1;
- yyleng = heredoc_label->length;
+ yyleng = heredoc_label->indentation + heredoc_label->length;
+ YYCURSOR += yyleng - 1;
heredoc_label_dtor(heredoc_label);
efree(heredoc_label);
@@ -7714,7 +8031,7 @@ yyc_ST_END_HEREDOC:
BEGIN(ST_IN_SCRIPTING);
RETURN_TOKEN(T_END_HEREDOC);
}
-#line 7718 "Zend/zend_language_scanner.c"
+#line 8035 "Zend/zend_language_scanner.c"
/* *********************************** */
yyc_ST_NOWDOC:
YYDEBUG(817, *YYCURSOR);
@@ -7724,11 +8041,10 @@ yyc_ST_NOWDOC:
++YYCURSOR;
YYDEBUG(820, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 2333 "Zend/zend_language_scanner.l"
+#line 2662 "Zend/zend_language_scanner.l"
{
- int newline = 0;
-
zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack));
+ int newline = 0, indentation = 0, spacing = -1;
if (YYCURSOR > YYLIMIT) {
RETURN_TOKEN(END);
@@ -7744,28 +8060,51 @@ yyc_ST_NOWDOC:
}
/* fall through */
case '\n':
+ indentation = spacing = 0;
+
+ while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) {
+ if (*YYCURSOR == '\t') {
+ spacing |= HEREDOC_USING_TABS;
+ } else {
+ spacing |= HEREDOC_USING_SPACES;
+ }
+ ++YYCURSOR;
+ ++indentation;
+ }
+
+ if (YYCURSOR == YYLIMIT) {
+ yyleng = YYCURSOR - SCNG(yy_text);
+ HANDLE_NEWLINES(yytext, yyleng);
+ ZVAL_NULL(zendlval);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
+ }
+
/* Check for ending label on the next line */
if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) {
- YYCTYPE *end = YYCURSOR + heredoc_label->length;
+ if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
+ continue;
+ }
- if (*end == ';') {
- end++;
+ if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) {
+ zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0);
}
- if (*end == '\n' || *end == '\r') {
- /* newline before label will be subtracted from returned text, but
- * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
- if (YYCURSOR[-2] == '\r' && YYCURSOR[-1] == '\n') {
- newline = 2; /* Windows newline */
- } else {
- newline = 1;
- }
+ /* newline before label will be subtracted from returned text, but
+ * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */
+ if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') {
+ newline = 2; /* Windows newline */
+ } else {
+ newline = 1;
+ }
- CG(increment_lineno) = 1; /* For newline before label */
- BEGIN(ST_END_HEREDOC);
+ CG(increment_lineno) = 1; /* For newline before label */
- goto nowdoc_scan_done;
- }
+ YYCURSOR -= indentation;
+ heredoc_label->indentation = indentation;
+
+ BEGIN(ST_END_HEREDOC);
+
+ goto nowdoc_scan_done;
}
/* fall through */
default:
@@ -7775,13 +8114,56 @@ yyc_ST_NOWDOC:
nowdoc_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
+ ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
+
+ if (!EG(exception) && spacing != -1 && PARSER_MODE()) {
+ zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ if (!strip_multiline_string_indentation(
+ zendlval, indentation, spacing == HEREDOC_USING_SPACES,
+ newline_at_start, newline != 0)) {
+ RETURN_TOKEN(T_ERROR);
+ }
+ }
- zend_copy_value(zendlval, yytext, yyleng - newline);
HANDLE_NEWLINES(yytext, yyleng - newline);
- RETURN_TOKEN(T_ENCAPSED_AND_WHITESPACE);
+ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
}
-#line 7784 "Zend/zend_language_scanner.c"
+#line 8132 "Zend/zend_language_scanner.c"
}
-#line 2399 "Zend/zend_language_scanner.l"
+#line 2759 "Zend/zend_language_scanner.l"
+
+
+emit_token_with_str:
+ zend_copy_value(zendlval, (yytext + offset), (yyleng - offset));
+emit_token_with_val:
+ if (PARSER_MODE()) {
+ ZEND_ASSERT(Z_TYPE_P(zendlval) != IS_UNDEF);
+ elem->ast = zend_ast_create_zval_with_lineno(zendlval, start_line);
+ }
+
+emit_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ return token;
+
+return_whitespace:
+ HANDLE_NEWLINES(yytext, yyleng);
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, T_WHITESPACE, start_line, SCNG(on_event_context));
+ }
+ if (PARSER_MODE()) {
+ start_line = CG(zend_lineno);
+ goto restart;
+ } else {
+ return T_WHITESPACE;
+ }
+
+skip_token:
+ if (SCNG(on_event)) {
+ SCNG(on_event)(ON_TOKEN, token, start_line, SCNG(on_event_context));
+ }
+ start_line = CG(zend_lineno);
+ goto restart;
}