Antlr4 定义了一个可以是一元或二元的运算符
Antlr4 define a operator which can be Unary or Binary
我正在为逻辑运算符 NOT
和运算符 Plus 和 Minus 可以是一元或二元运算符的语言创建 Antlr4 语法。
我应该如何定义 Antlr4 语法中的运算符以便解析器能够区分它们?
示例:
- NOT 1 is 0(一元运算符)
- 1 NOT 1 is 0 (二元运算符)
这是我的 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。
我正在为逻辑运算符 NOT
和运算符 Plus 和 Minus 可以是一元或二元运算符的语言创建 Antlr4 语法。
我应该如何定义 Antlr4 语法中的运算符以便解析器能够区分它们?
示例:
- NOT 1 is 0(一元运算符)
- 1 NOT 1 is 0 (二元运算符)
这是我的 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。