tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

MySQLのクエリパーサー部分を抜き出したい

yaccファイルはあるんだけど、lexどうなっているのかわからなくて困っていた。

どうも字句解析は自前でやっている様子。 stop slave until ...の挙動を調べたいこともあって、step実行できる環境を作ることにした。

https://www.cnblogs.com/nocode/archive/2011/08/03/2126726.html

mysql.taobao.org

アリババの人な気がするんだけれど、MySQLのソースを読んで解説を書いていると思われる記事は中国語のものが結構良い気がしてきた。 これによるとMySQL構文解析は8.0でtop downな解析からbottom upになったらしい。yaccで書くとLALRで解析するからbottom up何じゃないの?という気もするが多分私の勉強が足りない。。。

組んだPCは実験用Centosサーバにする予定

bootableusbが起動しない(途中で落ちる)問題

メモリスロットの指し方が悪かったのか、メモリを1枚刺しにするとインストールが成功した。

すでにubuntu desktopをインストール済みのSSDで起動するとメモリを4枚刺しでも問題なく全て認識され、メモリを使ってみてももんだいないが、インストール用のisoファイルからだと何故か途中で死んだ。

結局1枚刺しにしたらうまく言ったので、インストールされたOSでうまくいくかは今後検証。

networkに繋げない

ip a打ってもnicにipが振られなくて困っていた。 以下で解決した。 デフォルトでonboot=offなのか。。。

  • NetworkManagerの停止、自動起動の停止
  • /etc/sysconfig/network-scripts/ifcfg-eno1のONBOOT=noをyesにする
  • systemctl restart network で再起動

flex & bisonを動かしてみた

flex & bisonのsample 1-5を写経して動かしてみた。

<exp> ::= <factor> 
      | <exp> + <factor>
<factor> ::= NUMBER
      | <factor> * NUMBER

これで動くのよくわかってなくて、昔やった感じだと()が入っちゃってるけど、↓

<expression> ::= <term> [ ('+'|'-') <term> ]*
<term>   ::= <factor> [ ('*'|'/') <factor> ]*
<factor> ::= <number> | '(' <expression> ')'

こういうやつじゃないと再帰止まらなくならないのか?ってなってる。。。 疲れ切って疲れ切ったのでまた明日

言語実装パターン読んだ

言語実装パターン再帰下降構文解析のパターン3までを読んだ。 この本だと再帰的下向き構文解析。LL(k)で字句解析、構文解析するのが基本な気がするのだけれどLL(1)の説明が多いのは基礎的な仕組みの説明を死体からなのだろうか?

手を動かしてみないとよくわからない感じもある。

構文解析についてはMySQLSQLをうまく扱えるようになりたくて、yaccのファイルを見てみた。

/storage/innobase/pars/pars0grm.y

bisonで-gオプションを付けて読ませればdotファイルでgraphvizで可視化するためのファイルができる。 これをsvgで見たんだけど全然見れたものじゃなかった。。。pngは字が潰れちゃって無理w

ファイルがでかすぎてここに貼るのもやめた。

SQLiteだとTkっていうのを使ってsyntax graphをrailroad graph(?)で図示していて羨ましいんだけど、これを手で書くのはナンセンスなので、上記の.yファイルから良さげなsyntaxグラフを作成するのを一つの目標にしたい。

wiki.tcl-lang.org

あとはpt-fingerprint的なものを作るのが実用的な目的といったところ。

コンパイラ学習その3, 本の続き

コンパイラの構成と最適化を読み進めた。 疲れてきてるのかLL文法の定義が全然頭に入ってこなくて今日はここまで。

"コンパイラの構成と最適化"では文法として以下の3つとその応用があればそれを説明している。 それぞれの解析手法として演算子順位解析手法、LR構文解析再帰下降構文解析(LL)を解説していて丁寧。

  • 演算子順位文法
  • LR文法
    • SLR, LALR
  • LL(k)文法
    • 一般的にはLL(1)

一方で"言語実装パターン"では基本的な構文解析パターンとしてLL(k)とその解析手法としての再帰下降構文解析を説明して、高度な構文解析パターンで、パックラット構文解析、後戻り構文解析器、メモ化構文解析器、述語制御構文解析器をパターンとして解説している。 さらに"言語実装パターン"では構文解析器の種類やその走査、書き換えについても章を割いて説明していて、両方を行ったり来たりしながら読むと良さそうって感じで盛り上がってる。

ところで正月休み終わるのにコンパイラやってて大丈夫なのだろうか?まあ、大丈夫なんだが。。。

コンパイラ学習続き

Ruiさんのコンパイラ本作成中のページの現時点部分はいくつか実装し、内容はわかったので、circle ciでテストを回すようにしたりしていた。circle ci使ったことないけど、結構便利(雑)。

今後の方針

コンパイラの学習をどうするのか決めた.
まずはC++でCの言語仕様の一部をLLVM IRに変換することにした。

再帰降下でがりがりスクラッチで書いていくのではなく、yacc, lex(実際はbison, flexかも)を使ってまずは動かせるところまでをやっていく。

教材探し

大学のときに買ったいわゆるドラゴンブックがあるけど、やはりこれだけでは厳しいので、いくつか本を用意した。 といってもほとんどは昔買ったものを引っ張り出してきた。

  • コンパイラの構成と最適化

    • 勧められたので買った
    • バックエンドの最適化の内容がきちんと書かれているものはこの本くらいしかないらしい(日本語の本としてはってことだと思う)。
    • Amazon CAPTCHA
  • 言語実装パターン ―コンパイラ技術によるテキスト処理から言語実装まで

  • きつねさんでもわかるLLVM ~コンパイラを自作するためのガイドブック~

    • 狐程度の知能があるか試される。
    • 公式のチュートリアル読むのでも良いけど、概要をさらっと把握するのには良さそう
    • Amazon CAPTCHA
  • LLVM/Clang実践活用ハンドブック

    • 本棚にあった。いつ買ったかすら思い出せない
    • Amazon CAPTCHA

ちょろっと概要を読んだので、それをまとめたら、作業としてはbison, flexを使って簡単な文法をパースする予定

Oreillyの"flex & bison"が良さそうと思っている