微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在语法工具包中将复合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 举报,一经查实,本站将立刻删除。