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

标签 intellij-idea grammar intellij-plugin bnf

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

具体来说,目的是什么:

  • extends(".*expr")=expr in this .bnf 文件(第 5 行)?
  • this 中的
  • name(".*expr")='表达式'文章末尾的sample.bnf 文件?

我正在 .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 表示法。需要看龙书吗?如果是,那么我应该关注哪些章节(因为我不打算编写编译器)?

最佳答案

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

这意味着例如为 add_exprmul_expr 生成的类型将扩展 Expr 接口(interface),因此您可以使用 AddExprMulExpr 任何可以使用 Expr 的地方。如果没有这个,Expr 将具有用于 AddExpr 和 `MulExpr 等的 getter 方法。查看 this section of the HOWTO .

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

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

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

关于intellij-idea - 关于IntelliJ平台语言插件开发的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46746821/

相关文章:

intellij-plugin - 在 IntelliJ 插件中传送特定于操作系统的二进制文件

kotlin - 如何 swagger 生成 Kotlin?

java - 在 IntelliJ 中的 Tomcat9 上运行 restful api war 时出现 URL 问题

java - 尽管只有一个条目存在,但 Proguard 为重复的 zip 条目抛出 IOException

scalafx + intellij : NoClassDefFoundError: javafx/scene/shape/CullFace

grammar - bnf语法检查

java - 在 Java 中解析 ad-hoc if/else 语法的推荐策略?

java - 如何在 Intellij IDEA 中将弹出窗口保持在一个屏幕上?

python - 从通用标签集生成 PCFG

java - Intellij doExecute 不使用 DefaultProgramRunner 触发