LoginSignup
26
23

More than 5 years have passed since last update.

Goでlexerを作る(JSONのコメント削除とミニファイするサンプル)

Last updated at Posted at 2013-09-24

なぜ作ったか

JSONはJavaScriptと違ってコメントを含められないのですが、APIドキュメントでサンプルデータを書くときは便宜的にコメントを書いたりします。

そこで、コメントを削除して、ついでにミニファイするユーティリティをライブラリとコマンドラインツールとして作成してみました。

Goでlexerを作る

Goでlexerを書く手法の一つとしてLexical Scanning in Go - Rob Pike - YouTubeがあります。Go標準ライブラリtext/templatetext/template/parse/lex.goはこの手法で実装されています。

lexerの状態をstateFnという関数で表すのと、lexerが処理したトークンをchannelでやりとりすることにより、lexerの実装をすっきり書けるのが特徴です。

type stateFn func(*lexer) stateFn

上のlexerの仕組みをそのまま真似た版

hnakamur/jsonpreprocessのバージョンでは上のlexerの仕組みをそのまま真似た実装となっています。

使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
jsonpreprocess/minifyjson/main.go at e6a36e006e4f8b8c145972a867ce474fa8299b4d · hnakamur/jsonpreprocess
(このバージョンの時点ではパッケージ名がjsonutilだったので、go getした後にディレクトリ名を変えるか、ソースでjsonutilをjsonpreprocessに変更する必要があります。)

lexerのinputをstringからio.Readerに変えた版

lexerのinputがstringだと巨大なファイルを読み込むときに内容をメモリ上に読み込まれてしまうのがいまいちです。そこでinputをstringではなくio.Readerにするように改良してみました。
hnakamur/jsonpreprocess

使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
jsonpreprocess/minifyjson/main.go at master · hnakamur/jsonpreprocess

26
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23