Vala のドキュメントによると、「0.3.1 より前の Vala のパーサーは、従来のフレックス スキャナーと Bison LALR パーサーの組み合わせでした。しかし、コミット eba85a の時点では、パーサーは手作りの再帰降下パーサーです。」私の質問は:なぜですか?
ここでは特に Vala について質問していますが、この質問はパーサー ジェネレーターを使用していない任意のコンパイラーに向けられている可能性があります。パーサージェネレーターから手作りのパーサーへのこのような移行の長所と短所は何ですか? コンパイラにパーサー ジェネレーター (Bison、ANTLR) を使用することの欠点は何ですか?
おそらくプログラマーは、パーサー ジェネレーターが見つけられなかったいくつかの最適化手段を発見しました。これらの最適化手段には、まったく異なる解析アルゴリズムが必要でした。あるいは、おそらくパーサー ジェネレーターは C89 でコードを生成し、プログラマーは C99 または C11 のリファクタリングが読みやすさを向上させると判断しました。
補足的なコメントとして: 私が Vala に興味を持っているのは、特に、最新の機能とクリーンな構文を備えた言語でありながら、「ネイティブ」および「管理されていない」高水準言語 (Vala の場合は C) にコンパイルできるという考えが好きだからです。
簡単なメモ: C はネイティブではありません。ポータビリティに根ざしており、ポーティング時にプログラマーを悩ませていたハードウェア/OS 固有の詳細を抽象化するように設計されています。たとえば、OS やファイルシステムごとにまったく異なるfopenを使用することの苦痛を考えてみてください。単に機能が異なるだけでなく、入力と出力の期待も異なるという意味です。異なる引数、異なる戻り値。同様に、C11 では移植可能なスレッドが導入されています。スレッドを使用するコードは、同じ C11 準拠のコードを使用して、スレッドを実装するすべての OS をターゲットにすることができます。
私はこれまでにヴァラを見つけました。Vala (または同様の言語) を C++ にコンパイルできるようにして (Qt ライブラリに支えられて) 楽しんでみようと考えています。しかし、完全に新しい言語を発明したくないので、既存の文法を取り入れようと考えています。明らかに手作りのパーサーには、私が再利用できる正式な文法が書かれていません。このアイデアに対するあなたのコメントは大歓迎です (全体のアイデアはばかげていますか?)。
手作業で作成されたパーサーを使用して C++ コードを生成することは、ほとんど労力をかけずに実行できる可能性があるため、このオプションをすぐに放り出すつもりはありません。古い flex/bison パーサー ジェネレーターの方が便利かもしれませんし、そうでないかもしれません。ただし、これが唯一の選択肢ではありません。いずれにせよ、私は仕様を広範囲に研究したくなるでしょう。