我正在浏览Custom Language Support Tutorial,在第4部分的最后一节收到编译错误。
错误是:cannot find symbol zzAtBOL = true; location: class SimpleLexer
如果我注解这一行,下一个错误是:cannot find symbol if (!zzEOFDone) { location: class SimpleLexer
注解掉对zzAtBOL
和zzEOFDone
的引用“解决”了这个问题,我可以使用runIde
,但显然这不是问题的解决方案。
那么,问题是如何使“运行JFlex生成器”生成有效的源代码在我的情况下?
一些细节:
使用Intellij Idea Build #IU-223.8836.41,构建于2023年3月10日
使用Kotlin代替Java实现插件。
- com.example.sampleplugin.SimpleLanguage.kt*:
package com.example.sampleplugin
// imports
object SimpleLanguage : Language("Simple")
object SimpleFileType : LanguageFileType(SimpleLanguage) {
override fun getName() = "Simple File"
override fun getDescription() = "Simple language file"
override fun getDefaultExtension() = "simple"
override fun getIcon() =
IconLoader.getIcon("/icons/jar-gray.png", SimpleLanguage::class.java)
}
object SimpleLexerAdapter : FlexAdapter(SimpleLexer(null))
class SimpleFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, SimpleLanguage) {
override fun getFileType() = SimpleFileType
}
object SimpleTokenSets {
val identifier = TokenSet.create(SimpleTypes.KEY)
val comments = TokenSet.create(SimpleTypes.COMMENT)
}
object SimpleParserDefinition : ParserDefinition {
override fun createLexer(project: Project?) = SimpleLexerAdapter
override fun createParser(project: Project?) = SimpleParser()
override fun getFileNodeType() = IFileElementType(SimpleLanguage)
override fun getCommentTokens() = SimpleTokenSets.comments
override fun getStringLiteralElements(): TokenSet = TokenSet.EMPTY
override fun createElement(node: ASTNode?): PsiElement = SimpleTypes.Factory.createElement(node)
override fun createFile(viewProvider: FileViewProvider) = SimpleFile(viewProvider)
}
- com/example/sampleplugin/psi.SimplePsi.kt*:
package com.example.sampleplugin.psi
// imports
class SimpleTokenType(debugName: String) : IElementType(debugName, SimpleLanguage)
class SimpleElementType(debugName: String) : IElementType(debugName, SimpleLanguage)
我从教程中复制的.bnf
和.flex
文件(仅更改了包):
一个二个一个一个
2条答案
按热度按时间hlswsv351#
检查是否:
发生在上面:
在idea-flex.skeleton文件中,它应该在您的项目主目录中。
如果这些行不在该文件中,则添加它们,然后再次尝试运行JFlex Generator。
epfja78i2#
问题在于JFlex和the Grammar-Kit Intellij plugin使用的 idea-flex.skeleton 之间的版本差异。目前的插件似乎使用了较旧的 jflex-1.7.0-2.jar 和较新的 idea-flex.skeleton。
在这个更新的 idea-flex.skeleton 中,
zzAtBOL
和zzEOFDone
被删除(参见IC commit)。因此,对我来说,解决方案是download并从CLI使用较新的JFlex: