【问题标题】:How to handle negative integer in ANTLR4 grammar targetting C++如何在针对 C++ 的 ANTLR4 语法中处理负整数
【发布时间】:2022-09-28 13:58:22
【问题描述】:

我正在制作一个针对 C++ 的 ANTLR4 计算器 我正在尝试使用下面的 g4 代码处理整数 (...-1,0,1,....)。

INT :\'-\'? [0-9]+ ;

这是基于正则表达式

[-]?[0-9]+

但是这个接受 -0 的情况 如何处理修改代码以摆脱这种负零情况?

    标签: regex antlr4


    【解决方案1】:

    “-0”是否有另一种(有效的)解释?

    如果负 0 是理解“-0”的唯一方法,但您希望它被视为无效,则保持您的规则不变,并在语义验证期间检查您自己的代码。您将能够给出一个很好的特定错误消息,但是,如果您将其从 Lexer 规则中排除,您将在标记化阶段遇到错误,或者以某种方式对输入进行标记化,从而生成一个相当模糊的直接来自 ANTLR 的语法错误。

    通常,考虑您的 Lexer/Parser 目标是以“理解该输入的唯一合理方式”来解释您的输入(即使它在您的语言中可能是无效的用法)。将“所有可能的规则”编码到语法中似乎是一种常见的诱惑。这不一定对你有好处。

    【讨论】:

      【解决方案2】:

      您可能要考虑在您的词法规则中不包括否定词。 我想您会发现,通过将否定视为前缀操作(或简单操作),它将在以后简化您的解析器。 例如,考虑如何处理如下表达式:

      2 + 1 - -1
      

      您可能会发现您的词法分析器尝试将第一个减号作为 INT 的开始。

      所以。我很想做类似的事情:

      expression : POS_INT #literal_expr
                 | MINUS expression #negate_expr
                 | expression addOp expression #add_expr
                 ;
      
      addOp : PLUS | MINUS;
      POS_INT : [0-9]+;
      MINUS : '-';
      PLUS : '+';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-05
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 2022-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多