替换$ in php变量声明

Uri*_*ren 8 php syntax bison abstract-syntax-tree

我想扩展php语法,以区分可变和不可变的变量.

$a应该被声明为可变的(如在标准的php中)并且#b应该被声明为不可变的.

我读过Hacking PHP语法,

我无法弄清楚我在哪里可以定义声明的变量#也应该被标记为T_VARIABLE

Uri*_*ren 1

我能够解决这个问题,需要采取两个步骤:

PHP解析'#'为注释:

改变:

<ST_IN_SCRIPTING>"#"|"//" {
Run Code Online (Sandbox Code Playgroud)

<ST_IN_SCRIPTING>"//" {
Run Code Online (Sandbox Code Playgroud)

zend_language_scanner.l第 1901 行

将标记化为#a变量:

改变:

simple_variable:
T_VARIABLE { $$ = $1; }
| '$' '{' expr '}' { $$ = $3; }
| '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
;
Run Code Online (Sandbox Code Playgroud)

到:

simple_variable:
T_VARIABLE { $$ = $1; }
| '$' '{' expr '}' { $$ = $3; }
| '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
| '#' '{' expr '}' { $$ = $3; }
| '#' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
;
Run Code Online (Sandbox Code Playgroud)

zend_language_parser.y的第 1117 行

就是这样

现在这段代码可以工作:

#a=1;
echo (#a);//1
Run Code Online (Sandbox Code Playgroud)