3

Python3で動作するかなり複雑な言語(Python自体と同様の複雑さ)のパーサジェネレーターを探しています。ASTを自動的に生成できる場合、これはボーナスになりますが、解析中にルールを呼び出すだけで問題ありません。特別な要件はありません。また、非常に効率的で高速である必要もありません。

4

2 に答える 2

3

LEPLは正確にはパーサジェネレータではありません-それはより良いです!パーサーはPythonコードで定義され、実行時に構築されます(したがって、非効率的ですが、はるかに使いやすくなります)。演算子のオーバーロードを使用して、非常に読みやすいDSLを構築します。c = a & b | b & cBNFのようなものc := a b | b c.

(サブ)パーサーの結果をabritary呼び出し可能オブジェクトに渡すことができます。これは、AST生成に非常に役立ちます(たとえば、数値リテラルをPythonレベルの数値オブジェクトに変換する場合にも役立ちます)。これは再帰下降パーサーなので、文法で左再帰を避ける方がよいでしょう(左再帰を機能させることができるメモ化オブジェクトがありますが、「Leplのそれらに対するサポートは歴史的に信頼できません(バギー)」)。

于 2011-05-26T17:37:10.117 に答える
3

ANTLRは、Pythonでレクサーやパーサーを生成できます。また、これを使用して、ASTおよびイテレータのような構造を作成してASTをウォークすることもできます(ツリー文法と呼ばれます)。

PythonターゲットでASTを生成するANTLRデモについては、ANTLRgetおよびsplitレクサーコンテンツを参照してください。

于 2011-05-26T18:09:11.463 に答える