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

2024-04-29 10:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在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语法进行检查和生成?


Tags: 代码form应用程序number语法naturalrealsequence
3条回答

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

Parsimonious aims to be the fastest arbitrary-lookahead parser written in pure Python—and the most usable. It's based on parsing expression grammars (PEGs), which means you feed it a simplified sort of EBNF notation.

This post包含不需要第三方库的词法扫描程序的示例。它也许不能满足你的所有需求,但你应该能够把它作为满足你需求的基础。

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


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

我对grako有很好的经验。

我用它来做parseWKT

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

我认为在grako中编写一个BNF到EBNF解析器是很简单的,然后它将从EBNF生成一个解析器

相关问题 更多 >