2022-02-24: パーサー作ってた
やったこと
体調
ありえん悪かったので色々と休んでいた。
最近無理しすぎかもしれない。
recheck
最強のパーサーの実装を再び始めていた。
retest のおかげでかなり捗っている。が、普通に規模が大きくてしんどい。
作業に見えて、わりと意思決定が必要になる部分が多くあって疲れる。
とりあえず、次のことを決めた。
- 入力文字列をパーサーで AST にする。
- パーサーは入力文字列とフラグ、どの方言かを受け取る。
- 方言とフラグから feature set を作り、feature set に応じてパースをする。
- AST はなるべく元の入力の構造を保つようにする。
- スキップされた空白とエスケープされた文字の元の表現以外はほとんど正確に保存するつもり。
- ↑の2つを正確に保存しようと思うと raw 文字列の保存とかが必要になって面倒だけど、他は多分どうにかなる‥‥と思う。
- パースの時点では、パースに必要な程度のフラグ (基本的に
x
のみ) の解釈しないでおくようにする。
- AST をコンパイラで IR にする。
- コンパイラはパターン (AST + フラグ) とどの方言かを受け取る。
- パーサと同様に feature set を作り、それに応じて変換する。
- IR は実際に実行するつもりで情報を整理する。
- 文字クラスは解決しておく。
i
フラグなどの適用もコンパイル時に行う。- これまでは全体を正規化していたけれど、部分的に
i
フラグが適用される場合は正規化の逆変換をしなければいけないと思う。
- これまでは全体を正規化していたけれど、部分的に
^
や$
もm
フラグの有無でInputBegin
とかLineBegin
にしたり、.
もs
フラグによってDotAll
かDot
にしたりする。- サポートするつもりが無い機能は基本的に
Unsupported
に包んで返すことにする。- 部分式の (再帰) 呼び出しとか、Ruby の後方参照のネストレベルとか、バックトラックの制御コマンドとか。
- 多分がんばって実装するのは条件分岐くらい?
現状の実装状況は部分式 (グループ) のパースが条件分岐以外終わったところ。
この時点で feature set の項目がすでに40個以上ありかなり苦しい。
とはいえやっていればいつか終わるし、物としてよくなるとは思うのでやっていきたい。