什么是最终的 EBNF 语法?

What is the definitive EBNF syntax?

我目前正在使用 lark parser for python to try and read in some problem specifications. I am getting confused about what the "proper" syntax is for Extended Backus-Naur form, especially about how the LHS and RHS are separated. The wikipedia page uses an equals = sign, lark expects just a colon; see lark cheat sheet. Other sources use the ::= separator - e.g. the atom ebnf package

有确定的答案吗? official ISO spec 似乎暗示 "defining-symbol" 应该是 = 但规范中似乎还有回旋余地。那么为什么所有不同的版本?

由于世界尚未任命语法形式主义高级专员,因此没有确定的语法。您当然可以自由使用 ISO "Extended BNF" 标准,特别是如果您正在编写其他一些 ISO 标准,但不要期望它由解析器生成器实现,即使是扩展普通 BNF 的生成器。 (BNF 也没有明确的标准。)

我无从知晓 ISO 标准作者的想法,但我怀疑他们的期望是现实的:它旨在允许对标准文档的语法进行精确描述,但有许多不适合自动实现的功能(包括一种用英语编写规则限制的方式,以便在形式主义不够通用时使用)。通常可以从 ISO 标准中自动提取(大部分)语法,但这项任务既不简单也不——据我所知——旨在简单,因为大多数 ISO 标准不是作为纯文本文档分发的从 PDF 或 HTML 格式中提取带格式的文本本身就有挑战。

您提供的标点符号选项是最常见的选项,尽管数学家在编写 BNF 时经常使用 ⇒ 来分隔左右两边。 (不幸的是,大多数键盘都缺少这个有用的字符。)

我个人不喜欢 ::= 分隔符,尽管它被各种解析器生成器使用。在我看来,对于一个简单的标点符号来说,打字太多了,而且很难与标记为 | 的备选方案保持一致。但对每个人来说。