2023/02/04
字句解析器完成
やったこと
- タイガーブック、字句解析器
字句解析器が完成した。
PL/0' コンパイラ (Go で実装) を書いていた時よりも理解しやすいコードになって楽しい。
これは単純に元のプログラムの構成が、抽象言語に対してフェーズ毎に分割されているか、分割されておらずフェーズ毎のコードが密結合かという差や、フルスクラッチか lex を使うかの差のせいかもしれない。
PL/0' コンパイラは Go で実装していてトークンを列挙型 (Go に enum は無いため const と iota で書く) で定義していたが、 tiger 言語は OCaml で実装していてトークンはヴァリアントで定義している。
このヴァリアントが思ったより強力な機能で快適だと気づいた。
定数を列挙するだけでなくコンストラクタにデータを持たせられて良い。
どんどん OCaml を好きになっていく。
思ったこと
文字列とコメントは符号の中の要素やきちんと閉じているかを考慮しないといけないため、単純に正規表現一つで書くことができないと分かった。
またエスケープシーケンスの中でも \ddd
(10 進数 3 桁の ASCII コードに対応する印字可能文字) が少し面倒だった。
PL/0' はたしか文字列やコメントが無かったから、ここらへんの手間が分かっていなかったけど lex を書いてみて、これを手で実装したら大変そうだと感じた。
ただ lex の自動生成のコードは遅いと批判されることがあるらしくて、これは lex が内部で DFA の遷移表を作ってそれを参照するせいだと書いてあった。
これを改善するために分岐をコードで実現する flex (fast lexcal analyzer generator) というものがあるみたい。
今日の英会話
スペルを見ただけでは発音が難しい単語の紹介。 先生は epitome と albeit を教えてくれたんだけど、どこでこういう単語と出会うんだろう。