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

时间:2016-11-08 23:45:36

标签: regex antlr antlr4

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

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

示例:

  • NOT 1为0(一元运算符)
  • 1 NOT 1为0(二元运算符)

以下是我的Antlr4 Parser的一小部分:

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

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

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

1 个答案:

答案 0 :(得分:0)

为了让我的语言一元和二元的操作符同时我需要将以下规则添加到我的解析器中:

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)

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