19

私が開発しているソフトウェアベースは、私が扱う必要のないかなりの量の yacc を使用しています。見つけた問題を理解するのに役立つと思うこともありますが、ほとんどの場合、yacc について完全に知らなくても問題ありません。

私の質問は、yacc を学習するのに必要な時間を保証するためにまだ yacc を使用している新しいプロジェクトが十分にあるのでしょうか?

編集: 反応が主に Yacc の学習を支持していることを考えると、yacc よりもお勧めする同様の言語はありますか?

4

8 に答える 8

32

はい、文法を解析するコードを作成または変更する必要がある場合は、これらのツールを学ぶ価値があります。

長年にわたり、文法を解析するためのコードを生成するための事実上のツールは、yaccまたはそのGNUのいとこであるbisonでした。

最近、ブロックに新しい子供が2人いると聞きましたが、原則は同じです。バッカス・ナウア記法(BNF)とyacc /bison/その他の形式で宣言型文法を記述します。手で書くのは非常に面倒なコードを生成します。

また、文法の背後にある原則は、そのようなコードを直接操作する必要がない場合でも、学ぶのに非常に役立ちます。大学でコンパイラー設計のコースを受講して以来、パーサーとはあまり連携していませんが、ランタイムスタック、先読みパーサー、式の評価、およびその他の多くの関連事項を理解することで、コードを効果的に記述およびデバッグすることができました。

編集:他のツールに関するフォローアップの質問を考えると、Yacc / BisonはもちろんCコードを生成するため、C /C++プロジェクトに最適です。他の言語にも同様のツールがあります。すべての文法が同等であるとは限りません。一部のパーサジェネレータは、特定の複雑さの文法しか取得できません。したがって、文法を解析できるツールを見つける必要があるかもしれません。http://en.wikipedia.org/wiki/Comparison_of_parser_generatorsを参照してください

于 2008-12-02T01:13:13.227 に答える
6

それを使用する新しいプロジェクトについてはわかりませんが、構成ファイルの処理にlexとyaccを使用する7つの異なるメンテナンスジョブに携わっています。

私にはXMLはありません、no-sir-ee:-)。

key=vallex / yaccを使用するソリューションは、次のようなより優れた階層構造を可能にするため、行の古い構成ファイルからのステップアップです。

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を使用するでしょう。

それは、最高の新しいウィズバンテクノロジーを提供するよりも、時間と予算に合わせてソフトウェアを提供することを好むためです。クライアントは私の教育にお金を払わず、何よりもまず結果を求めています。私はすでにlex / yaccの専門家であり、すべてを持っています。それをすばやく行うためのテンプレートコード。

于 2008-12-02T01:13:47.907 に答える
3

一般的な経験則:コードは長持ちするため、そのコードで使用されるテクノロジーも長持ちします。あなたが言及したコードベースを置き換えるには膨大な時間がかかります(それを構築するのに15年かかりました...)。これは、5年、10年、またはそれ以上の年数が続くことを意味します。(この回答を読んだ人が最終的にそれに取り組む可能性さえあります!)

もう1つの経験則:汎用テクノロジが一般的であり、すでに遭遇している場合は、いつか再び表示されるため、おそらく十分に一般的であるため、慣れておく必要があります。誰が知っているか:それに慣れることで、ツールボックスに便利なツールを追加したかもしれません...

Yaccはこれらのテクノロジーの1つです。おそらく再びそれに遭遇するでしょう、それはそれほど難しいことではありません、そしてあなたが学ぶ原則はパーサーコンストラクターのファミリー全体に適用されます。

于 2008-12-02T01:38:57.637 に答える
3

PEGは新しい話題ですが、yacc や yacc よりも新しいツールを使用するプロジェクトはまだたくさんあります。yacc を使用することを選択した新しいプロジェクトには眉をひそめますが、既存のプロジェクトをより最新のツールに移植することは意味がないかもしれません。これにより、yacc に大まかに慣れていることが有用なスキルになります。

パーサージェネレーターのトピックにまったく慣れていない場合は、いずれかについて学ぶことをお勧めします。概念の多くは、それらの間で移植可能です。また、ベルトに持っていると便利なツールです。一度知ったら、正規表現の重い手書きのパーサーと比較して、それらがどのように優れているかを理解できます。パーサーのトピックにすでに慣れている場合は、心配する必要はありません。何かを成し遂げるために、必要なときに yacc を学びます。

于 2008-12-02T10:32:31.430 に答える
2

私はYaccを使用するプロジェクトに取り組んでいます。新しいコードではありませんが、それらが新しい場合でも、Yaccまたは近親者(Bison、Byaccなど)を使用します。

はい、Cで働いているなら、学ぶ価値があると思います。

また、ANTLRまたはその他の最新のパーサジェネレータの学習も検討してください。しかし、Yaccの知識はあなたをしっかりと支えます-基本的な理論の多くは似ているので、他の同様のツールを学ぶのにも役立ちます。

于 2008-12-02T01:18:24.590 に答える
2

特にyacc/bisonについてはわかりませんが、antlr、cup、jlex、javaccを使用しました。それらは学問的に重要なだけだと思いましたが、ドメイン固有言語が必要であることが判明しました。これにより、「より単純な」(正規表現ベースの)パーサーよりもはるかに優れたソリューションが得られました。ただし、多くの環境ではメンテナンスが問題になる可能性があります。最近のほとんどのコーダーは、解析ツールの経験がないためです。

于 2008-12-02T02:04:53.093 に答える
2

他の構文解析システムと比較する機会はありませんでしたが、私自身の経験とその大規模でアクティブなユーザーベースに基づいて、ANTLRを間違いなくお勧めできます。

ANTLRのもう1つのプラスポイントは、ANTLRWorks:ANTLR GUI開発環境です。これは、文法の開発とデバッグに非常に役立ちます。そのようなIDEでサポートされている別の解析システムはまだ見たことがありません。

于 2008-12-02T02:21:47.880 に答える
1

私の会社では、製品を出荷するための新しいyaccコードを作成しています。はい、このようなものはまだ使用されています。

于 2010-02-09T04:04:16.903 に答える