構文解析ハンズオンに参加してきました #構文解析ハンズオン

ちょっと行ったことのない感じの勉強会に参加してきました。

lang-impl.connpass.com

GitHubにテストコードと回答の付いたソースコードがあって、cloneしてテストを通すようにする流れ。

午前中にイントロダクション的な講義があった後は、課題の説明→コード書く→解説を繰り返す感じだった。

扱った課題

  • 1桁整数
  • 非負整数
  • 単純な算術式
  • 一般的な算術式
    • 四則演算
    • ネスト可能
    • カッコによる優先順位変更
  • JSON

自分は一般的な算術式の途中までしか行けなかった。。

構文解析初挑戦

前提知識が何も無い中で挑んだので中々難しかった。

テストがあったので、テストが通るように自力の力技で進めてたんだけど、算術式あたりで限界を迎えた。

Qiitaでちょうど似たことを扱ってる記事があり、参考になった。

qiita.com

反省点としては、Javaとしての書き方やオブジェクト指向的な書き方(というか、普段コード書く時に最初に考えること)が先に来てしまって、構文解析の理解を妨げてしまった気がする。

たとえば、Stream使うとか、処理の共通化とか、状態管理(インデックス位置の扱い)なんかは、一旦脇においたほうがよかったかも。 (逆にいうと、Javaでやったけど、言語から一歩引いて処理の仕方を考えるというのは普段やらないことなのですごく刺激があった気はする。)

たぶん本当はBNFの方が重要で、BNFがしっかりできれば、あとはコードに落としこんでいくだけなのかなぁ、なんて思ったり。
(あぁ、だから構文解析器があるのか?)

残念ながらコードに落とし込む力が足りずにタイムオーバーでしたが。。

まとめ

  • 正規表現ではできないことを無理やり正規表現でどうにかしようとしているのを見かける、っていう話は印象に残った。

  • 構文解析の知識がついたかは自信ないけど、朝の11:00から夜19:30くらいまで、普段とは違う形で頭を使ったのはすごく有意義だったと思う。
    (最後の方は頭から煙出てた気がする)

  • 本格的な構文解析は考慮しなきゃいけないことさらにたくさん増えそうだし、自分が普段何気なく使ってるようなParserの凄さを実感した。

  • ちょっとドキドキしながら参加したけど、楽しい一日だった。

当日の資料

kmizu.github.io