【问题标题】:Questions about IntelliJ Platform language plugin development关于 IntelliJ 平台语言插件开发的问题
【发布时间】:2017-10-16 17:20:27
【问题描述】:

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

具体来说,目的是什么:

  • extends(".*expr")=exprthis .bnf 文件中(第 5 行)?
  • name(".*expr")='expression' 在文末thissample.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 表示法。我需要读龙书吗?如果是,那我应该关注哪些章节(因为我不打算写编译器)?

【问题讨论】:

  • 您好!您是否设法实施了美国的支持?如果是,你愿意分享你的实现吗?

标签: intellij-idea grammar intellij-plugin bnf


【解决方案1】:

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

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

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

很遗憾,对于您的其他问题,我无法提供太多建议。 GrammarKit 确实提供了一些左递归的支持,如section on parsing expressions 中所述,但我真的不知道细节。除此之外,还可以重写左递归规则,最好搜索一下如何做到这一点。

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

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 2010-10-29
    • 2013-04-06
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多