我正在尝试根据 this 为 IntelliJ Idea 添加对 UnrealScript
语言(OOP,具有 C 风格语法)的支持教程。但是,我在语法和词法分析器生成方面遇到了一些困难。
具体来说,目的是什么:
我正在 .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_expr
或 mul_expr
生成的类型将扩展 Expr
接口(interface),因此您可以使用 AddExpr
和 MulExpr
任何可以使用 Expr
的地方。如果没有这个,Expr
将具有用于 AddExpr
和 `MulExpr 等的 getter 方法。查看 this section of the HOWTO .
name(".*expr")='expression'
行表示“
不幸的是,我无法对你的其他问题提供太多建议。 GrammarKit 确实提供了一些左递归的支持,如本 section on parsing expressions 中所述。 ,但我真的不知道细节。除此之外,可以重写左递归规则,最好搜索如何执行此操作的示例。
同样,我建议寻找有关编写解析器的教程,并尽可能多地阅读。关于如何为 IDE 编写解析器的文章很少,但为编译器编写解析器和 IDE 的最大区别在于错误处理。 IDE 需要假设您的代码总是损坏(通常是在您键入时)并且需要正常恢复。同样,AST 的设计也很重要,但没有这方面的指导。它本质上可以归结为您的要求 - 准备好调整您的语法和 AST 结构以适应您正在构建的功能。
关于intellij-idea - 关于IntelliJ平台语言插件开发的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46746821/