web-dev-qa-db-ja.com

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文法をチェックして生成する簡単な方法はありますか?

16
Jakemmarsh

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

アプリケーションがすべて字句スキャンに関連しているかどうかはわかりませんが、そうでない場合は、 ply はかなり使いやすいパーサーです(パーサーがどのように機能するかを広く知る必要がある場合)。


編集:引用されたページのバックアップは archive.org にあります:

7
Vinay Sajip

見てください https://github.com/erikrose/parsimonious

Parsimoniousは、純粋なPythonで記述された最速の任意先読みパーサーであり、最も使いやすいものになることを目指しています。これは、式文法(PEG)の解析に基づいています。つまり、単純化された種類のEBNF表記をフィードします。

7
cleder

grako で良い経験をしました。

parseWKT に使用しました。

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

グラコでEBNFパーサーにBNFを記述し、EBNFからパーサーを生成するのは合理的であると思います。

3
cleder