Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
僕が構文解析に
こんなにも時間を
かけてしまった理由
会津大学 学部三年 / Eyes, JAPAN Co. Ltd.
伊藤勇希 / @publmag1 / acomagu
170722 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つ以上遡ら
なければならない状態くらいになるともう無理
...
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!!!
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
僕が構文解析にこんなにも時間をかけてしまった理由 〜Yacc/Bisonにおけるノウハウ〜
Upcoming SlideShare
Loading in …5
×

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

497 views

Published on

170722 Aizu.golang with tenntenn
Yaccをつかっていていくつか躓いたところをまとめました。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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

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

×