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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Racc でおてがる構文解析

7,177
views

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,177
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
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. 私はソフトウェアのマイグレーションに使いました