如何处理 IntelliJ 语法工具包中的文件结尾
How to handle end of file in IntelliJ grammar kit
我正在使用 Grammar-Kit 研究 IntelliJ 对 DSL 的支持。我在 bnf 文件中有一条规则,它要求末尾有一个 EOF(文件末尾)标记:
rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF
我假设我可以简单地在 flex 文件中创建一个词法分析器规则 <<EOF>> { return EOF;}
就是这样..
不幸的是,在 IntelliJ 代码的更深处,处理词法分析器 advance()
方法的逻辑不会完成,除非它从词法分析器中得到一个空值,导致无限循环作为文件结尾 returns 一个非空标记。
是否有任何优雅(简单)的方法来处理 Grammar-Kit 中的文件结尾,允许 'end of file' 在解析器定义(bnf)中使用?
最后,我只是在生成的词法分析器和它的消费者之间放置了一个适配器,它取代了词法分析器的 advance() 方法的功能。如果已达到 EOF,则下一次它将 return 为空。像这样:
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)
}
希望我没有遗漏任何东西..
在 .bnf
文件中您可以使用 <<eof>>
。这是链接到 GeneratedParserUtilBase.eof
方法的外部规则。
我正在使用 Grammar-Kit 研究 IntelliJ 对 DSL 的支持。我在 bnf 文件中有一条规则,它要求末尾有一个 EOF(文件末尾)标记:
rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF
我假设我可以简单地在 flex 文件中创建一个词法分析器规则 <<EOF>> { return EOF;}
就是这样..
不幸的是,在 IntelliJ 代码的更深处,处理词法分析器 advance()
方法的逻辑不会完成,除非它从词法分析器中得到一个空值,导致无限循环作为文件结尾 returns 一个非空标记。
是否有任何优雅(简单)的方法来处理 Grammar-Kit 中的文件结尾,允许 'end of file' 在解析器定义(bnf)中使用?
最后,我只是在生成的词法分析器和它的消费者之间放置了一个适配器,它取代了词法分析器的 advance() 方法的功能。如果已达到 EOF,则下一次它将 return 为空。像这样:
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)
}
希望我没有遗漏任何东西..
在 .bnf
文件中您可以使用 <<eof>>
。这是链接到 GeneratedParserUtilBase.eof
方法的外部规则。