構文解析器編、始動
さて、今日から新展開!
構文解析器の作成に移ります。英語でいうと「パーサ」と言うそうです。
パーサは、昨日まで作っていたトークン関数からトークンを受け取り、ソースプログラムが言語(ココではPascalもどき)の文法規則を満足しているかどうかを確かめます。
コンパイラの教科書だと、ここで文法の話が始まって、頭を抱えることになるところです。
今回は、目的の言語をPascalもどきと決めているので自分で文法を作成することはしません。というか、そんなこと出来る知識も頭もありません。
ちなみに、LL(1)文法ってやつに属するらしいです。
例によって、神田の古本屋で見つけた
「コンパイラの設計と構築」 Pyster著 松尾正信訳 近代科学社
の内容に沿ってやって行きます。
この本は、最初は機能を削りまくった骨組みを作り、それにちょっとずつ肉付けしながら完成に近づけていくという方法をとっています。
「段階的詳細化」方法と自慢気に説明されていましたが、割と普通のやり方と言う気がします。この本が書かれた1980年頃は画期的なやり方だったのだろうか?
その最初の骨組みが下のソースプログラム例
program test;
const
yes = true;
no = false;
small = 0;
big = 1;
var
id1 : integer;
id2 : boolean;
hen : integer;
begin
end.
になります。
最初の骨組みは
たったこれだけです。
足し算ひとつ出来ません。
この、なんにも出来ないソースの構文解析器でも、作ってみると結構大量にプログラムしないといけないみたいです。
まあ、最初の土台になるところなので、しっかり理解しながらぼちぼちと作っていきます