更喜欢一种选择

Preferring one alternative

我的 ANTLR v4 语法摘录如下所示:

expression:
    | expression BINARY_OPERATOR expression
    | unaryExpression
    | nularExpression
;
unaryExpression:
    ID expression
;

nularExpression:
    ID
    | NUMBER
    | STRING
;

我的目标是在不知道所有必要关键字的情况下匹配语言,因此我只是将关键字作为 ID 进行匹配。
然而,有些二元运算符在关键字的两边都有一个参数(例如 keyword ),因此它们需要 "special treatment"。如您所见,我已经将此 "special treatment" 包含在 expression 规则中。

现在的实际问题是这些二元运算符中的一些可以用作一元运算符(=普通关键字),这意味着不必指定左参数。
上面的语法无法解决这种情况,因为每次我尝试实现它时,我最终都会将每个二元运算符作为一元运算符使用。

示例:
假设 count 是二元运算符。
可能的语法是 <arg1> count <arg2>count <arg>

我实现上述案例的所有尝试最终都将 myArgument count otherArgument 分组为 (myArgument (count (otherArgument) ) ) 而不是 (myArgument) count (otherArgument)


我的大脑告诉我,这个问题的解决方案是告诉解析器始终为二元运算符取两个参数,如果失败,它应该尝试将二元运算符作为一元运算符使用。
有人知道如何实现吗?

这样的事情怎么样:

lower_precedence_expression
 : ID higher_precedence_expression
 | higher_precedence_expression
 ;

higher_precedence_expression
 : higher_precedence_expression ID lower_precedence_expression
 | ID
 | NUMBER
 | STRING
 ;

?