Kotlin 更正嵌套函数的ANTLR语法错误
我在函数体中使用自定义函数(assertFailsWith),但在“assertFailsWith(IllegalArgumentException::class){”:Kotlin 更正嵌套函数的ANTLR语法错误,kotlin,antlr,grammar,Kotlin,Antlr,Grammar,我在函数体中使用自定义函数(assertFailsWith),但在“assertFailsWith(IllegalArgumentException::class){”: 不匹配的输入“{”应为{NL,}”, 我使用的是来自 我是否需要对以下部分进行任何更改以删除错误: functionBody : block | ASSIGNMENT NL* expression ; block : LCURL statements RCURL ; @Test
不匹配的输入“{”应为{NL,}”, 我使用的是来自 我是否需要对以下部分进行任何更改以删除错误:
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)
}
}
这是lexer语法中的一个错误。因此,解析器会出错,无法从意外的令牌流中恢复。错误不是因为任何嵌套函数(或函数调用) 如果将输入
.6f 0.6f 1.6f
标记化,您将看到lexer生成以下标记:
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
)
;