像注释HTML一样注释PHP代码
我们的目标, 是要实现如下的语法(以php-5.4.17为基础)
<?php echo "1.这里正常执行\n"; <!-- echo "像注释HTML一样注释PHP代码\n"; echo "这行相当于在'/* */'体内\n"; echo "不会被输出\n"; --> echo "2.这里正常执行\n"; |
编辑Zend/zend_language_scanner.l
// 这是PHP的多行注释源码 <ST_IN_SCRIPTING>"/*"|"/**"{WHITESPACE} { int doc_com; if (yyleng > 2) { doc_com = 1; RESET_DOC_COMMENT(); } else { doc_com = 0; } while (YYCURSOR < YYLIMIT) { if (*YYCURSOR++ == '*' && *YYCURSOR == '/') { break; } } if (YYCURSOR < YYLIMIT) { YYCURSOR++; } else { zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); } yyleng = YYCURSOR - SCNG(yy_text); HANDLE_NEWLINES(yytext, yyleng); if (doc_com) { CG(doc_comment) = estrndup(yytext, yyleng); CG(doc_comment_len) = yyleng; return T_DOC_COMMENT; } return T_COMMENT; } |
在这基础上做个简单的hack,添加一个像HTML一样的注释
<ST_IN_SCRIPTING>"<!-"|"<!--"{WHITESPACE} { int doc_com; if (yyleng >2 ) { doc_com = 1; RESET_DOC_COMMENT(); } else { doc_com = 0; } while (YYCURSOR < YYLIMIT) { if (*YYCURSOR++ == '-' && *YYCURSOR == '>') { break; } } if (YYCURSOR < YYLIMIT) { YYCURSOR++; } else { zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); } yyleng = YYCURSOR - SCNG(yy_text); HANDLE_NEWLINES(yytext, yyleng); if (doc_com) { CG(doc_comment) = estrndup(yytext, yyleng); CG(doc_comment_len) = yyleng; return T_DOC_COMMENT; } return T_COMMENT; } |
大功告成, 现在只需要重新编译PHP就可以了!