←第3回のヒント | ↑目次 | →4.3節の確認
情報科学実験II コンパイラ作成
第4回
電卓プログラムのコンパイルの方法
リスト4.2のプログラムをcalc.yとして作成して、以下の操作を行う。bison -t -dはcalc.tab.cという名前のCソースファイルとcalc.tab.hという名前のヘッダファイルを出力する。なお、bisonにさらに-yオプションをつけて起動すると、出力されるファイルの名前はそれぞれy.tab.c, y.tab.hに固定される。-tオプション(--debugオプションの省略形)をつけないと、gccでコンパイルした際に、ldにyydebugがないと叱られてうまくいかない。
bison -t -d calc.y
gcc -o calc calc.tab.c
課題4.2のヒント
SymAdd関数の動作
SymAddでは実行前の状態(A)から、SymEntryを1つ追加して(B)、symtable, prevを適切に設定(C)する。
SymLookup関数の動作
SymAddでは、大域変数symtableが最後に挿入されたSymEntryを指していて、prevを用いて挿入された逆順にSymEntryをたどっていくことができる。下の図では丸数字がSymAddで挿入された順である。例えば、SymEntryPtr xが7を指しているとき、x->prevは6のSymEntryを指す。
SymLookupでは、引数nameで与えた名前をもつSymEntryを探す。ただし、curfunc(今後の構文解析の途中で設定される大域変数であるが、SymLookup関数のテストをする際には、適宜設定すること)に属するSymEntryがあればそれを返す。
-
大域変数curfuncが図の3のmain関数を指しているものとする。ここでSymLookup("result")を実行すると、
7,
6,
5,
4を順に探して、nameメンバが"result"であり、belongメンバがcurfuncに等しい4のSymEntryを返す。
-
大域変数curfuncが図の2のfib関数を指しているものとする。ここでSymLookup("result")を実行すると、
4ではbelongメンバがcurfuncに等しくないので、さらに
3,
2,
1を探して、nameメンバが"result"であり、belongメンバがNULLに等しい1のSymEntryを返す。
トップページ