[[FrontPage]] 2008/05/21からのアクセス回数 &counter; #contents * sampleCコンパイラのソース・リスト [#a5d6de38] 原書では、ソースリストがでているますが、それをbision, flex, gccに対応するように 修正し、現在のシステムでも動作するソースリストを添付します。 7章、8章のサンプルと同じ結果ができることを確認しました。 ** 字句解析 [#k7fa2291] sample.lが字句解析のソースです。 flexでコンパイルする場合には、 #pre{{ flex sample.l }} とします。 #ref(sample.l); ** シンタックス解析 [#ld8e0c68] sample.yが、bisionの入力とするシンタックス解析のソースです。 y.tab.hを出力するために、-dオプションを指定し、出力をyaccと同じくするために-oオプションを指定します。 #pre{{ bison -d -o y.tab.c sample.y }} #ref(sample.y); ** メッセージ [#ued6ac12] message.cは、エラーメッセージを扱う関数です。可変引数を扱うように修正しました。 #ref(message.c); ** 記号テーブル・ルーチン [#j88126d8] symtab.hは、sample.yをコンパイルするために必要な記号テーブルを持ったファイルです。 #ref(symtab.h); symtab.cは、記号テーブルを処理するCの関数です。 #ref(symtab.c); ** メモリ・アロケーション [#zf27c705] mem.cは、メモリ・アロケーションのためのCの関数です。 #ref(mem.c) ** コード生成 [#w20f183b] gen.hには、sample.yのコンパイルおいて必要な、シンボリック・コード生成のための ニーモニックが記述されています。 #ref(gen.h); gen.cには、sampleCが使われる仮想的な計算機のアセンブリ・コードを生成するCの関数が記述されています。 #ref(gen.c); ** ロードアンドゴー・システム [#k5cfa936] sampleCコンパイラのロードアンドゴー・バージョンは、-DSIMULATORオプションでコンパイルします。 simulator.mkがロードアンドゴー・システム用のmakefileです。 sim.hは、シミュレータ用のニーモニック定義をしています。 #ref(sim.h); #ref(simulator.mk); sim.cは、仮想的な計算機のための実際のシミュレータ・プログラムです。 #ref(sim.c); simgen.cは、シミュレータ用のコード生成ルーチンです。 #ref(simgen.c); ** その他のファイル [#ye9196a9] bison, flexのライブラリがない環境でも動作するようにyyerror.c, yywhere.cに簡易バージョンを定義しました。また、yyerfpの定義のために、main.cを用意しました。 #ref(yyerror.c); #ref(yywhere.c); #ref(main.c); コード生成を作成するためのMakefileも用意しました。 #ref(Makefile); コード生成版(generator)を作成するmakeコマンドは、 #pre{{ make }} です。 シミュレータ(simulator)を生成する場合には、*.oファイルを削除してからmakeコマンドを実行します。 #pre{{ make clean make -f simulator.mk }} ** 備考 [#a4df9587] 原書のyaccparのエラー・メッセージに関連する部分は、bisonとyaccのコード生成がことなるため省略させて いただきました。 ** コメント [#y3b4cd07] この記事は、 #vote(おもしろかった[18],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 - kenさんのご指摘でsample.lの%=, ++, --の定義を修正しました。 -- [[竹本 浩]] &new{2010-07-31 (土) 13:14:13}; #comment_kcaptcha 削除しました(removed)