なんかの本でCで数十行のバックトラックを使った正規表現のマッチャが紹介されてた記憶があるんだけど、ビューティフルコードだったっけ?#regexfesta
— hiratara (@hiratara) October 18, 2019
ということで、ソースコードが書かれている記事を見つけた。
https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html
Rust で書き直したものを文末に貼っておく。 rstfmt が if 文を改行してくれるせいで行数が膨らんでCの実装より数行長いが、ほぼ同じ感覚で書ける。 do while はないので、 for と添字を使って書き直した 1 。こういうときには配列スライスの使い勝手がとてもよい。
後、書き直していて気がついたのだが、この実装は C 文字列の末端が "\0" となっていることをうまく使っていて、そのお陰で空文字列でも気にせず 0 要素目にアクセスできている。 Rust だとそうはいかないので、 get(0) して match したりする必要がある。逆に Rust ではパターンマッチでリテラルが使えるので、 if let を用いて Some(&b'^') に直接マッチできる。
-
loop { ... if !condition { break; } }が等価なのだけど、行数を食うので嫌った。↩