【问题标题】:Antlr4 define a operator which can be Unary or BinaryAntlr4 定义一个可以是一元或二元的运算符
【发布时间】:2016-11-08 23:45:35
【问题描述】:

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

我应该如何定义 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]|[~]);

【问题讨论】:

    标签: regex antlr antlr4


    【解决方案1】:

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

    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)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多