読者です 読者をやめる 読者になる 読者になる

niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

自作パーサを作る(つくった)お話

昔話。

異動前の部署ではなんかやたら忙しくって、去年は色々と試行錯誤していました。
新規に書くネタがないからではないですが、ちょっと昔の話を書いていこうかと。

チェッカを作る。

当時・・・と言っても今もだけど、いろいろなものが目視チェックに頼る仕組みとなっていました。まぁエンジニアの目は結構信用できるものです。人に依りますし、体調や気分にも影響を受ける。数をこなせば疲労がたまって集中が解けてミスも起こる。良くないことです。

そこで、自分でルールをまとめてチェッカを作れば良いのではないかと。そう思ったのです。それ以前も同様にやってきましたしね。
さらに、どうせやるならば新しいことをしよう。単なるperl1行野郎は卒業するぜ!と意気込んで、python+antlr4に行きついたのでした。

なお、本文中では構文解析、字句解析を区別せずにパーサと呼んでいます。本当は区別するべきところですが、語れるほど詳しくないので興味のある方は調べてみてくださいということで。

python3を使いたかった。

当時、python3を使い始めた私は適当に理由をつけてこれを使いたかった。別にrubyでも良かったのだが。

Pythonで扱えるパーサは例えばここで知ることが出来た。

qiita.com

開発が継続しているか?とか、機能が十分か?という点も気になったのですが、第一に「ルールファイルとプログラムを分けて書けることが出来る」という点に惹かれてAntlr4を選択したのです。

パーサって何。

当然何も知らないので、そもそも構文解析って何よってところから調べました。 その時は以下3冊を読みましたね。無道編はあまり読んでないのだけど。ふつコンは後半以降は読んでないです。コンパイラを作るわけではなかったのでね。

  • ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み
  • Rubyを256倍使うための本 無道編
  • The Definitive ANTLR 4 Reference

Antlr4については、

github.com

で結構見れるのですが、行間がやはりわからない。なので、やはり書籍で通して学ぶのは大事だなと思った次第です(まぁ全部は読めてないのですが)

書籍の内容をpython3で動かせるリポジトリはこちらにあるので参考になりました。 github.com

https://github.com/antlr/grammars-v4

やってみた。

ざっくり言ってしまえば「正規表現のようなものを積み上げていったもの」なので、文法がちゃんと決まっているもの、BN記法が公開されているものはその通り文法ファイル書けば大体動きました。が、先頭が0で始まってはいけない整数と0を許す整数などがうまく作り分けられず、結局は処理側で何とかしてしまいました。 この辺りはAntlrの仕様の理解が甘いのと、そもそもの構文解析に対しての理解が甘いからなのです。

とはいえ、自分の書いた文法ファイルでちゃんとパースされる様を見るのは楽しいです。本来の目的を忘れていますが。

文脈自由文法…白と黒のとびらを読んだのに細かいことは忘れました。

バッカス・ナウア記法 - Wikipedia

結果

上にも書いた通り、文法がはっきりしているものは良いのです。書けばよいので。 何かの「ログ」とかは文法はもとより、「今まで遭遇していないパタン」が来ると全然太刀打ちできません。

結局、ログは今まで通りperl/pythonで解析、文法がはっきりしていたものはパーサとして作りましたが、決め打ちで作ったperlの方が圧倒的に早かったので結局使っていないのでしたとさ。

いずれ…

Antlr4はverilogはパーサがあります。しかしSystemVerilogはないのです。verilogも特殊なものは入ってない。 なので、作ったら取り込んでもらえるかもしれません。svの仕様は一応全部公開されていたはずで…

github.com