なんかの本で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; } }
が等価なのだけど、行数を食うので嫌った。↩