token_get_all 和数学运算符
token_get_all and mathematical operators
我又用 token_get_all()
支付了一笔钱,发现了一些东西 "special":
给定以下 PHP 代码行:
<?php $var = 3 * 2 + 5;
当我在上面使用 token_get_all()
时,我得到了一个标记数组:
array(15) {
[0]=>
array(3) {
[0]=>
int(376)
[1]=>
string(6) "<?php "
[2]=>
int(1)
}
[1]=>
array(3) {
[0]=>
int(312)
[1]=>
string(4) "$var"
[2]=>
int(1)
}
[2]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[3]=>
string(1) "="
[4]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[5]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "3"
[2]=>
int(1)
}
[6]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[7]=>
string(1) "*"
[8]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[9]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "2"
[2]=>
int(1)
}
[10]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[11]=>
string(1) "+"
[12]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[13]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "5"
[2]=>
int(1)
}
[14]=>
string(1) ";"
}
请注意,数学运算符 (=
、*
、+
) 和分号 (;
) 不是标记,只是字符串。我希望得到类似 T_MATH_ADDITION
for +
等的东西
为什么上面的"instructions"不作为令牌处理?
因为它们是单个字符,所以它们已经是终端符号。无需从中制作令牌。您可以在此处找到可用解析器令牌的列表:http://php.net/manual/en/tokens.php
看看(伪)语法:
# Using a token
product := T_NUMBER T_MULT_OPERATOR T_NUMBER
# Using the plain char
product := T_NUMBER '*' T_NUMBER
什么看起来更好? ;)
我建议深入研究 Flex 和 Bison,然后自己编写一个小的解析器。届时事情会变得更加清楚。从这里开始:http://web.iitd.ac.in/~sumeet/flex__bison.pdf(哇,他们出版了 public 这本书!)
我又用 token_get_all()
支付了一笔钱,发现了一些东西 "special":
给定以下 PHP 代码行:
<?php $var = 3 * 2 + 5;
当我在上面使用 token_get_all()
时,我得到了一个标记数组:
array(15) {
[0]=>
array(3) {
[0]=>
int(376)
[1]=>
string(6) "<?php "
[2]=>
int(1)
}
[1]=>
array(3) {
[0]=>
int(312)
[1]=>
string(4) "$var"
[2]=>
int(1)
}
[2]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[3]=>
string(1) "="
[4]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[5]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "3"
[2]=>
int(1)
}
[6]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[7]=>
string(1) "*"
[8]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[9]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "2"
[2]=>
int(1)
}
[10]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[11]=>
string(1) "+"
[12]=>
array(3) {
[0]=>
int(379)
[1]=>
string(1) " "
[2]=>
int(1)
}
[13]=>
array(3) {
[0]=>
int(308)
[1]=>
string(1) "5"
[2]=>
int(1)
}
[14]=>
string(1) ";"
}
请注意,数学运算符 (=
、*
、+
) 和分号 (;
) 不是标记,只是字符串。我希望得到类似 T_MATH_ADDITION
for +
等的东西
为什么上面的"instructions"不作为令牌处理?
因为它们是单个字符,所以它们已经是终端符号。无需从中制作令牌。您可以在此处找到可用解析器令牌的列表:http://php.net/manual/en/tokens.php
看看(伪)语法:
# Using a token
product := T_NUMBER T_MULT_OPERATOR T_NUMBER
# Using the plain char
product := T_NUMBER '*' T_NUMBER
什么看起来更好? ;)
我建议深入研究 Flex 和 Bison,然后自己编写一个小的解析器。届时事情会变得更加清楚。从这里开始:http://web.iitd.ac.in/~sumeet/flex__bison.pdf(哇,他们出版了 public 这本书!)