From 0c470af3144de7931cd88cf3238d7cd87413134e Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Mon, 7 Feb 2000 18:39:14 +0000 Subject: [PATCH] Syntax highlighting was erronously emitting more than one semicolon and/or garbage with heredocs --- Zend/zend-parser.y | 7 ++++--- Zend/zend-scanner.l | 6 ++++-- Zend/zend_compile.c | 3 +++ Zend/zend_highlight.c | 11 +++++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Zend/zend-parser.y b/Zend/zend-parser.y index d5f851e1b7..e358e0b9db 100644 --- a/Zend/zend-parser.y +++ b/Zend/zend-parser.y @@ -47,7 +47,7 @@ %} %pure_parser -%expect 4 +%expect 7 %left T_INCLUDE T_EVAL T_IMPORT %left ',' @@ -129,7 +129,8 @@ %token T_OPEN_TAG_WITH_ECHO %token T_CLOSE_TAG %token T_WHITESPACE -%token T_HEREDOC +%token T_START_HEREDOC +%token T_END_HEREDOC %token T_DOLLAR_OPEN_CURLY_BRACES %token T_CURLY_OPEN %token T_PAAMAYIM_NEKUDOTAYIM @@ -538,7 +539,7 @@ scalar: | common_scalar { $$ = $1; } | '"' encaps_list '"' { $$ = $2; } | '\'' encaps_list '\'' { $$ = $2; } - | T_HEREDOC encaps_list T_HEREDOC { $$ = $2; do_end_heredoc(CLS_C); } + | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; do_end_heredoc(CLS_C); } ; diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l index eb5a4bebdd..23ad787306 100644 --- a/Zend/zend-scanner.l +++ b/Zend/zend-scanner.l @@ -1440,7 +1440,7 @@ ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+ } CG(heredoc) = estrndup(s, CG(heredoc_len)); BEGIN(ST_HEREDOC); - return T_HEREDOC; + return T_START_HEREDOC; } @@ -1475,6 +1475,8 @@ ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+ } if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) { + zendlval->value.str.val = estrndup(yytext, yyleng); /* unput destroys yytext */ + zendlval->value.str.len = yyleng; if (unput_semicolon) { unput(';'); } @@ -1482,7 +1484,7 @@ ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+ CG(heredoc)=NULL; CG(heredoc_len)=0; BEGIN(ST_IN_SCRIPTING); - return T_HEREDOC; + return T_END_HEREDOC; } else { zendlval->value.str.val = (char *)estrndup(yytext, yyleng); zendlval->value.str.len = yyleng; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ff98273866..9019850c45 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2289,6 +2289,9 @@ int zendlex(znode *zendlval CLS_DC) case T_OPEN_TAG_WITH_ECHO: retval = T_ECHO; break; + case T_END_HEREDOC: + efree(zendlval->u.constant.value.str.val); + break; } INIT_PZVAL(&zendlval->u.constant); diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index c68b4cd91f..841adb9271 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -137,6 +137,9 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini case T_DOLLAR_OPEN_CURLY_BRACES: html_puts("{", 1); break; + case T_END_HEREDOC: + html_puts(token.value.str.val, token.value.str.len); + break; default: html_puts(zendtext, zendleng); break; @@ -152,6 +155,14 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini efree(token.value.str.val); break; } + } else if (token_type == T_END_HEREDOC) { + zend_bool has_semicolon=(strchr(token.value.str.val, ';')?1:0); + + efree(token.value.str.val); + if (has_semicolon) { + /* the following semicolon was unput(), ignore it */ + lex_scan(&token CLS_CC); + } } token.type = 0; } -- 2.40.0