首页 > PHP源码 > 像注释HTML一样注释PHP代码

像注释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就可以了!

分类: PHP源码 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.