16

Verilog (または vhdl) 言語のパーサーを作成し、解析されたデータの多くの操作 (一種の変換) を行う予定です。私は非常に大きなファイル (完全な Verilog デザイン、最大 10,000 行) を解析するつもりであり、最終的にはほとんどの Verilog をサポートする予定です。タイピングは気にしませんが、他のルールのサポートを追加するたびに、コードのどの部分も書き直したくありません。

Haskell で、どのライブラリをお勧めしますか? 私は Haskell を知っており、以前に Happy を (プレイするために) 使用したことがあります。コード内の解析された文字列を変換するために Parsec を使用する可能性があると感じています (これは大きな利点です)。私は uu​​-paringlib の経験がありません。

Verilog/VHDL の完全な文法を解析するには、どれが推奨されますか? 私の主な関心事は、気まぐれで解析されたデータを操作できる簡単さと「正確さ」です。速度は主要な関心事ではありません。

4

1 に答える 1

19

個人的には、Alex の助けを借りて字句解析を行う Parsec を好みます。

1) Parsec はライブラリですが、Happy はプログラムであり、Happy を使用してから Happy でコンパイルすると、別の言語で記述します。2) Parsec は、そのモナド インターフェイスのおかげで、状況依存の解析機能を提供します。状況依存の解析に追加の状態を使用し、その状態に応じて検査して決定することができます。または、前に解析された値を見て、次のパーサーなどを決定します ( などa <- parseSomething; if test a then ... do ...)。また、コンテキスト依存の情報が必要ない場合は、単純に適用可能なスタイルを使用して、YACC または同様のツールで実装されたような実装を取得できます。

Parsec の欠点として、Parsec パーサーに左再帰が含まれているかどうかがわからず、実行時にパーサーがスタックしてしまいます (Parsec は基本的にトップダウンの再帰下降パーサーであるため)。左再帰を見つけて削除する必要があります。YACC スタイルのパーサーは、Parsec では得られないいくつかの静的な保証と情報 (shift/reduce の競合、未使用の端末など) を提供できます。

両方の状況での字句解析には Alex を強くお勧めします ( Happy を使用することにした場合は、 Alexを使用する必要があると思います)。Parsec を使用していても、パーサーの実装が本当に単純化され、大量のバグも検出されます (たとえば、キーワードを識別子として解析することは、私が Alex なしで Parsec を使用していたときによく見られたバグでした。これは 1 つの例にすぎません)。 )。

Alex+Parsec に実装された私のLua パーサーを見ることができます。これは、Parsec で Alex が生成したトークンを使用するコードです。

John L編集:訂正していただきありがとうございます。どうやら、ハッピーでも状況依存の解析を行うことができます。また、レキシング用の Alex は Happy では必須ではありませんが、推奨されています。

于 2013-02-08T15:00:07.267 に答える