僕が構文解析にこんなにも時間をかけてしまった理由...
TRANSCRIPT
僕が構文解析に
こんなにも時間を
かけてしまった理由会津大学 学部三年 / Eyes, JAPAN Co. Ltd.
伊藤勇希 / @publmag1 / acomagu170722 Aizu.golang
自己紹介
- 伊藤勇希
- 福島県伊達市出身
- 会津大学学部3年- Eyes, JAPAN Co. Ltd.
自己紹介
- 好きな言語:- Golang- Fish- 合唱
自己紹介
- 好きなエディタ
- (Neo)Vim
はじめに
Welcome To Aizu!!!!
ところで
gometalinter つかってますか?
gometalinter 最高くないですか?
そんな僕が
Fish にもLinterが欲しくて
孤軍奮闘する切ない物語...
僕が構文解析に
こんなにも時間を
かけてしまった理由
会津大学 学部三年 / Eyes, JAPAN Co. Ltd.伊藤勇希 / @publmag1 / acomagu
170722 Aizu.golang
〜Yacc / Bison におけるノウハウ集〜
時は遡って6/22
Lintツールの作成開始
① 字句解析器と構文解析器の違いがわからない
② %unionが全く理解できない
%union とは
構文解析中にずっと破棄されず使いまわされる
構造体のこと
③ go tool yaccコマンドがない
go tool yacc コマンドはgoyaccパッケージに移動しました!!!
(Since Go 1.8)
④ セミコロンの省略はどうするか?
\n と ; の2つがデリミタとして使える
\n と ; の2つがデリミタとして使える
が
空行はどうする?
;\n+ をEOSに設定
IF は 文? 式?
最終的にこう定義した
- Statement: パイプ可能
- Expression: パイプ不可能
- Statement: パイプ可能
- Expression: パイプ不可能
- > IF_STMT
最終的にこう定義した
構文解析器にスペースを渡すか?
なぜこんな話が出るのか?- スペースを構文解析器に渡すメリット
- クオーテーション内の変数と外の変数を統一
的に字句解析器がパースできる
- aa”bb”cc と aa “bb” cc の区別
しかし
字句解析器が状態を持たなければならなく
なる (e.g. クオーテーション中? 外?)
なぜこんな話が出るのか?
結論
悩んだ末、スペースを渡すことに
しかし...
Yacc(bison)は闇
- 複雑なことをしようとするとすぐにデバッグが困難
になる
- y.output(Yaccが出力するオートマトンの状態遷
移リスト)をコンフリクトする部分から3つ以上遡ら
なければならない状態くらいになるともう無理
- Wikipediaにも「経験上のノウハウ」のリストがあ
る
Yaccに立ち向かうための武器
- bison -v
というわけで...
結論
悩んだ末、スペースを渡すことに
スペースを渡さずに字句解析側で頑張るこ
とに...
しかししかし...
問題
abc (ls) と abc(ls) がどちらも
IDENT ‘(‘ IDENT ‘)’ になってしまう!
つまり
- abc( -> STRS_AND_LEFT_PAREN
- )def -> RIGHT_PAREN_AND_STRS
- )ghi(
-> RIGHT_PAREN_AND_STRS_AND_LEFT_PAREN
ここで彼の言葉は終わっている...
まとめ
- Yaccは闇
- 字句解析器と構文解析器でうまーくラインを引くノウハウが
必要
- デバッグの方法を知っておく
- ドキュメントが極端に少ないが、公式に目を通せば仕組み
は理解できる
- 静的解析は書き始める前にきっちり役割分担と要素を決める
べき
まとめ
- go/ast、go/parser、go/tokenは読むべき
- mattnさんのstreeemの実装も無茶苦茶参考にな
る
- tenntennさんのgoyacc入門も穴が開くほど読ん
だ
Lintはすぐ! 完成させます!
Thanks!!!