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

时间:2019-06-10 11:41:24

标签: intellij-idea grammar-kit

我正在使用Grammar-Kit开发IntelliJ对DSL的支持。我在bnf文件中有一条规则,该规则在末尾需要EOF(文件末尾)令牌: rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF

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

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

2 个答案:

答案 0 :(得分:1)

'platform='. $platform文件中,您可以使用.bnf。这是链接到<<eof>>方法的外部规则。

答案 1 :(得分: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是一个标志,在初始化时以及每次调用lexer的reset()方法时都将其设置为false。

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

我希望我什么都没错过。