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

Jak*_*rsh 15 python grammar parsing 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
Run Code Online (Sandbox Code Playgroud)

我发现Python的任何BNF解析器看起来都非常复杂,或者使用外部库.有没有更简单的方法来检查并在Python中使用BNF语法生成?

Vin*_*jip 7

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

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


编辑:引用页面的备份在archive.org上:

  • 链接已经死了.将其中最重要的部分粘贴到答案中,甚至是所有答案都非常有用. (6认同)
  • 如果你不愿意提及为什么它不是你想要的东西,那将会有很长的路要走.你知道,所以下一个人可以提供帮助. (4认同)
  • 回复:死链接.谷歌搜索字符串`性感lexing python`找到一个Reddit线程https://www.reddit.com/r/programming/comments/7ztdm/sexy_lexing_in_python/,也许在这里存档:http://www.itpub.net/archiver/ TID - 1794484.html (2认同)

cle*_*der 7

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

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