Go の text/scanner で改行をトークナイズしたいときは

Go の text/scanner はレキサを書く面倒な仕事の大半をいいかんじにしてくれて本質的なコードに取り組みやすくとても便利。

しかしはてな記法Markdown のように、行全体が単なるテキストではなくいくつかのパターンからなる文法のレキサを書くときは、パターン中に明示的に改行を含めたい。

どういうことかというと:

line: inlines CR

みたいに書きたい。

しかし scanner.Scan が改行を含む空白文字をスキップしてしまうので改行をトークナイズする、ということができない。

結論からいうと Scanner.ScanScanner.Whitespace というフラグを見て空白文字かどうか判断するので、このフラグを変えて改行は空白文字ではないと教えてあげるとよい。

(よく読めば Scanner.Whitespace にコメントで説明が書いてあった)

実際のコード:

Support inline HTTP annotations by aereal · Pull Request #2 · aereal/go-text-hatena · GitHubn