タイガーブックを読む(1)
タイガーブックが届いたので読んでいきたいと思います。
まずは、以下が目次です。
第1部 コンパイラ基礎編
1.はじめに slp.sml
2.字句解析 driver.sml errormsg.sml sources.cm tiger.lex tokens.sig tokens.sml
3.構文解析 errormsg.sml parsetest.sml sources.cm tiger.grm
4.抽象構文 absyn.sml errormsg.sml parse.sml prabsyn.sml sources.cm symbol.sml table.sig table.sml tiger.grm
5.意味解析 types.sml
6.駆動レコード
7.中間コードへの変換 printtree.sml temp.sig temp.sml tree.sml
8.基本ブロックとトレース canon.sml
9.命令選択 assem.sml canon.sml flowgraph.sml graph.sig graph.sml main.sml runtime.c
10.生存解析 graph.sml
11.レジタス割付け
runtime.c
12.コンパイラ製作
第2部 コンパイラ発展編
13.ごみ集め
14.オブジェクト指向言語
15.関数型プログラミング言語
16.多相型
17.データフロー解析
18.ループ最適化
19.静的単一代入形式
20.パイプライニングとスケジューリング
21.メモリ階層
付録A Tiger言語リファレンスマニュアル
第1部で基本的なコンパイラを作成し、第2部でより高度な拡張をするようです。
ソースファイルが以下の著者のサイトからダウンロードできます。
http://www.cs.princeton.edu/~appel/modern/ml/project.html
番号がそれぞれの章に対応しているようです。
第1部のソースが公開されていて、第2部のソースはないようです。
"はじめに"のslpをscalaに移植したのが以下のソースになります。
この例ではidはStringの別名で、binop,stm,expという3つのデータタイプがあります。
プログラムはstmで表現できて、progはプログラムを表した例になっています。
object slp { type id = String abstract sealed case class binop() case class Plus() extends binop case class Minus() extends binop case class Times() extends binop case class Div() extends binop abstract sealed class stm() case class CompoundStm(a:stm, b:stm) extends stm case class AssignStm(a:id, b:exp) extends stm case class PrintStm(a:List[exp]) extends stm abstract sealed class exp() case class IdExp(a:id) extends exp case class NumExp(a:Int) extends exp case class OpExp(a:exp, b:binop, c:exp) extends exp case class EseqExp(a:stm, b:exp) extends exp val prog:stm = CompoundStm( AssignStm( "a", OpExp(NumExp(5), Plus(), NumExp(3)) ), CompoundStm( AssignStm( "b", EseqExp( PrintStm( List( IdExp("a"), OpExp(IdExp("a"), Minus(),NumExp(1)) ) ), OpExp(NumExp(10), Times(), IdExp("a")) ) ), PrintStm(List(IdExp("b"))) ) ) }