Your SlideShare is downloading. ×
0
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Racc でおてがる構文解析
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Racc でおてがる構文解析

7,338

Published on

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

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

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

No Downloads
Views
Total Views
7,338
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
15
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×