纠正嵌套函数的ANTLR语法错误

问题描述

我在函数体内使用了自定义函数 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)
        }
    }

解决方法

这是词法分析器语法中的错误。因此,解析器跳闸,无法从意外的令牌流中恢复。该错误不是由于任何嵌套函数(或函数调用)引起的。

如果让输入.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