【问题标题】:Tokenizing scientific notation in Antlr4 Lexer在 Antlr4 Lexer 中标记科学记数法
【发布时间】:2013-11-22 00:07:35
【问题描述】:

我的词法分析器规则的一个大大简化的版本(在更大的语法中)如下所示:

fragment HEX_DIGIT : [0-9A-F] ;
fragment DIGIT : [0-9] ;
SCIENTIFIC : 'E' [+-] ;
INTEGER : DIGIT+ ;
HEX_INTEGER : HEX_DIGIT+ ;
FLOAT_ZERO : '0'* '.' '0'+ ;
FLOAT : DIGIT* '.' DIGIT+ ;

这里的问题在于00E+00 等输入。我想要的标记是'00'、'E+'、'00'。然而,Antlr 走的是贪婪路线,将“00E”解析为 HEX_INTEGER,并在完整的词法分析器中生成“+”和“00”标记。

对于在词法分析器中处理这种特殊情况有什么建议吗? _input.LA() 技巧似乎不起作用,因为我们在字符级别进行操作,所以我并不总是确定我必须向前看多远才能在十六进制数字末尾寻找特殊的“E+”序列。

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    我的建议是:

    1. SCIENTIFIC 设为片段规则,并更新您的INTEGER 规则以包括对科学记数法的支持。

      INTEGER : DIGIT+ (SCIENTIFIC DIGIT+)?;
      
    2. 更新您的 HEX_INTEGER 规则,以免与 INTEGER 产生歧义。例如,777 可以是 INTEGERHEX_INTEGER。并非所有数字都包含十六进制表示法中的数字 af

    【讨论】:

      【解决方案2】:

      经过反复试验后想通了这一点,希望它可以帮助其他想要做类似事情的人。事实证明,您不仅可以在词法分析器规则的开头使用语义谓词,这是我没有意识到的。

      // Tricky, becuase of sci notation- can't catch something like 00E+00, as we
      // need tokens like '00', 'E+', '00'. If our number ends in 'E', don't let it
      // be followed by '+' or '-'.
      HEX_INTEGER
          : HEX_DIGIT*
            {_input.LA(1) != 'E' && _input.LA(2) != '+' && _input.LA(2) != '-'}?
            HEX_DIGIT
          ;
      

      【讨论】:

        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2020-12-30
        • 2018-07-03
        相关资源
        最近更新 更多