Go の text/scanner はレキサを書く面倒な仕事の大半をいいかんじにしてくれて本質的なコードに取り組みやすくとても便利。
しかしはてな記法や Markdown のように、行全体が単なるテキストではなくいくつかのパターンからなる文法のレキサを書くときは、パターン中に明示的に改行を含めたい。
どういうことかというと:
line: inlines CR
みたいに書きたい。
しかし scanner.Scan
が改行を含む空白文字をスキップしてしまうので改行をトークナイズする、ということができない。
結論からいうと Scanner.Scan
は Scanner.Whitespace
というフラグを見て空白文字かどうか判断するので、このフラグを変えて改行は空白文字ではないと教えてあげるとよい。
(よく読めば Scanner.Whitespace
にコメントで説明が書いてあった)
実際のコード:
Support inline HTTP annotations by aereal · Pull Request #2 · aereal/go-text-hatena · GitHubn