[解決済み] Antlrの利点(lex/yacc/bisonなどに対して) [終了しました]
質問
私は過去に様々なプロジェクトでlexとyacc(通常はbison)を使用してきました。さらに、何十年も前のlex/yacc文法に基づいたコードをサポートしなければならなかったこともあります。ですから、専門家ではないものの、ツールを使いこなすことはできます。
過去に様々なフォーラムでAntlrについての肯定的なコメントを見ましたが、私が見逃していることがあるのではないかと思っています。そこで、もし両方を使ったことがあるのなら、Antlrのどこが優れているか、またはより高度か教えてください。私の現在の制約は、私はC++のショップで働いており、出荷する製品にはJavaが含まれないので、結果のパーサーはそのルールに従わなければならないことです。
どのように解決するのですか?
更新/警告 この回答は古くなっている可能性があります
大きな違いは、ANTLR は LL(*) パーサーを生成するのに対し、YACC と Bison はいずれも LALR のパーサーを生成することです。 これは多くのアプリケーションにとって重要な違いであり、最も明白なのは演算子です。
expr ::= expr '+' expr
| expr '-' expr
| '(' expr ')'
| NUM ;
ANTLRはこの文法をそのまま扱うことは全くできない。 ANTLR(または他の LL パーサー生成器)を使用するには、この文法を左回帰式でないものに変換する必要がある。 しかし、Bisonはこの形式の文法に何の問題もない。 と'-'を左結合演算子として宣言する必要があるが、これは左再帰のために厳密には必要ない。 より良い例は、ディスパッチであろう。
expr ::= expr '.' ID '(' actuals ')' ;
actuals ::= actuals ',' expr | expr ;
の両方が
expr
と
actuals
のルールは左回帰式である。 これにより、複数のレジスタや不要な流出を避けることができるため、コード生成時にはるかに効率的なASTが生成されます(左向きの木は折りたたむことができますが、右向きの木は折りたたむことができません)。
個人的な好みで言えば、LALR文法は構築やデバッグが非常に楽だと思います。 欠点は、shift-reduce や (恐ろしい) reduce-reduce のような、やや不可解なエラーに対処しなければならないことです。 これらはパーサーを生成するときに Bison が検出するエラーなので、エンドユーザーの使用感には影響しませんが、開発プロセスを少し面白くすることができます。 ANTLR が YACC/Bison よりも使いやすいと一般に考えられているのは、まさにこのためです。
関連
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] Bisonのインストール後に「make: yacc: Command not found」と表示される。
-
[解決済み] Flex/LexとYacc/Bisonの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++