Open4

chumskyでBrainfuckをパースする

hotate29hotate29

パーサーコンビネーターなるものを使いたくなったので、作っているBrainfuckの処理系に組み込んでみる事にした。
chumsky 1.0.0-alpha.2を使用した。

hotate29hotate29

chumskyのexamplesを見てみると、いかにもbrainfuckをパースする実装がある。しかし、これをコピペしたら良いのかと言えばそうではない。brainfuck業界(?)では、命令に使う文字以外は全て無視するという仕様が一般的だが、サンプルに掲載されているものはそれに沿っていないのだ(コントリビューションチャンスとも言える?)。

https://github.com/zesterer/chumsky/blob/main/examples/brainfuck.rs

入力が+-><.,[]のみで構成されていたらパースできるが、それ以外の文字が含まれる場合は失敗してしまう。

hotate29hotate29

Discussionを見てみると、いかにもな話題があった。.padded_by()に他の文字にマッチするパーサーを投入したらいいという旨が書いてある(と受け取った)。
https://github.com/zesterer/chumsky/discussions/226

この中のコードは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();