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.

こんな感じ。記号の記憶管理は出来たので、つぎは文法に対応するコードの生成。演習テキストに沿ってやっていけば大方は出来そうな感じ。何問か自分で考える設問がある。もう一日かな。