如何处理 IntelliJ 语法工具包中的文件结尾



我正在使用语法工具包为DSL提供IntelliJ支持。我在bnf文件中有一个规则,它要求在末尾使用EOF(文件结尾(令牌: rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF

我假设我可以简单地在 flex 文件<<EOF>> { return EOF;}中创建一个词法分析器规则,仅此而已。不幸的是,在 IntelliJ 代码的更深处,处理词法分析器 advance() 方法的逻辑不会完成,除非它从词法分析器获得 null,从而导致无限循环,因为文件末尾返回非空标记。

是否有任何优雅(简单(的方法来处理语法工具包中的文件结束,允许在解析器定义(bnf(中使用"文件结束"?

.bnf文件中,您可以使用<<eof>> .这是一个链接到GeneratedParserUtilBase.eof方法的外部规则。

最后,我只是在生成的词法分析器及其使用者之间放置了一个适配器,它取代了词法分析器advance((方法的功能。如果已达到 EOF,则下次它将返回 null。像这样:

override fun advance(): IElementType? {
    val t: IElementType? = lexer.advance()
    return when {
        eofReached -> null
        t == VUCLTypes.EOF -> {
            eofReached = true
            t
        }
        else -> t
    }
}

eofReached是一个标志,在初始化时和每次调用词法分析器的reset()方法时都设置为 false。

override fun reset(p0: CharSequence, p1: Int, p2: Int, p3: Int) {
    eofReached = false
    lexer.reset(p0, p1, p2, p3)
}

我希望我没有错过任何东西。

相关内容

  • 没有找到相关文章

最新更新