ZigでJSONパーサーを書いた
ZigでJSONパーサーを書いたみた。
https://github.com/ytakhs/zig-json-parser
といっても、RFCの通りに実装したわけではなく雰囲気で実装したものなので、真の意味でのJSONパーサーとは言えないかもしれない。
特に文字列部分はエスケープ処理などを行ってなかったりと結構処理を端折ってるので、これはそのうち対応したい気持ちはある。
実は今年の2月に一度ZigでJSONパーサーを書いてみてたのだが、テスト中に発生するメモリリーク周りでハマって上手く直すことができず、放置していた。
https://github.com/ytakhs/json-parser-zig
(リポジトリの名前が紛らわしいが、消すのももったいないので戒めに残してある)
#実装に関して
パーサー実装素人ながら結構シンプルに実装できた気はしている。
以前の実装では字句解析と構文解析を別々に行っていたが、今回は特に分けずに行った。JSONパーサーくらいの簡単なものなら分ける必要がなかった。
また、細かい話だと、Zigではwhile文で他の言語のfor文のように後処理を追加できるので、それを使ってみた。
具体的には以下のend += 1
の部分。
while (self.buf[end] != '"') : (end += 1) {
if (end >= self.buf.len) {
return Error.ParserError;
}
}
今回使ってはみたものの、他の言語にはない独特な文法な気がしていて、わかりにくい気もしているが、自分がまだZigになれてないだけかもしれない。