質問
私が開発しているソフトウェアベースは、対処する必要のないかなりの量のyaccを使用しています。見つけた問題を理解するのに役立つと思うこともありますが、ほとんどの場合、yaccの完全な無知で逃げることができます。
私の質問は、yaccを使用して学習する必要がある時間を保証するのに十分な新しいプロジェクトがあるかどうか
編集:応答が主にYaccの学習に有利であることを考えると、yaccよりも推奨する類似の言語はありますか?
解決
はい、これらのツールは、文法を解析するコードを作成または変更する必要がある場合、学習する価値があります。
長年の間、文法を解析するコードを生成するための事実上のツールはyacc、またはそのGNUのいとこ、bisonでした。
最近、ブロックに新しい子供が2、3人いると聞いたことがありますが、原則は同じです:宣言的な文法をBackus-Naur形式( BNF )とyacc / bison / whateverは、非常に面倒なコードを生成します手で。
また、文法の背後にある原則は、そのようなコードを直接操作する必要がない場合でも、学ぶのに非常に役立ちます。大学でコンパイラデザインのコースを受講して以来、パーサーとはあまり仕事をしていませんでしたが、ランタイムスタック、先読みパーサー、式の評価、その他多くの関連事項を理解することで、コードを効率的に記述およびデバッグすることができました。
編集:他のツールに関する追加の質問を考えると、Yacc / BisonはCコードを生成するため、C / C ++プロジェクトに最適です。他の言語にも同様のツールがあります。すべての文法が同等であるわけではなく、一部のパーサージェネレーターは特定の複雑さの文法のみを理解できます。そのため、文法を解析できるツールを見つける必要があるかもしれません。 http://en.wikipedia.org/wiki/Comparison_of_parser_generators
をご覧ください。他のヒント
それを使用する新しいプロジェクトについては知りませんが、構成ファイルの処理にlexとyaccを使用する7つの異なるメンテナンスジョブに関与しています。
XMLはありません、no-sir-ee:-)。
lex / yaccを使用したソリューションは、 key = val
行の古い構成ファイルからのステップアップです。これは、次のような優れた階層構造を可能にするためです。
server = "mercury" {
ip = "172.3.5.13"
gateway = "172.3.5.1"
}
server = "venus" {
ip = "172.3.5.21"
gateway = "172.3.5.1"
}
そして、はい、XMLでできることはわかっていますが、これらは主にCで書かれたレガシーアプリケーションであり、正直なところ、おそらく新しい(非Java)ジョブにもlex / yaccを使用するでしょう。
それは、最高の新しいウィズバンテクノロジーを提供するよりも、時間と予算でソフトウェアを提供することを好むためです。クライアントは私の教育にお金を払わず、何よりもまず結果を望みます。すばやく実行するためのすべてのテンプレートコードを用意します。
大まかな経験則:コードは長持ちするため、そのコードで使用されているテクノロジーも長持ちします。言及したコードベースを置き換えるには膨大な時間がかかります(ビルドするのに15年かかりました...)。これは、5年、10年、またはそれ以上でまだ存在することを意味します。 (この答えを読んだ人が最終的に作業する可能性さえあります!)
もう1つの経験則:汎用テクノロジーが十分にありふれたものであり、既に遭遇している場合は、いつかまた表示されるので、慣れる必要があるでしょう。誰が知っている:それに慣れることで、ツールボックスに便利なツールを追加したかもしれません...
Yaccはこれらのテクノロジーの1つです。おそらく再び遭遇するでしょう。それほど難しくはなく、学習する原則はパーサーコンストラクターのファミリー全体に適用されます。
PEG は新しいホットですが、yaccを使用するプロジェクトがまだたくさんありますまたはyaccよりも最新のツール。私はyaccの使用を選択した新しいプロジェクトに眉をひそめますが、既存のプロジェクトの場合、より現代的なツールへの移植は意味をなさないかもしれません。これにより、yaccの大まかな知識は有用なスキルになります。
パーサージェネレーターのトピックにまったく慣れていない場合は、いずれか1つについて学習することをお勧めします。概念の多くは、それらの間で移植可能です。また、ベルトに入れると便利なツールです。1つを知ったら、正規表現の重い手書きパーサーと比較して、それらがしばしば優れていることを理解できます。パーサーのトピックにすでに慣れているのであれば、心配する必要はありません。何かを成し遂げるために必要な場合と必要なときにyaccを学習します。
私はYaccを使用するプロジェクトに取り組んでいます。新しいコードではありませんが、新しいコードであり、Yaccまたは近親者(Bison、Byaccなど)を使用します。
はい、あなたがCで働いているなら、学ぶ価値があると思います。
また、ANTLRやその他の最新のパーサージェネレーターの学習も検討してください。しかし、Yaccの知識があれば、あなたは良い立場に立つことができます-基本的な理論の多くは似ているので、他の同様のツールを学ぶのにも役立ちます。
yacc / bisonについて具体的には知りませんが、antlr、cup、jlex、javaccを使用しました。アカデミックな重要性しかないと思っていましたが、ドメイン固有の言語が必要であることが判明したため、一部の「単純な」ものよりもはるかに優れたソリューションが得られました。 (正規表現ベース)パーサーがあります。しかし、多くの環境ではメンテナンスが問題になる可能性があります-最近のほとんどのコーダーは解析ツールの経験がないためです。
他の解析システムと比較する機会はありませんでしたが、 ANTLR をお勧めします私自身の経験に基づいており、その大規模でアクティブなユーザーベースにも基づいています。
ANTLRのもう1つのプラスポイントは ANTLRWorks:ANTLR GUI開発環境です。文法の開発とデバッグ。そのようなIDEでサポートされている別の解析システムはまだ見ていません。
製品を出荷するために、会社で新しいyaccコードを書いています。はい、これはまだ使用されています。