0

我正在使用 Grammar-Kit 为 DSL 提供 IntelliJ 支持。我在 bnf 文件中有一条规则,最后需要一个 EOF(文件结尾)令牌: rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF

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

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

4

2 回答 2

2

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

于 2019-06-10T12:54:01.893 回答
0

最后,我只是在生成的词法分析器和它的使用者之间放置了一个适配器,它替换了词法分析器的 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是一个标志,在初始化和每次调用 lexerreset()方法时设置为 false。

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

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

于 2019-06-10T12:24:26.860 回答