关于IntelliJ平台语言插件开发的问题

时间:2017-10-14 16:31:26

标签: intellij-idea grammar intellij-plugin bnf

我试图根据this教程为IntelliJ Idea添加对UnrealScript语言(OOP,带有C风格语法)的支持。但是,我在语法和词法分析器生成方面遇到了一些困难。

具体来说,目的是什么:

    {li> extends(".*expr")=exprthis .bnf档案(第5行)? 文章末尾的this sample.bnf文件中的
  • name(".*expr")='expression'

我在.bnf文件中使用经典C语法,这样一旦我有了一个有效的C风格语法,我就可以根据前面提到的语言进行调整。 Here是我迄今为止所做的。我正在从this页面调整它,这会大量使用左递归,这是生成器不支持的。因此,如何将以下规则转换为非递归?

logical-or-expression ::= logical-and-expression
                      | logical-or-expression '||' logical-and-expression

这个稍微复杂的那个怎么样?

direct-abstract-declarator ::=  '(' abstract-declarator ')'
                           | {direct-abstract-declarator}? '[' {constant-expression}? ']'
                           | {direct-abstract-declarator}? '(' {parameter-type-list}? ')'

但除此之外,我觉得我完全没有理解我想要完成的事情,所以更一般地说,在IntelliJ平台中添加语言支持的理论先决条件是什么?到目前为止,我只熟悉了一般的bnf / ebnf符号。我需要阅读龙书吗?如果是,那么我应该关注哪些章节(因为我不打算编写编译器)?

1 个答案:

答案 0 :(得分:4)

extends(".*expr")=expr行改变了AST类的生成方式,使AST更加浅,从而使PSI层次更好。从本质上讲,这意味着任何与正则表达式.*expr匹配的规则都将被视为扩展expr规则,而不是儿童。

这意味着,例如为add_exprmul_expr生成的类型会扩展Expr界面,因此您可以在任何可以使用的地方使用AddExprMulExpr Expr。如果没有这个,Expr会有AddExpr和`MulExpr等的getter方法。请查看this section of the HOWTO

name(".*expr")='expression'行表示"< expression>"将用于描述与正则表达式匹配的任何规则。这主要出现在错误消息中 - "< expression>预计,得到XX"。这对于将所有表达式规则与名称一起分组非常有用,而不是列出每个变体。

不幸的是,我无法就你的其他问题给出很多建议。 GrammarKit确实提供了一些左递归的支持,如section on parsing expressions所述,但我不太了解细节。除此之外,可以重写左递归规则,最好搜索如何执行此操作的示例。

同样,我建议寻找有关编写解析器和尽可能阅读的教程。关于如何为IDE编写解析器的文章很少,但是为编译器和IDE编写解析器之间的最大区别在于错误处理。 IDE需要假设您的代码总是被破坏(通常是,当您正在键入时)并且需要优雅地恢复。同样,AST的设计很重要,但没有可用的指导。它基本上可以归结为您的要求 - 准备调整您的语法和AST结构,以适应您正在构建的功能。