Racc でおてがる構文解析

8,479 views

Published on

Ruby/Rails 勉強会@関西第36回で発表したスライド。構文解析についてと、パーサージェネレーターRaccの基本的な使い方について

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,479
On SlideShare
0
From Embeds
0
Number of Embeds
427
Actions
Shares
0
Downloads
16
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Racc でおてがる構文解析

  1. 1. Racc でおてがる構文解析 まき
  2. 2. 自己紹介 <ul><li>よしおかまき
  3. 3. id:morphine57(もるひねと読みます)
  4. 4. プログラミング歴10年 </li><ul><li>初めてのプログラミングはCOBOLでした </li></ul><li>Ruby歴、気付けば5年 </li><ul><li>でもまだよく分かってない(汗 </li></ul></ul>
  5. 5. 本日の概要 <ul><li>構文解析とは </li><ul><li>コンパイラのしごと
  6. 6. 字句解析
  7. 7. 構文解析 </li></ul><li>Raccって? </li><ul><li>Raccの基本的な使い方
  8. 8. 構文ルール書き方
  9. 9. デモ </li></ul><li>質問 </li></ul>
  10. 10. 構文解析とは <ul><li>文字の羅列であるソースコードを機械が解釈できる形にすること
  11. 11. コンパイラの仕事の一部 </li></ul>
  12. 12. コンパイラのしごと 広義の構文解析   & 今日の範囲 <ul><li>ソースコードをコンピュータやVMが実行できる命令語に変換すること </li></ul>字句解析 構文解析 意味解析 コード生成
  13. 13. 字句解析 <ul><li>ソースコードの文字列をトークンと呼ばれる単位に分割する
  14. 14. トークンは意味値を持つ </li><ul><li>識別子、整数、文字列
  15. 15. 予約語やカッコに意味値はない </li></ul></ul>hoge=(hoge+1)/2 = ( ) + hoge / 2 - - - - 識別子 - 整数 1 整数 ひとつの トークン 下段が意味値 hoge 識別子
  16. 16. 構文解析(狭義)(1) <ul><li>トークン列を解析して抽象構文木に変換する </li></ul>
  17. 17. 構文解析(狭義)(2) 1 + hoge ÷ 2 右式 左式 演算式 演算子 演算子 右式 左式 = ( ) + hoge / 2 - - - - 識別子 - 整数 1 整数 hoge 識別子 演算式 代入式 右式 hoge 終端子 非終端子 (ノード)
  18. 18. ここまでまとめ 字句解析 構文解析 ((huge+1)÷2)×3 ( ( ) 1 + huge ÷ 2 3 × ) 右式 演算式 演算子 左式 代入式 右式 hoge
  19. 19. Racc って? <ul><li>パーサージェネレータ </li><ul><li>構文解析器(パーサー)のジェネレータ </li></ul><li>Racc = Ruby yACC </li><ul><li>Yacc = Yet Another Compiler Compiler </li></ul><li>入手方法 </li><ul><li>gem
  20. 20. RAA
  21. 21. svn </li></ul></ul>
  22. 22. Raccの基本的な使い方(1) <ul><li>拡張子yのファイルを書く </li><ul><li>文法を記述
  23. 23. 「---- header」で require など
  24. 24. 「---- inner」でクラスの中身、字句解析処理など
  25. 25. 「---- footer」で後処理 </li></ul></ul>j_parser.y class JapaneseParser rule end ---- header require 'node' ---- inner def parse ・・・ do_parse end ---- footer ・・・・ 文法 (後ほど解説 )
  26. 26. Raccの基本的な使い方(2) <ul><li>パーサークラス生成 </li><ul><li>$racc -o j_parser.rb j_parser.y
  27. 27. 指定した名前(上記例だとj_parser.rb)のRubyソースファイルができる(中身はmodule_evalの嵐) </li></ul></ul>
  28. 28. Raccの基本的な使い方(3) <ul><li>使う </li><ul><li>使い方一例 </li></ul></ul>require 'j_parser' src = File.read(ARGV[0]) parser = JapaneseParser.new syntax_tree = parser.parse(src) ・・・・
  29. 29. 文法ルール書き方(1) <ul><li>文法の並びは終端子、非終端子、文字列で表現する
  30. 30. アクション </li><ul><li>文法の並びにマッチした時の処理を記述
  31. 31. valにマッチした配列が渡される
  32. 32. resultにセットしたオブジェクトが上位の木からvalで参照できる </li></ul></ul>非終端子 : 文法の並び { アクション } | 上とは別の書き方がある場合同じように記述
  33. 33. 文法ルール書き方(2) (例) program : {result = []} | program stmt { result ||= [] result << val[1]} stmt : assign EOL {result = StmtNode.new(val[0])} assign : IDENT '=' expr {result = AssignNode.new(val[0],val[2])} expr : IDENT {result = VariableNode.new(val[0])} | expr '+' expr {result = ArithmeticNode.new(val[0],val[2])} ・・・・・・
  34. 34. 文法ルール書き方(3) hoge=hoge+1 StmtNode AssignNode hoge ArithmeticNode hoge + 1
  35. 35. まとめ <ul><li>構文解析ができると、ただの文字の羅列もとても扱いやすくなります
  36. 36. おてがるです
  37. 37. 参考書籍 </li><ul><li>ふつうのコンパイラをつくろう
  38. 38. Rubyを256倍使うための本 無道編 </li></ul></ul>
  39. 39. Question? <ul><li>Q:それって正規表現でできるんじゃないの? </li><ul><li>A:とても難しくて面倒です。例えば条件のネスト(AND、OR)etc・・ </li></ul><li>Q:使いどころは? </li><ul><li>A: コンパイラを作りたい時ではなくても、規則性やルールのある文字の集合であれば解析できます
  40. 40. 私はソフトウェアのマイグレーションに使いました </li></ul></ul>

×