Antlr 如何在PHP解析器中处理赋值运算符的优先级?

Antlr 如何在PHP解析器中处理赋值运算符的优先级?,antlr,antlr3,Antlr,Antlr3,我在Antlr3.4中编写了一个PHP5解析器,它几乎已经准备就绪,但我无法处理PHP的一个棘手特性。我的问题是赋值运算符的优先级。在PHP手册中,赋值的优先级几乎位于列表的末尾。列表中只有and、xor或and在后面 但手册页面上有一条说明: 尽管=的优先级低于大多数其他运算符,但PHP将 仍然允许类似以下表达式:if$a=foo,in 在这种情况下,foo的返回值被转换为$a 注释中的小示例对我的解析器来说不是问题,我可以在assignment规则中将其作为特例处理 但还有更复杂的代码,例如

我在Antlr3.4中编写了一个PHP5解析器,它几乎已经准备就绪,但我无法处理PHP的一个棘手特性。我的问题是赋值运算符的优先级。在PHP手册中,赋值的优先级几乎位于列表的末尾。列表中只有and、xor或and在后面

但手册页面上有一条说明:

尽管=的优先级低于大多数其他运算符,但PHP将 仍然允许类似以下表达式:if$a=foo,in 在这种情况下,foo的返回值被转换为$a

注释中的小示例对我的解析器来说不是问题,我可以在assignment规则中将其作为特例处理

但还有更复杂的代码,例如:

如果$a&&$b=func{}

我的解析器在这里失败,因为它识别第一个$a&&$b,不能处理其余的条件。这是因为&&的优先级高于=。 如果我将括号放在&&的右侧:

如果$a&&$b=func{}

通过这种方式,解析器可以很好地识别结构

操作符按照ANTLR手册推荐的方式构建:第一步有基本表达式,每个级别的操作符都在后面


有什么方法可以处理这种优先级跳跃吗?

不要将其视为赋值,而是将其命名为赋值表达式。将此赋值表达式放在一元表达式下面,使其优先级高于一元表达式:

语法T; 选择权{ 输出=AST; } 代币{ 块 FUNC_调用; 出口清单; } 作语法分析 :stat*EOF! ; 斯达 :赋值“;”! |如果统计 ; 分配 :Var'='^expr ; 如果统计 :If expr block->^If expr block ; 块 :“{”stat*'}”->^BLOCK stat* ; expr :或_expr ; 或_expr :和| | ^和| expr* ; 和_expr :一元表达式和一元表达式* ; 一元表达式 : '!'^ 赋值表达式 |“-”^assign\u expr |赋值表达式 ; 赋值表达式 :Var'='^atom* |原子 ; 原子 :Num |函数调用 ; 函数调用 :Id expr\u list->^FUNC\u调用Id expr\u list ; 出口清单 :expr','expr*?->^EXPR\u列表EXPR* ; 如果:‘如果’; 数字:“0”…“9”+; 变量:“$”Id; Id:'a'..'z'+; 空格:“”|'\t'|'\r'|'\n'+{skip;}; 如果现在要分析源代码:

如果$a=foo{$a=1&&2;} 如果$a&&$b=func{$b=2&&3;} 如果$a=baz&&b{$c=3&&4;} 将构建以下AST:


谢谢你的回复。我并没有单独制定一条规定,将分配作为一项声明。我想这是丢失的那块。