Your SlideShare is downloading. ×

Parser

621
views

Published on


0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
621
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
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. Parser Generator Parser Combinator
  • 2.  灘高パソコン研究部(NPCA)部員 akouryy.net  69回生(中学3年)  Webサイト管理のプロジェクトリー ダー  npca.jp  その他色々(省略) Introduction
  • 3.  プログラミング言語などの構文を 解析するプログラム  決められた文法に沿ってテキスト を分解→組み立てる  今回扱うのはPackrat式パーサ Parser?
  • 4. パーサジェネレータ  パーサを生成するプログラム  手でパーサを書くよりも格段に楽 パーサコンビネータ  パーサジェネレータの言語内DSL What’s Parser Combinator?
  • 5.  パーサの種類の1つ  メモ化された(キャッシュを用い た)再帰下降構文解析  再帰下降式…LL法の一種  LL法…トップダウンの構文解析  文法はPEGで定義 What’s Packrat Parser?
  • 6. What’s PEG? 並び a b aを読み込み、次にbを読み 込む 選択 a/b aまたはbを読み込む 0個以上 a* aを0回以上読み込む 1個以上 a+ aを1回以上読み込む 省略可能 a? aを読み込めるなら読み込 む
  • 7. AND述語 &a aを読み込めるなら成功 読み込めないなら失敗 NOT述語 !a aを読み込めるなら失敗 読み込めないなら成功 文字列を 消費しない What’s PEG?
  • 8.  RubyのPackrat式パーサコンビネー タ  約320行  試しに小さい言語を作ってみたら パーサ部分で61行だった  パーサジェネレータ 約230行  パーサコンビネータ 約90行 “Rackrat” 自作
  • 9.  RubyのPackrat式パーサコンビネー タ  約320行  試しに小さい言語を作ってみたら パーサ部分で61行だった  パーサジェネレータ 約230行  パーサコンビネータ 約90行 自作 “Rackrat”
  • 10. マッチの結果  Results::Result  Results::Matched < Result  Results::Failed < Result Results
  • 11. 成功時  マッチした値(文字列)  マッチの終了部分の添字  正規表現のマッチの結果(あれば) ed
  • 12. 失敗時  期待した値(文字列)  発見した値  成功したところまでが最長のマッ チの終了部分の添字 d
  • 13. 処理の流れ  パーサ定義  解析  アクション実行 Flow
  • 14. パーサ定義 Definition 並び a b JoinParser.new a, b 選択 a/b OrParser.new a, b 0個以上 a* RepeatParser.new a 1個以上 a+ 省略可能 a? OptionParser.new a AND述語 &a Unconsume.new a NOT述語 !a UnconsumeNot.new a 後述
  • 15. 解析 記号説明  マッチ成功  マッチ失敗  解析位置  最長マッチ位置(失敗時) Analysis
  • 16. Sequence 並び 成功 成功 成功 成功
  • 17. Sequence 並び 成功 失敗 ? 失敗 確実に失敗するので 読み込まない
  • 18. Sequence 並び 成功 成功 失敗 失敗
  • 19. Ordered Choice 選択 失敗 失敗 成功 成功
  • 20. Ordered Choice 選択 失敗 成功 ? 成功 確実に成功するので 読み込まない
  • 21. Ordered Choice 選択 失敗 失敗 失敗 失敗 「最長のマッチ」が 選ばれる
  • 22. Zero Or More 0回以上 成功 成功 失敗 成功
  • 23. Zero Or More 0回以上 失敗 成功 「空文字列」にマッチ
  • 24. Optional 省略可能 成功 成功
  • 25. Optional 省略可能 失敗 成功 「空文字列」にマッチ
  • 26. And Predicate AND述語 成功 成功 位置は進まない
  • 27. And Predicate AND述語 失敗 失敗
  • 28. Not Predicate NOT述語 失敗 成功
  • 29. Not Predicate NOT述語 成功 失敗 ?
  • 30. Running Action アクション実行  成功したもののみ  途中で成功しても、最後で失敗し たら実行されない
  • 31. Example 並び 実行されない 実行されない 実行されない
  • 32.  RubyのPackrat式パーサコンビネー タ  約320行  試しに小さい言語を作ってみたら パーサ部分で61行だった  パーサジェネレータ 約230行  パーサコンビネータ 約90行 “Rackrat” 自作
  • 33.  SimpleParserクラスを継承  rule :name, parser do |vals, match | action end 他のルールの参照は直接名前で アクション登録 … parser << action Definition (あれば)
  • 34. パーサ定義(コンビネータ) Definition 並び a b [a,b] 選択 a/b a|b 0個以上 a* rep(a) 1個以上 a+ [a,rep(a)]<<->x{[x[0], *x[1]]} 省略可能 a? opt(a) AND述語 &a and_(a) アクション
  • 35. 補足 Parser Generator Parser Combinator
  • 36. akouryy.net/?os c  (製作中)  このスライド、Rackratも上記にあり ます  連絡先も上記から辿ってください Contact
  • 37.  1回以上の繰り返しの実装  repsepの実装  インタラクティブモード、 GUI表示の実装  Packrat式の勉強  パース失敗時のエラー表示の是正  もっとまともな言語の実装 Future
  • 38. Source Code -実際のソースコード -
  • 39. Demonstration -実演-
  • 40. - END - akouryy.net/?osc Parser Generator Parser Combinator