使用 antlr4,我可以像这样标记规则替代方案:
e : e '*' e # Mult
| e '+' e # Add
| INT # Int
;
据我了解,在上面的规则中,Mult 的优先级高于 Add,因为 Mult 在替代方案列表中排在 Add 之前。
例如,如果我写:
e : e '*' e # Mult
| e ('+'|'-') e # Add
| INT # Int
;
1 + 2
中的+
和4 - 2
中的-
具有相同的优先级。但是,现在替代方案不在顶级。有没有办法分别标记规则e '+' e # Add
和e '-' e #Sub
,同时仍然让两个备选方案具有相同的优先级?
恐怕不是。你可以用op=('+'|'来标记op-'),然后在树上漫步期间获取 ctx.op() 值并询问其令牌类型。