狠狠撸

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

More Related Content

僕が構文解析にこんなにも時間をかけてしまった理由 ?Yacc/Bisonにおけるノウハウ?