簡體   English   中英

如何在 Python 中實現 Backus-Naur 表單

[英]How to implement Backus-Naur Form in 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 語法生成?

這篇文章包含一個不需要第三方庫的詞法掃描器的例子。 它可能無法滿足您的所有需求,但您應該能夠將其用作滿足您需求的東西的基礎。

我不知道您的應用程序是否都與詞法掃描有關 - 但如果不是, ply是一個相當容易使用的解析器(假設您需要廣泛了解解析器的工作原理)。

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

Parsimonious 的目標是成為用純 Python 編寫的最快的任意前瞻解析器——也是最有用的。 它基於解析表達式語法 (PEG),這意味着您可以為其提供一種簡化的 EBNF 符號。

我對grako有很好的體驗。

我將它用於parseWKT

它接受一個 EBNF 作為輸入並從中生成一個 PEG 解析器。

我認為在 grako 中將 BNF 寫入 EBNF Parser 是合理的簡單,然后它將從 EBNF 生成解析器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM