hokuishi.be

2023/03/04

AST

やったこと

  • タイガーブック、AST 実装

タイガーブック 4 章の抽象構文パートを読み終わって、抽象構文の実装に取りかかった。 今まで構文だと思っていたもの (3 章で実装した構文解析器が出力していた解析内容) が具象構文というもので、それから区切り文字など意味を持たない記号を除去して木構造に構造情報を持たせるようにしたり、 -i を (0-i) に変換したりして次のフェーズで扱いやすいようにしたものが抽象構文というインターフェースだと理解できた。 またこの段階でトークンのファイル上での位置情報も節や葉に持たせておいて、次からのフェーズのエラー出力などで使えるようにすることが分かった。
一昨日の日報で error 記号を含む生成規則での還元ではどのように AST を生成させるのか、またエラー回復で error 記号をシフトすることによって構文解析が最後まで完了した場合、完成した AST はエラーを含むがどう扱うのか、という疑問の回答になりそうなことがこのサイトの最後に少し書いてあった。

As the examples have shown, error recovery does not mean that the compiler has to abandon AST construction. Instead, it can generate special error nodes in the AST that are treated specially by later compiler stages. For example, it would make sense to skip error nodes when type checking, and when generating code, to emit code that halts the program with an error message. This strategy enables early testing, even before the code fully compiles!

次の段階、例えば型チェックなどで error ノードを見つけたら無視したり、コード生成の段階でエラーを吐いて止まったりするらしい 構文解析の段階でエラーがあることが分かっていても、そんなに処理を進めてしまって非効率じゃないのかとちょっと思うけれど、一度のコンパイルで多くのエラーを見つけることとエラーを発見した時点で効率良く処理を止めることのどちらをどこまでサポートするかは開発者の裁量みたいなものなのかと思った。
例えば int の値があるべきところに別の記号があり、エラー回復でそこを error 記号で補完して処理を進めていくと次以降のフェーズでもしかすると 0 除算を起してユーザが想定していないエラーを吐く場合などはどうするべきなのか、まだ分からない。 今のところは実際の値が入るべきところのエラー回復ではエラーと分かる型を入れておいて、次のフェーズで見つかった時点で処理を止めればいいのかと考えている。

思ったこと

たまたま SATySFi の話を Twitter で見つけた。 なんとなく名前は聞いたことがあったが、何か良く知らなかった。 調べてみたら TeX に代わる新しい組版システムのことらしい。 OCaml で開発されていて、関数型のような記述のコマンドが書けるっぽくて、使ってみたいと思った。

SATySFi の発表資料
SATySFi の発表動画

こういうのを作っちゃうの本当にかっこよすぎるし憧れる!

上の SATySFi の資料を読んでいたら、 ReScript の話があり興味を持った。 OCaml の文法で記述して JavaScript のコードにコンパイルできるらしい。

今日の英会話

https://eikaiwa.dmm.com/app/daily-news/article/4-day-workweek-trial-shorter-hours-happier-employees/ecVgHLKnEe29eX9NsQ-ODQ

イギリスで週 4 日勤務の実験をした結果の話。 日本でも普及しないかな、水曜休みになったら最高なんだけど。