2012-12-23 2 views
10

PythonでBNF(Backus-Naur Form)文法に関連している疑いのある疑問がいくつかあることは知っていますが、Pythonで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

BNF ==バッカス正規形からパーサを生成するgrakoでEBNFパーサーにBNFを、書くことは簡単で合理的であると思いますか?毎日文法パーサーで遊んでいない私たちのために。 – Ben

+0

@Benはい、あなたは正しいです。申し訳ありませんが、投稿を編集します。 – Jakemmarsh

+0

BNFファイルを解析して文法/レクサーや、BNFに相当するものを記述するPythonで作成できるものを探していますか? –

答えて

6

This postには、サードパーティライブラリが不要な字句スキャナの例が含まれています。あなたが望むものすべてを行うわけではありませんが、あなたのニーズに合ったものの基礎として使うことができるはずです。

アプリケーションがすべて語彙スキャニングに関連しているかどうかわかりませんが、そうでない場合は、plyは非常に使いやすいパーサーです(パーサの動作方法を広く知っておく必要があるため)。


編集:引用ページのバックアップがarchive.orgである:

+0

私は応答を感謝します。私はあなたのリンクを調べましたが、私はこのケースで私が探しているものではないと確信しています。 – Jakemmarsh

+4

あなたが探しているものではない理由を言いたいと思えば、それは長い道のりになります。あなたは知っているので、次の人が助けることができます。 – OmnipotentEntity

+6

リンクが無効です。その中で最も重要な部分を答えにコピーしたり、それらのすべてをコピーしたりするのは本当に役に立ちます。 – HuStmpHrrr

7

は純粋に書かれた最速の任意先読みパーサすべきhttps://github.com/erikrose/parsimonious

倹約的な目標を見ていパイソン・アンド最も使いやすい。これは、式文法(PEG)の解析に基づいています。つまり、単純化されたEBNF表記を使用します。

3

私はgrakoで良い経験をしていました。

parseWKTに使用しました。

入力としてEBNFを受け取り、そこからPEGパーサーを生成します。

は、私はその後、EBNF

関連する問題