今月の活動について (knowbug リリース、網羅性検査の記事、HSP3 の記事、X-BNF 言語など)
knowbug
https://github.com/vain0x/knowbug/commits/master?after=593608afcccaff5849d014578eeaf8cefbf7115c+34
- https://github.com/vain0x/knowbug/releases/tag/v2.0.0
- 機能が揃ったので v2.0.0 正式版をリリースした。
- デバッグウィンドウ knowbug や VSCode 上の開発環境など - HSPTV!掲示板
- デバッガーが HSP で書かれているのは面白いかな、と思ったので掲示板で宣伝した。
- 不具合報告やご意見をもらえて良かった。
- v1.0.0 をリリースしたときもスレッドを作った けど、あれから 10年と1週間が経過していて驚いた。
網羅性検査
静的型付き言語の便利な点の1つとして、パターンマッチに漏れがなく網羅的であることがコンパイル時に検証されることがあります。本稿ではパターンマッチの説明から始め、「スペース」という概念を用いてパターンマッチの網羅性を検査するアルゴリズムの大ざっぱな雰囲気を述べます。また、その試験実装を作ったので公開します。
この記事は 2019年12月の 言語実装アドベントカレンダー の21日目です。
- アドベントカレンダーに記事を投稿した。
- 先月は LSP/DAP の記事を書く、と予告したけど、仕上がらなかったのでこっちに。
- 記事ではあまり触れてない裏目標として以下の2つがある。
- 1つ目は Web/monaco-editor 上で自作言語の処理系を動かすこと。
- Rust で書いたパーサや型検査・網羅性検査を WebAssembly にコンパイルして動かしている。
- wasm-bindgen/wasm-pack といったライブラリのおかげで簡単にできる。これも後で記事にしたい。
- 2つ目は、ロスレス構文木を使うこと。
- 近況記事シリーズでしばしば触れている rust_analyzer 風に、パースの結果としてロスレスな (元のソースコードの空白なども含めて完全にデータを維持する) 構文木にする手法を試した。
- わりと感覚が掴んできたし、パースからエラー報告を分離できる利点に気づいた。
- 例えば網羅的でない match 式の
match
キーワードの位置にエラーを出しているが、「match
キーワードの位置」をパース時に見つけておく必要がない。エラーが出た後に構文木の上を走査して位置を特定している。 - これのせいで時間的にギリギリになった面もある。
X-BNF 言語
https://github.com/vain0x/xbnf-lang
- 拡張 BNF 言語を解析して FIRST 集合や FOLLOW 集合を計算するアプリを作った。
- 再帰下降パーサを生成するコードジェネレータにする予定だったが、詰まっている。
- パーサはほぼ規則的に書いているつもりだったから、規則的に生成できると思いこんでいたが、思いの外不規則だったことに気づいた。
その他
- VSCode で HSP3 の開発環境を作る [2019年末]
- 先月に作った VSCode 拡張機能や LSP とかの導入をまとめて紹介する記事を書いた。
- テキスト上の位置の計算と合成 or 累積和の一例
- テキスト上の位置 (行番号, 列番号) の計算について書いた。
- モノイドの累積和の実用例の1つになっていて面白い、という感想を言いたかった。
- https://twitter.com/vain0x/status/1206538992188936193
- 椅子が壊れたので、そこそこ良いやつを買った。