コンパイラレポート-手続き 4 と５の解析

コンパイラレポート

手続き４と５の解析

7JFC1121
佐藤圭一

Page 1
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析

目次

Page 3 §１：手続きの概要
Page 3 §２：ソースコードの書式
Page 4 §３：ソースコード＊本文は段組の関係上、8points としました。

Page 2
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析＊§1：手続きの概要
nextch 手続きは、ファイルポインタより、次の文字を取り出す手続きである。
Insymbol 手続きは、次の命令コードを解釈する手続きである。
Insymbol 手続き中で、nextch 手続きは呼び出される§２：ソースコードの書式
ソースコードは、以下のような構成になっている。
対訳

Source_code
対訳の書式は、ネスト及び繰り返し等、入れ子の部分は「|」で表されており、繰り返し条件等は、人間が判断しやすい形に直してある。
つまり…

繰り返し開始|a>b なら||b に１足す|||c に１足す
|d<c なら繰り返す

repeatif a > b thenbegin
b := b + 1;
end;
c := c + 1;
until d > c;の様になる。

Page 3
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析

nextch 手続き

procedure nextch;
begin

cc と ll が等しければ|||source が^Z だったら||||「コンパイル出来ない」と出力||||9999 に飛ぶ|||errpos が 0 以外なら||||改行出力||errpos を 0 にする
|||
|空白出力
|ll を 0 にする||source が行末でなかったら||||ll に 1 足す||source から配列 inline[ll]に入れる||inline[ll]を出力
|||
|改行出力
|source を改行まで読む|ll に 1 足す|inline[ll]を初期化|cc を 0 にする|

if cc = ll thenbegin
if eof(source) thenbegin
writeln;writeln('program incomplete');goto 9999
end;
if errpos <> 0 thenbegin
writeln;errpos := 0
end;write('ll := 0;');while not eoln(source) do
begin
ll := ll + 1;
read(source, inline[ll]);
write(inline[ll])end;writeln;
readln(source);ll := ll + 1;
inline[ll] := ' ';cc := 0end;

cc に 1 足す
ch に配列 inline[cc]を入れる
nextch 終了

cc := cc + l;ch := inline[cc];end (* nextch *);Page 4
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析

insymbol 手続き

procedure insymbol;(*global - ch, sy, inum, id *)l はラベルと宣言
I j k を整数型で宣言

label l;var i, j, k : integer;
begin

ラベル l はここですl:while ch = ' ' donextch;ch が空なら|nextch を呼ぶ

if ('0' <= ch) and (ch <= '9') thenbegin
sy := intliteral;
inum := 0;
k := 0;ch が 0〜9 の間なら||sy に intliteral を入れる
|inum を 0 にする|k を 0 にする||繰り返し開始||inum=inum*10+ord(ch)-ord(‘0’)||k に１足す||nextch を呼ぶ||ch が 0〜9 の間なら繰り返す||k>dmax なら||||error に引数 34 をつけて呼ぶ||inum を 0 にする||k を 0 にする|||

repeatinum := inum * 10 + ord(ch) - ord('0');k := k + 1;
nextchuntil (ch < '0') or ('9' < ch);if k > dmax thenbeginerror(34);
inum := 0;
k := 0;end
end

ch が 0〜9 以外なら
|ch が A〜z の間(英字)なら||||id に空白を入れる||k を 0 にする||||繰り返し開始|||k<namel なら||||||||k に１足す||||ch から配列 id[k]に入れる||||||||||nextch を呼ぶ|||ch が英数字なら繰り返す||||I を 1 にする||j に nrw を入れる

else
if ('A' <= ch) and (ch >= 'z') thenbegin
id := '';
k := 0;repeatif k < namel thenbegin
k := k + 1;
id[k] := chend;
nextchuntil not (ch in ['0'..'9', 'A'..'z']);i := 1;
j := nrw;

Page 5
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析

repeatk := (i + j) div 2;
if id <= rw[k] thenj := k - 1;||繰り返し開始|||k に(I+j) / 2 を入れる|||もし id <= rw[k]なら||||ｊに k-1 を入れる||||||もし id >=rw[k]なら||||I に k+1 を入れる||||||j<I なら繰り返す||||i-1>j なら|||sy に配列 syrw[k]を入れる||||I-1<=j なら|||sy に identifier を入れる|||||
ch が英字以外なら|ch の内容が…
||「)*+,-.;=」なら||||||sy に配列 sysc[ch]を入れる|||nextch を呼ぶ|||||||「(」なら…
||||||nextch を呼ぶ||||||ch が*なら||||||||nextch を呼ぶ||||||||繰り返し開始|||||ch が*以外になるまで…
||||||nextch を呼び続ける|||||nextch を呼ぶ|||||ch が)以外なら繰り返す||||||||nextch を呼ぶ||||l に飛ぶ||||||||||ch が*以外なら||||sy に sylparen を入れる|||||

if id >= rw[k] theni := k + 1
until i < j;if i - 1 > j thensy := syrw[k]elsesy := identifier
end
else
case ch of')', '*', '+', ',', '-', '.', ';', '=':
begin
sy := sysc[ch];nextch
end;
'(':
begin
nextch;if ch = '*' thenbegin
nextch;repeatwhile ch <> '*' donextch;nextchuntil ch = ')';
nextch;goto lendelse
sy := sylparen
end;

Page 6
7JFC1121 佐藤圭一

コンパイラレポート-手続き 4 と５の解析||「:」なら…
||||||nextch を呼ぶ||||ch が=だったら||||||||sy に sybecomes を入れる||||nextch を呼ぶ|||||||ch が=以外だったら||||sy に sycolon を入れる|||||||「<」なら…
||||||nextch を呼ぶ|||ch が=だったら||||||||sy に syle を入れる||||nextch を呼ぶ|||||||ch が=以外だったら||||ch が>だったら||||||||||sy に syne を入れる|||||nextch を呼ぶ|||||||||ch が>以外だったら|||||sy い syle を入れる|||||||「>」なら…
||||||nextch を呼ぶ|||ch が=だったら||||||||sy に syge を入れる||||nextch を呼ぶ|||||||ch が=以外だったら||||sy に sygt を入れる|||||||「他の記号」だったら…
||||||||||error に引数 1 をつけて呼ぶ|||nextch を呼ぶ|||l に飛ぶ|||||
insymbol 終了

':':
begin
nextch;if ch = '=' thenbegin
sy := sybecomes;
nextchendelse
sy := sycolon
end;
'<':
begin
nextch;if ch = '=' thenbegin
sy := syle;nextchendelse
if ch = '>' thenbegin
sy := syne;nextchendelse
sy := syleend;
'>':
begin
nextch;if ch = '=' thenbegin
sy := syge;
nextchendelse
sy := sygt
end;'!', '"', '#' ,'$' ,'%' ,'&' , '''','/', '?', '@', '[' , '¥', ']', '^','_', '`', '{', '|':
beginerror(1);nextch;goto lendendend (* insymbol *);Page 7
7JFC1121 佐藤圭一