kotlin 如何正确解决Intellij语言插件教程中“运行JFlex生成器”后的“找不到符号”?

hof1towb  于 2023-03-30  发布在  Kotlin
关注(0)|答案(2)|浏览(119)

我正在浏览Custom Language Support Tutorial,在第4部分的最后一节收到编译错误。
错误是:cannot find symbol zzAtBOL = true; location: class SimpleLexer
如果我注解这一行,下一个错误是:cannot find symbol if (!zzEOFDone) { location: class SimpleLexer
注解掉对zzAtBOLzzEOFDone的引用“解决”了这个问题,我可以使用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文件(仅更改了包):
一个二个一个一个

hlswsv35

hlswsv351#

检查是否:

/**
   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
   */
  private boolean zzAtBOL = true;

发生在上面:

/** zzAtEOF == true <=> the scanner is at the EOF */
  private boolean zzAtEOF;

在idea-flex.skeleton文件中,它应该在您的项目主目录中。
如果这些行不在该文件中,则添加它们,然后再次尝试运行JFlex Generator。

epfja78i

epfja78i2#

问题在于JFlex和the Grammar-Kit Intellij plugin使用的 idea-flex.skeleton 之间的版本差异。目前的插件似乎使用了较旧的 jflex-1.7.0-2.jar 和较新的 idea-flex.skeleton
在这个更新的 idea-flex.skeleton 中,zzAtBOLzzEOFDone被删除(参见IC commit)。
因此,对我来说,解决方案是download并从CLI使用较新的JFlex:

java -Xmx512m -Dfile.encoding=UTF-8 \
  -jar jflex-1.9.1.jar -skel idea-flex.skeleton \
  -d src/main/gen/com/example/sampleplugin \
  src/main/kotlin/com/example/sampleplugin/Simple.flex

相关问题