14

最近、Ply を使用して Python でパーサーを作成しました (これは yacc を Python で再実装したものです)。パーサーをほぼ使い終えたとき、構文解析する必要がある文法では、構文解析中にルックアップを行ってレクサーに通知する必要があることに気付きました。レクサーに通知するためにルックアップを行わないと、言語の文字列を正しく解析できません。

文法規則からレクサーの状態を制御できることを考えると、パーサーモジュールのルックアップテーブルを使用してユースケースを解決すると思いますが、保守/テストが難しくなりすぎる可能性があります。そこで、他のオプションについて知りたいと思います。

Haskell では、構文解析関数 (コンビネーターとして知られる) のライブラリーである Parsec を使用します。Parsec の Python 実装はありますか? それとも、Python でコンテキスト依存のパーサーを構築できるように、構文解析機能を備えた他の製品品質のライブラリでしょうか?

編集:コンテキストフリーの解析での私の試みはすべて失敗しました。このため、ANTLR がここで役立つとは思いません。

4

6 に答える 6

9

pyparsingは parsec と同じ原則に基づいていると思います。

于 2008-09-18T18:58:12.937 に答える
6

PySec はもう 1 つのモナド パーサーです。私はそれについてあまり知りませんが、ここで調べる価値があります。

于 2008-09-18T18:34:52.040 に答える
5

LLパーサーが問題ない場合に検討できるオプションは、ANTLRを試してみることです。Pythonも生成できます(実際には、LL(*)と名付けられています。*は、対処できる先読みの量を表します)と)。

于 2008-09-18T18:00:05.213 に答える
2

PLY を使用してパーサーを「コンテキスト フリー」パスから迂回させることを妨げるものは何もありません。解析中にレクサーに情報を渡すことができるため、完全な柔軟性を実現できます。この方法で PLY を使用して、必要なものを解析できると確信しています。

実際の例として、PLY を使用して Python で記述された ANSI C のパーサーを考えてみましょう。これは、シンボル名をタイプまたはタイプとして解決するためにレクサーで使用されているパーサーにシンボル テーブルを設定することにより、古典的な C の typedef - 識別子の問題 (C の文法をコンテキスト依存にしないものにする) を解決します。

于 2008-09-19T18:58:07.270 に答える
1

LL(*) である ANTLR があり、よりオブジェクトフレンドリーで DSL のようなものである PyParsing があり、OCaml の Menhir のようなParsingがあります。

于 2008-09-18T18:02:07.673 に答える
0

ANTLRは優れており、複数の言語で動作するという追加の利点があります。

于 2008-09-18T18:08:28.470 に答える