読者です 読者をやめる 読者になる 読者になる

パーサーをつくること(1)

研究室の地獄の春合宿で、AppleI標準のモニタプログラムクローンをC言語で作ることになった。

モニタプログラムとは。昔のマイコンプログラミングで必要だったもの。OSなど入っていないので、メモリに自分でバイナリを"なんらかの方法で"書き込んで、最後に"なんらかの方法で"実行させ、メモリ最上部からデータをCPUに読み取らせる。

この"なんらかの方法”が無いとそもそも書き込みも読み込みのできない金属なわけだが、幸いAppleIには標準でメモリの内容を表示させたり、メモリに任意のデータを書き込んだりできるプログラムが内蔵されていたようだ。それがモニタプログラム。

今回はこれを擬似的に再現するプログラムをCで記述することになる。モニタプログラムという言葉ではあるが、任意の文字列を命令と解釈して実行させるという、一種のパーサなのではないだろうか。しかしコンパイラ技術を勉強したことが無い私にとっては、単なる想像でしか無いわけだが。

これは予習しないとマズイということで、命令をパースするプログラムについて調べた。

ベースとなる知識

  • プログラミング言語
  • 字句解析: 文字列をトークンに分割する。a+bをaと+とbに分けて認識できるようにする
  • 構文解析: トークン同士の関係を組み立てる。解析木を作る
  • コード生成: 今回はやらないけど一般的なコンパイラは解析木からイロイロ経てバイナリにしますね

今回やるとしたら?

実機は無いのでシミュレーターのようなものになる。配列をメモリとして見て、そこにreadなりwriteなりする。

字句解析

  • getcharとかscanfのループで文字を取得
  • スペースや記号でトークンに分ける
  • 改行を契機に構文解析にまわす

構文解析

  • 命令の種類をグループにしてまとめておく
  • 字句解析である程度アタリをつけておく
  • 操作ごとに細かい関数にしておく
  • トークンを読み取りつつひたすらswitchして関数呼び出しかな?

なんかぐぐるとスタックで処理するらしい!
作りながら、つづきます。