%}
%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
| 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); }
;
}
CG(heredoc) = estrndup(s, CG(heredoc_len));
BEGIN(ST_HEREDOC);
- return T_HEREDOC;
+ return T_START_HEREDOC;
}
}
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(';');
}
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;
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);
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;
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;
}