北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

A Regular Expression Matcher in Rust

ということで、ソースコードが書かれている記事を見つけた。

https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html

Rust で書き直したものを文末に貼っておく。 rstfmtif 文を改行してくれるせいで行数が膨らんでCの実装より数行長いが、ほぼ同じ感覚で書ける。 do while はないので、 for と添字を使って書き直した 1 。こういうときには配列スライスの使い勝手がとてもよい。

後、書き直していて気がついたのだが、この実装は C 文字列の末端が "\0" となっていることをうまく使っていて、そのお陰で空文字列でも気にせず 0 要素目にアクセスできている。 Rust だとそうはいかないので、 get(0) して match したりする必要がある。逆に Rust ではパターンマッチでリテラルが使えるので、 if let を用いて Some(&b'^') に直接マッチできる。


  1. loop { ... if !condition { break; } } が等価なのだけど、行数を食うので嫌った。