Antlr4 定义了一个可以是一元或二元的运算符

Antlr4 define a operator which can be Unary or Binary

我正在为逻辑运算符 NOT 和运算符 Plus 和 Minus 可以是一元或二元运算符的语言创建 Antlr4 语法。

我应该如何定义 Antlr4 语法中的运算符以便解析器能够区分它们?

示例:

这是我的 Antlr4 解析器的一小部分:

expr: expr ('%') expr               #Modulo 
| expr op=('*'|'/') expr            #MulDiv
| expr op=('+'|'-') expr            #AddSub                         
| NOT expr                          #NegOp

这是我的 Antlr4 Lexer 的一小部分:

ADD : '+';
SUB : '-';
NOT : ([nN][oO][tT]|[~]);

为了同时为我的语言创建一元和二进制运算符,我需要将以下规则添加到我的解析器中:

expr (MOD) expr                         #Modulo 
| op=(ADD|SUB) expr                     #UnaryPlusMinus
| expr op=(ADD|SUB) expr                #AddSub
| expr op=(AND|OR|XOR|NOT) expr         #LogOp
| NOT expr                              #NegOp

对我来说,上述解决方案很好,因为我的语言支持如下语法:

  • ++5---4(结果为1)
  • NOT NOT NOT 1(结果为 0)

然而,创建一个 parser/lexer 规则会很有趣,其中运算符(例如减号)可以是一元或(异或)二进制,但解析器应该知道运算符何时用作一元或二进制运算符,因此不允许像这样的 5-++--4 ,因为这会导致错误,但同时这也可以 ---5 因为它会导致 -5。