私は数年前、私の学部の研究でFlex、Bisonに取り組んだ。しかし、私は今それについて多くを覚えていません。最近、私はANTLRについて聞くようになりました。ANTLRをFlex/Bisonと比較した場合の短所は何ですか?
- 私はFlex/BisonをブラッシュアップするためにANTLR以上を習得することをお勧めしますか?
- ANTLRには、Flex/Bisonより多くの/少ない機能がありますか?
私は数年前、私の学部の研究でFlex、Bisonに取り組んだ。しかし、私は今それについて多くを覚えていません。最近、私はANTLRについて聞くようになりました。ANTLRをFlex/Bisonと比較した場合の短所は何ですか?
ANTLRv3はLL(k)であり、LL(*)に設定することができます。後者の場合、本質的にEBNFをそのまま使用することができるので、パーザを書くのはばかげて簡単です。
また、ANTLRは、ゼロから書き込む再帰的降下パーサと非常によく似たコードを生成します。非常に読みやすく、デバッグが簡単で、なぜ構文解析が機能しないのか、間違っているのか分かりません。
Flex/Bison(または他のLALRパーサ)の利点は、高速です。
もっと速い? LALRとLL(k)またはLL(\ *)を比較していますか? LL(k)解析は非常に高速です。 LL(\ *)解析はバックトラッキングのために遅いですが、使用する必要はほとんどありません(また、あなたが行っても、ANTLRでは文法のサブセットにLL(\ *)を使用できます)。私が知っている利点の1つは、LALRを解析できるLL(k)を解析できない特定の文法があるということですが、実際にはあなたが実際に解析したいと思うほとんどの文法は、パースされたLL(k)の形で表現される。 –
はい。 LALRは、テーブルドリブンの有限状態マシンを使用できるため、高速です。 Bisonのようなパーサジェネレータによって生成されたデバッグは不可解で、不可能ですが、非常に高速です。 ANTLRによって実装されるLL(k)は再帰的降下構文解析を使用しますが、これはやや遅くなります。 –
私はちょうどantlrworksツールを試して、次のことはうまくいきませんでした: expr:expr '+' expr; 左再帰を許可しないためです。あなたはすべて少し不便だと分かっていないのですか? expr:expr( '+' expr)* などのように変換する必要があります。つまり、正規表現のように記述します。フレックスで私は前者の方法を書くことができ、私はこの正規表現のスタイルよりもはるかに自然なことを発見しました。 – user855
私たちは、レガシーファイルと自然言語の解析といういくつかの情報処理要件にANTLRを使用することに決めました。学習曲線は急上昇しており、私たちはこれがもっと必要であるために、よりモダンで多目的なアプローチだと感じています。欠点は - あなたが尋ねると - 主に学習曲線が避けられないように思われることです。
私はほぼすべてのパーサージェネレータの学習曲線がほぼ同じであると思っています。それは "それはLALRです..."または "それはLLです..."というフレーズを "技術的に"理解するのに5分しかかかりません。あなたが使用しなければならない機械を掘り起こし、文法を曲げる方法を学ぶ...すべてが等しい、学習曲線が似ている、あなたの世界で動作する最も強力なパーサジェネレータを選択する必要があります。 –
ANTLRには、プロジェクトに含める必要がある実行時ライブラリJARがあります。
ANTLRの再帰的降下パーサは、Flex/Bisonによって生成された "ボトムアップ"パーサよりもデバッグが容易ですが、文法の規則はわずかに異なります。
Java用のFlex/Bisonスタイル(LALR)パーサジェネレータを使用する場合は、JavaCCを参照してください。
[利点のantlr-versus-lex-yacc-bison]についての別の方法(http://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc) -bison) – nawfal
[Antlrのメリット(対lex/yacc/bison)]の可能な複製(https://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc-bison )@nawfal:うん。 – einpoklum