私は、ある言語を別の言語に「翻訳」する仕事を与えられました。ソースは、正規表現を使用した単純な行ごとのアプローチには柔軟性が高すぎる (複雑)。字句解析とパーサーについて詳しく知るには、どこに行けばよいですか?
12 に答える
このテーマについて「感情的」になりたい場合は、「The Dragon Book 」を手に取ってください。通常、コンパイラ設計コースのテキストです。「字句解析とパーサーについてもっと学びたい」というあなたのニーズや、他にもたくさんの楽しいことを確実に満たしてくれます!
IMH(umble)O、腕や脚を節約して、古い版を購入してください - それはあなたの情報欲求を満たすでしょう.
Niklaus Wirth の著書「Compiler Construction」(無料の PDF として入手可能) http://www.google.com/search?q=wirth+compiler+construction
多くの人が本を推薦しています。多くの場合、これらは、割り当てや期日などを伴う構造化された環境ではるかに役立ちます. そうでない場合でも、資料を別の方法で提示することは非常に役立ちます.
(a) まともな CS カリキュラムのある学校に行くことを考えたことはありますか? (b) MIT の Open Courseware
などのオンライン講義がたくさんあります。彼らのEE/CS セクションには、構文解析に関する多くのコースがありますが、構文解析自体についてはわかりません。言語分類とオートマトンは CS 理論の多くの中心にあるため、通常は最初の理論コースの 1 つとして導入されます。
私は最近、Python で lex と yacc を実装したPLYを使用しています。始めるのは非常に簡単で、ドキュメントにはいくつかの簡単な例があります。
解析はすぐに非常に技術的なトピックになる可能性があり、PLY のようなパーサー ビルダーを使用している場合は、解析アルゴリズムのすべての詳細を知る必要がないことに気付くでしょう。
いくつかのコンパイラクラスを(かなり)受けた後、私はThe Dragon BookとC&Tの両方を使用しました。C&Tは、コンパイラーの構築を消化しやすくするという点ではるかに優れていると思います。ドラゴンブックから何も奪うことはありませんが、C&Tははるかに実用的な本だと思います。
また、Javaでの記述が好きな場合は、字句解析と構文解析のニーズにJFlexとBYACC/Jを使用することをお勧めします。
このサイトが役に立ちました:
初めて lex/yacc を使用したのは、比較的単純なプロジェクトでした。このチュートリアルは、私が本当に必要としていたすべてでした。後でより複雑なプロジェクトに取り組んだとき、このチュートリアルと単純なプロジェクトから得た知識により、より手の込んだものを構築することができました。
Java ベースのツールを好む場合は、Java コンパイラー コンパイラー、JavaCC が優れたパーサー/スキャナーです。これは構成ファイル駆動型であり、プログラムに含めることができる Java コードを生成します。数年使用していないので、現在のバージョンがどうなっているのかはわかりません。詳細については、 https : //javacc.dev.java.net/ をご覧ください。
ただし、flex と bison は新しい lex と yacc です。BNF の構文は、少し鈍いという理由で嘲笑されることがよくあります。この理由で、ANTLR と Ragel に移行した人もいます。
あまり翻訳を行っていない場合は、Perl または Ruby で複数行の正規表現を使用して 1 回限りの翻訳を行うことができます。既存の言語と互換性のある BNF 文法を書くことは、簡単にできる作業ではありません。
一方、任意の言語の .l および .y ファイルがオープン ソースとして利用可能であれば、それらを活用することは完全に可能です。次に、既存の解析ツリーから新しいコードを構築できます。
考慮すべきさらに別の教科書は、プログラミング言語プラグマティクスです。私はドラゴンの本よりも好きですが、YMMV.
Perl を使用している場合、考慮すべきさらに別のツールはParse::RecDescentです。
この翻訳を 1 回だけ行う必要があり、コンパイラ テクノロジについて何も知らない場合は、かなり単純化された翻訳を可能な限り行ってから、手動で修正することをお勧めします。はい、大変な作業です。しかし、複雑なテーマを学び、1 つの仕事に適したソリューションをコーディングするよりも簡単です。とはいえ、このテーマを学ぶ必要はありますが、それが現在のプロジェクトを完成させるための障害になることを知らないでください。
Lexing/Parsing + typecheck + code generation は CS の優れたエクササイズです。しっかりした基礎を知りたい人にはお勧めです。Dragon Book には賛成です。
解析テクニック - Dick Grune と Ceriel JH Jacobsによる実践ガイド
この本 (PDF として無料で入手可能) では、さまざまな解析手法/アルゴリズムの広範な概要が説明されています。さまざまな解析アルゴリズムを本当に理解したい場合は、この IMO が Dragon Book よりも優れたリファレンスです (Parsing Techniques は完全に解析に焦点を当てていますが、Dragon Book は解析をコンパイラ構築プロセスの 1 つの部分としてしか扱っていませんが、重要です)。 .