2012-12-23 52 views
10

我知道Python中有一些與BNF(Backus-Naur窗體)語法有關的模糊問題,但是他們沒有一個對我的應用程序有很大的幫助。如何在Python中實現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語法?

+3

BNF ==巴科斯範式產生一個解析器?對於我們這些每天不玩弄文法解析器的人。 – Ben

+0

@是的,你是對的。對不起,我將編輯帖子 – Jakemmarsh

+0

您是否在尋找能解析BNF文件來生成語法/詞法分析器的東西,或者您可以用Python編寫的東西來描述它與BNF的等價物? –

回答

6

This post包含一個不需要第三方庫的詞法掃描器的例子。它可能並不是你想要的,但你應該能夠將它用作適合你需要的東西的基礎。

我不知道你的應用程序是否都與詞法掃描有關 - 但是如果不是的話,ply是一個相當簡單易用的解析器(因爲你需要廣泛地瞭解解析器是如何工作的)。


編輯:引用頁面的備份是archive.org

+0

我很欣賞這種迴應。我查看了你的鏈接,但我不確定他們是我在這種情況下尋找的。 – Jakemmarsh

+4

如果您不耐煩地提及爲什麼它不是您要找的東西,那將會很長。你知道,所以下一個人可以提供幫助。 – OmnipotentEntity

+6

鏈接已死亡。將其中最重要的部分複製粘貼到答案中,甚至所有這些內容中都是非常有用的。 – HuStmpHrrr

7

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

簡約的目標是用純最快的任意前瞻解析器的Python和最可用的。它基於解析表達式語法(PEG),這意味着您可以爲其提供一種簡化的EBNF表示法。

3

我與grako有良好的經驗。

我用它parseWKT

它將EBNF作爲輸入並從中生成PEG解析器。

我認爲這是合理的簡單寫一個BNF到EBNF解析器在grako,然後將從EBNF

相關問題