【问题标题】:token_get_all and mathematical operatorstoken_get_all 和数学运算符
【发布时间】:2015-05-28 07:18:28
【问题描述】:

我再次使用token_get_all() 付款并遇到了一些“特别”的东西:

鉴于以下 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 之类的东西。

为什么上面的那些“指令”不作为令牌处理?

【问题讨论】:

    标签: php token tokenize lexer


    【解决方案1】:

    由于它们是单个字符,它们已经是终端符号。无需从中制作令牌。您可以在此处找到可用解析器令牌的列表: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(哇,他们公开了这本书!)

    【讨论】:

    • 太棒了。谢谢你的解释。我一定会看看这本书:-)。
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2014-12-24
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多