如何在Python中实现Backus-Naur表单

时间:2012-12-23 18:59:30

标签: python parsing grammar bnf

我知道在Python中有一些与BNF(Backus-Naur Form)语法有关的模糊相似的问题,但是就我的应用而言,它们都没有帮助我。

我有多个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语法生成?

3 个答案:

答案 0 :(得分:7)

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

  

Parsimonious旨在成为用纯Python编写的最快的任意前瞻解析器 - 并且是最有用的。它基于解析表达式语法(PEG),这意味着您可以使用简化的EBNF表示法。

答案 1 :(得分:6)

This post包含一个不需要第三方库的词法扫描程序示例。它可能无法满足您的所有需求,但您应该能够将其作为满足您需求的基础。

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


编辑:所引用页面的备份位于archive.org

答案 2 :(得分:3)

我对grako有很好的体验。

我将它用于parseWKT

它需要EBNF作为输入并从中生成PEG解析器。

我认为将一个BNF写入grako中的EBNF Parser会很合理,然后会从EBNF生成一个解析器