hokuishi.be

2023/02/28

コンパイラコンパイラ

やったこと

  • タイガーブック 3 章を読んだ
  • 構文解析器の実装

タイガーブック 3 章のエラー回復の部分を読んで、構文解析器の実装に取りかかった。 ようやく実装が始められた! 構文解析の章は他の章と比べて少しページ数多めかつ、いろいろな文法の構文解析表を理解して手で追うのにてこずったため時間がかかった。
実装は ocamlyacc を使用して書いている。 最近は Menhir を使うのがスタンダードっぽい雰囲気を感じる。 実際、GitHub にある tiger の OCaml での実装では Menhir を使うものがほとんどだった。 しかしタイガーブックと同様の LALR 構文解析器を生成したかった上、必要最小限の機能で早く開発したかったため今回は ocamlyacc を採用した。 Menhir は ocamlyacc と 90% の互換性があるらしいから、後からの移行もそんなに難しくないだろうと思っている。

ocamlyacc の定義ファイルを書いていて思ったことを列挙しておく。 後から解決するかもしれないから。

  • declarations の部分で %change%value が使えない?
  • %token でトークンを定義すると .ml ファイルに新しいトークン型が生成されるため、本来は lexer のトークンは parser で定義されているものを使う

明日は shift/reduce conflict を消しまくるぞ~

思ったこと

たしか PL/0' コンパイラ (LL(1)構文解析) ではエラー回復は現在読んでいる場所で足りないトークンを挿入・置換するか、想定している先読みトークンまで入力を捨てることである程度の回復をしていた。 Burke-Fisher エラー修復はエラーが見つかった箇所から前に挿入・置換・除去をするため、 PL/0' での実装より強力だと思う。

今日の英会話

https://eikaiwa.dmm.com/app/daily-news/article/survey-what-could-america-learn-from-other-countries/KsStpLFLEe2ZlVPTovZTGA

アメリカ人が他の国から取り入れた方が良いと思っていることの話。 アメリカは道路・歩道の状況が良くないことが分かった。あとヤード・ポンド法は変えてほしい。 チップの話になってセルビアでは義務では無いがチップを払う慣習があるらしい。払わなくても違法にならないからセルビアに来た時は安心してと言われた。