我在 ANTLR 3.4 中编写了一个 PHP5 解析器,它几乎准备好了,但我无法处理 PHP 的一个棘手功能。我的问题是赋值运算符的优先级。正如 PHP 手册所说,赋值的优先级几乎在列表的末尾。只有and
, xor
,or
和,
在列表中。
但是手册页上有一条注释,上面写着:
尽管
=
优先级低于大多数其他运算符,但 PHP 仍然允许类似于以下的表达式:if (!$a = foo())
,在这种情况下, 的返回值foo()
被放入$a
。
注释中的小示例对我的解析器来说不是问题,我可以将其作为分配规则中的特殊情况处理。
但是还有更复杂的代码,例如:
if ($a && $b = func()) {}
我的解析器在这里失败,因为它首先识别$a && $b
并且无法处理其余的条件。这是因为 的&&
优先级高于=
。如果我将括号放在右侧&&
:
if ($a && ($b = func())) {}
通过这种方式,解析器可以很好地识别结构。
算子是按照 ANTLR 书推荐的方式构建的:第一步有基本表达式,每个级别的算子都接踵而至。
有没有办法处理这种优先级跳跃?