diff options
Diffstat (limited to 'Zend/zend_language_scanner.c')
-rw-r--r-- | Zend/zend_language_scanner.c | 1428 |
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(¤t_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(¤t_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(¤t_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; } |