问题描述
我是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 (将#修改为@)