]> granicus.if.org Git - php/commitdiff
Syntax highlighting was erronously emitting more than one semicolon and/or garbage...
authorZeev Suraski <zeev@php.net>
Mon, 7 Feb 2000 18:39:14 +0000 (18:39 +0000)
committerZeev Suraski <zeev@php.net>
Mon, 7 Feb 2000 18:39:14 +0000 (18:39 +0000)
Zend/zend-parser.y
Zend/zend-scanner.l
Zend/zend_compile.c
Zend/zend_highlight.c

index d5f851e1b77043f71a5d21b263d0f90d153a4701..e358e0b9dbcf60eef24dbeac9099ff9a3086b677 100644 (file)
@@ -47,7 +47,7 @@
 %}
 
 %pure_parser
-%expect 4
+%expect 7
 
 %left T_INCLUDE T_EVAL T_IMPORT
 %left ','
 %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); }
 ;
 
 
index eb5a4bebdd4ffd015e1eea3b55b57a53c428e141..23ad787306f75e63ccd6b4d3c9c45cc6fbfaa691 100644 (file)
@@ -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;
index ff98273866c0bd26f59a895a14d3c5858b88b9b5..9019850c4544139c445d84ef3da725fa5709c817 100644 (file)
@@ -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);
index c68b4cd91f39bed3d4d9f3200ae5da16f0e5ee24..841adb927102700b852ba0a4fe6aa87b6299f22a 100644 (file)
@@ -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;
        }