Open4
chumskyでBrainfuckをパースする
パーサーコンビネーターなるものを使いたくなったので、作っているBrainfuckの処理系に組み込んでみる事にした。
chumsky 1.0.0-alpha.2を使用した。
chumskyのexamplesを見てみると、いかにもbrainfuckをパースする実装がある。しかし、これをコピペしたら良いのかと言えばそうではない。brainfuck業界(?)では、命令に使う文字以外は全て無視するという仕様が一般的だが、サンプルに掲載されているものはそれに沿っていないのだ(コントリビューションチャンスとも言える?)。
入力が+-><.,[]
のみで構成されていたらパースできるが、それ以外の文字が含まれる場合は失敗してしまう。
Discussionを見てみると、いかにもな話題があった。.padded_by()に他の文字にマッチするパーサーを投入したらいいという旨が書いてある(と受け取った)。
この中のコードはchumsky0.9系で動くように書かれたものらしく、そのまま写してもchumsky 1.0.0-alpha.2では動かない(filter()関数が無い)。
具体的はこの部分。
let invalid_chars = filter(|c| !VALID_TOKENS.contains(*c)).repeated();
any()を使ってこのように書き換える事ができる。
let invalid_chars = any().filter(|c| !VALID_TOKENS.contains(*c)).repeated();
そうしたら動くようになる。やったね