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

Parser

813

Published on

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

No Downloads
Views
Total Views
813
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Parser

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

    Clipping is a handy way to collect important slides you want to go back to later.

×