Mr *_*x U 2 grammar parsing ebnf
我目前正在使用python 的 lark 解析器来尝试读取一些问题规范。我对扩展巴科斯-诺尔形式的“正确”语法感到困惑,尤其是关于如何分离 LHS 和 RHS。维基百科页面使用等号=,lark 只需要一个冒号;请参阅云雀备忘单。其他来源使用::=分隔符,例如atom ebnf 包。
有确定的答案吗?官方ISO 规范似乎建议“定义符号”应该是,=但规范中似乎有回旋余地。那么为什么会有不同的版本呢?
由于世界尚未任命一位语法形式主义高级专员,因此没有明确的语法。您当然可以自由地使用 ISO“扩展 BNF”标准,特别是如果您正在编写其他一些 ISO 标准,但不要指望它由解析器生成器实现,即使是扩展正常 BNF 的解析器生成器。(BNF 也没有明确的标准。)
我无法知道 ISO 标准的作者们心里在想什么,但我怀疑他们的期望是现实的:它的目的是允许对标准文档的语法进行精确描述,但有很多功能并没有实现。适合自动化实现(包括一种用英语编写规则限制的方法,当形式主义不够通用时使用)。通常可以从 ISO 标准中自动提取(大部分)语法,但这项任务既不简单,也不是(据我所知)意图简单,因为大多数 ISO 标准不是作为纯文本文档分发的从 PDF 或 HTML 格式中提取格式化文本也面临着自身的挑战。
尽管数学家经常使用 ⇒ 来分隔左侧和右侧,但您提供的标点符号选项是最常见的选项。(不幸的是,大多数键盘都缺乏这种有用的字符。)
我个人不喜欢分隔::=符,尽管它被各种解析器生成器使用。在我看来,对于一个简单的标点符号来说,输入的内容太多了,而且与标记为 的替代项保持一致也非常困难|。但对每个人来说都是如此。