【问题标题】:Correct ANTLR grammar error for nested functions更正嵌套函数的 ANTLR 语法错误
【发布时间】:2020-09-05 15:59:17
【问题描述】:

我在函数体内使用自定义函数(assertFailsWith),但在“assertFailsWith(IllegalArgumentException::class) {”行中出现 ANTLR 解析器错误:
不匹配的输入 '{' 期望 {NL, '}', 我正在使用https://github.com/antlr/grammars-v4/tree/master/kotlin/kotlin中的Kotlin语法

是否需要对以下部分进行任何更改才能消除错误:

functionBody
    : block
    | ASSIGNMENT NL* expression
    ;

block
     : LCURL statements RCURL
   ;



@Test
    fun `Create invalid test`() {
        assertFailsWith(IllegalArgumentException::class) {
            // Variables
            val realVocabPath = "realVocabPath"
            val realAlphabetPath = "realAlphabetPath"
            val vocabFactory = VocabFactory(mockFileLoader, 0.6f)

            // Execute
            val vocab = vocabFactory.create(realVocabPath, realAlphabetPath, mockEngineSpec)

            // Verify
            assertEquals(mockWordPieceVocab, vocab)
        }
    }

【问题讨论】:

    标签: kotlin antlr grammar


    【解决方案1】:

    这是词法分析器中的一个错误。因此,解析器会出错并且无法从意外的令牌流中恢复。错误不是因为任何嵌套函数(或函数调用)。

    如果您让输入 .6f 0.6f 1.6f 被标记化,您将看到词法分析器生成这些标记:

    RealLiteral               `.6f`
    IntegerLiteral            `0`
    RealLiteral               `.6f`
    RealLiteral               `1.6f`
    

    如您所见,输入 0.6f 未被识别为 RealLiteral 令牌。您可以通过将0.6f 更改为1.6f 来验证这一点,您的解析器不会产生任何错误。

    要解决此问题,请更改:

    DoubleLiteral
        : ( (DecDigitNoZero DecDigit*)? '.'
          | (DecDigitNoZero (DecDigit | '_')* DecDigit)? '.')
         ( DecDigit+
          | DecDigit (DecDigit | '_')+ DecDigit
          | DecDigit+ [eE] ('+' | '-')? DecDigit+
          | DecDigit+ [eE] ('+' | '-')? DecDigit (DecDigit | '_')+ DecDigit
          | DecDigit (DecDigit | '_')+ DecDigit [eE] ('+' | '-')? DecDigit+
          | DecDigit (DecDigit | '_')+ DecDigit [eE] ('+' | '-')? DecDigit (DecDigit | '_')+ DecDigit
         )
        ;
    

    进入:

    DoubleLiteral
        : ( (DecDigitNoZero DecDigit* | '0')? '.'
          | (DecDigitNoZero (DecDigit | '_')* DecDigit)? '.')
         ( DecDigit+
          | DecDigit (DecDigit | '_')+ DecDigit
          | DecDigit+ [eE] ('+' | '-')? DecDigit+
          | DecDigit+ [eE] ('+' | '-')? DecDigit (DecDigit | '_')+ DecDigit
          | DecDigit (DecDigit | '_')+ DecDigit [eE] ('+' | '-')? DecDigit+
          | DecDigit (DecDigit | '_')+ DecDigit [eE] ('+' | '-')? DecDigit (DecDigit | '_')+ DecDigit
         )
        ;
    

    您的解析器将能够正确解析您的输入。

    在这里提交了修复:https://github.com/antlr/grammars-v4/pull/1850

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多