我试图根据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符号。我需要阅读龙书吗?如果是,那么我应该关注哪些章节(因为我不打算编写编译器)?
答案 0 :(得分:4)
extends(".*expr")=expr
行改变了AST类的生成方式,使AST更加浅,从而使PSI层次更好。从本质上讲,这意味着任何与正则表达式.*expr
匹配的规则都将被视为扩展expr
规则,而不是儿童。
这意味着,例如为add_expr
或mul_expr
生成的类型会扩展Expr
界面,因此您可以在任何可以使用的地方使用AddExpr
和MulExpr
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结构,以适应您正在构建的功能。