kotlin - 更正嵌套函数的 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
)
;
并且您的解析器将能够正确解析您的输入。
推荐阅读
- ms-access - The dreaded 'Microsoft.ACE.OLEDB.12.0' provider is not registered in Visual Studio 2017
- css - 如何使 WP 侧边栏响应并在小屏幕上显示在页面底部?
- laravel - 如何显示存储/应用程序中的用户图像?
- angular - 刷新 Syncfusion 网格后如何聚焦更新的记录
- mysql - MYSQL更新触发检查所有列中的更改并将值插入其他表
- c# - 什么是正确的返回方法类型?
- windows - 如何在 Windows/Powershell 上运行此代码?
- reactjs - React native - 在 App.js 中使用 react-redux 进行 Firebase 身份验证
- tensorflow - Tensorflow:TensorBoard 事件转储编码
- python - Pytest 错误 - 将对象位置与字符串进行比较