個人的には、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 では必須ではありませんが、推奨されています。