在 .bnf 中固定和恢复(解析)

Pin & recoverWhile in a .bnf (Parsing)

我在互联网上到处搜索(现在至少半天了),但似乎找不到所需的答案。

目前我正在尝试为具有自定义语言支持的 IntelliJ 插件创建 .bnf-file

一些教程提到了 {pin=1}{pin=2}{recoverWhile=xyz} 的存在,但我没有找到任何关于它们用途的真正解释,如果还有其他事情我应该知道(也许 {pin=3} 也存在?)。

有人能告诉我这些标志、方法或它们的名称到底是什么,以及如何在我的 .bnf 中使用它们吗?

感谢您的帮助和最诚挚的问候, 福克斯

这些属性在这里解释:

https://github.com/JetBrains/Grammar-Kit/blob/master/HOWTO.md#22-using-recoverwhile-attribute https://github.com/JetBrains/Grammar-Kit/blob/master/TUTORIAL.md

但用法并不简单。一个好主意是使用实时预览来玩弄它。

我的理解:

Pin 和 recoverWhile 属性用于从错误中恢复解析器。

Pin 指定规则的一部分(按索引或字面意思)在成功解析后规则被认为是成功的。 在示例中:

expr ::= expr1 "+" expr2 {pin=1}

如果 expr1 匹配,则整个规则将被视为成功,解析器将尝试匹配其余规则。

if pin=2 规则在匹配“+”后将被认为成功,如果 expr1 或“+”不匹配则失败。

RecoverWhile 属性指定解析规则后要跳过的位置。独立于它的成功。 例如

{recoverWhile=expr_recover}
expr_recover ::= !(";" | ".")

将跳过“;”之前的所有输入要么 ”。”。 IE。解析器将从“;”开始匹配下一条规则或“.”。