20

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

4

3 に答える 3

10

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

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

于 2012-12-23T19:06:54.113 に答える
6

https://github.com/erikrose/parsimoniousをご覧ください

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

于 2013-05-17T08:14:53.630 に答える
4

私はグラコで良い経験をしました。

parseWKTに使用しました。

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

Grako で BNF を EBNF パーサーに書き、EBNF からパーサーを生成するのは合理的で簡単だと思います。

于 2014-04-01T14:54:55.990 に答える