我正在为一种语言创建一个Antlr4语法,其中逻辑运算符NOT
和运算符Plus和Minus可以是一元或二元运算符。
我应该如何在Antlr4语法中定义运算符,以便解析器可以区分它们?
示例:
以下是我的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]|[~]);
答案 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
对我来说,上面的解决方案很好,因为我的语言支持如下语法:
然而,创建一个解析器/词法分析器规则会很有趣,其中运算符(例如Minus)可以是一元或(异或)二进制,但解析器应该知道运算符何时用作一元或二元运算符,因此不是允许这样的东西5 - ++ - 4,因为这会导致错误,但同时这将是好的 - 5,因为它会导致-5。