如何在Python中实现巴科斯范式

新手上路,请多包涵

我知道已经有一些与 Python 中的 BNF(Backus-Naur 形式)语法相关的模糊相似的问题,但它们对我的应用程序没有太大帮助。

我有多个 BNF 需要为其编写代码。代码应该能够使用 BNF 语法生成和识别合法字符串。

我使用的第一个 BNF 适用于 Python 中的所有实数。它是这样的:

 <real number>    ::= <sign><natural number> |
                     <sign><natural number>'.'<digit sequence> |
                     <sign>'.'<digit><digit sequence> |
                     <sign><real number>'e'<natural number>
<sign>           ::= ‘’ | ‘+’ | ‘-‘
<natural number> ::= ‘0’ | <nonzero digit><digit sequence>
<nonzero digit>  ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<digit sequence> ::= ‘’ | <digit><digit sequence>
<digit>          ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

我为 Python 找到的任何 BNF 解析器似乎都异常复杂,或者使用外部库。有没有更简单的方法可以在 Python 中使用 BNF 语法进行检查和生成?

原文由 Jakemmarsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 821
2 个回答

这篇文章 包含一个不需要第三方库的词法扫描器示例。它可能无法满足您的所有需求,但您应该能够将其用作满足您需求的基础。

我不知道你的应用程序是否都与词法扫描有关——但如果不是, ply 是一个相当容易使用的解析器(前提是你需要广泛了解解析器的工作原理)。

原文由 Vinay Sajip 发布,翻译遵循 CC BY-SA 4.0 许可协议

看看 https://github.com/erikrose/parsimonious

Parsimonious 的目标是成为用纯 Python 编写的最快的任意前瞻解析器——也是最有用的。它基于解析表达式语法 (PEG),这意味着您可以为它提供一种简化的 EBNF 表示法。

原文由 cleder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题