yaccによる記号表演習
構文解析時に記号表を作る演習の部分が出来た。今日はここまでかな。明日の準備に戻ろう。
[macintosh:susi/compiler/ex3] quwaji% cat testdata2a const m=7,n=8; var x,y,z procedure MULTIPLY; var aa,bb begin aa := x; bb:=y; z:=0; while (bb > 0 do begin if odd bb then z := z+aa; aa := 2 *aa; bb:= bb / 2 z := aa + bb end end; begin x := m ; y := n; call MULTIPLY; write(zz, x+y 8) end. [macintosh:susi/compiler/ex3] quwaji% ./ex2-2 < testdata2a setinitialenv(); enter(1, m, 7); enter(1, n, 8); enter(2, x, 0); enter(2, y, 0); enter(2, z, 0); line (5) : syntax error enter(3, MULTIPLY, 0); setnewenv(); enter(2, aa, 0); enter(2, bb, 0); line (7) : syntax error line (8) : syntax error line (12) : syntax error outofblock() level:1 name type level val addr ---------- ---- ----- ----- ----- aa 2 1 0 3 bb 2 1 0 4 dx level base top ----- ----- ----- ----- 6 0 1 7 5 1 7 9 line (18) : syntax error outofblock() level:0 name type level val addr ---------- ---- ----- ----- ----- m 1 0 7 0 n 1 0 8 0 x 2 0 0 3 y 2 0 0 4 z 2 0 0 5 MULTIPLY 3 0 0 0 dx level base top ----- ----- ----- ----- 6 0 1 7 5 error detect.
こんな感じ。記号の記憶管理は出来たので、つぎは文法に対応するコードの生成。演習テキストに沿ってやっていけば大方は出来そうな感じ。何問か自分で考える設問がある。もう一日かな。