如何在语法工具包中将复合PsiElement包装在Lexer公认的元素之上

问题描述

我是intellij插件编写的新手。我开始为一种自定义语言编写一个intellij插件。我正在遵循intellij official site中给出的教程。我也下载了他们的Grammar-Kit repo from github以了解代码库。

在编写插件时,我在Lexer中使用jflex,在解析器中使用bnf语法。我发现很难实施词法分析器以将适当的令牌发送到解析器。

我在语法工具包存储库中看到Lexer(对于bnf)非常简单,并且只能识别字符串,数字,Id,空格,注释和特殊字符('(','* '等)。它无法识别bnf关键字,例如'private','external','Meta'等。

现在,当我看到示例bnf文件的PSI树对该行说时

private myRule ::= '(' myExpression ')' ';'

如下,

BnfFile:Dummy.bnf(0,43)
  BNF_RULE:myRule(0,43)
    BNF_MODIFIER(0,7)
      PsiElement(id)('private')(0,7)
    PsiWhiteSpace(' ')(7,8)
    PsiElement(id)('myRule')(8,14)
    PsiWhiteSpace(' ')(14,15)
    PsiElement(::=)('::=')(15,18)
    PsiWhiteSpace(' ')(18,19)
    BNF_SEQUENCE: '(' myExpression ')' ';'(19,43)
      BNF_STRING_LIteraL_EXPRESSION: '('(19,22)
        PsiElement(string)(''('')(19,22)
      PsiWhiteSpace(' ')(22,23)
      BNF_REFERENCE_OR_TOKEN: myExpression(23,35)
        PsiElement(id)('myExpression')(23,35)
      PsiWhiteSpace(' ')(35,36)
      BNF_STRING_LIteraL_EXPRESSION: ')'(36,39)
        PsiElement(string)('')'')(36,39)
      PsiWhiteSpace(' ')(39,40)
      BNF_STRING_LIteraL_EXPRESSION: ';'(40,43)
        PsiElement(string)('';'')(40,43)

在这里看到的是“私有”,被Lexer识别为PsiElement.id,之后一些代码将其与声明为bnf file的BnfModifier对象包装在一起。对于BNF_SEQUENCE,BNF_REFERENCE_OR_TOKEN,BNF_STRING_LIteraL_EXPRESSION等都是相同的。Lexer无法识别它们,但是有些代码将它们与bnf文件声明的对象包装在一起。

我想了解如何在Lexer公认的令牌上进行这种包装。 这将帮助我识别DSL中的关键字并以不同的方式突出显示它们,自动完成它们的操作等。

谢谢

Subhojit

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)