SlideShare une entreprise Scribd logo
1  sur  43
Parsing Left Recursive PEG with C++ www.kstm.org id:eldesh [email_address]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Who am I ?
[object Object],[object Object],[object Object],[object Object],Table of Contents
PEG とは ,[object Object],[object Object],[object Object],[object Object],[object Object]
PEG   literal + unary op ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PEG   sequence ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PEG   predicate ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PEG   priority choice (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PEG   priority choice (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PEG まとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Packrat Parsing で高速化 ,[object Object],[object Object],memo<pair<rule,pos> , optional<semantic_value>>
キャッシュが効きそうな規則の例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Memoization Table column 1 2 3 4 5 6 7 8 Add Mul Prim Dec input 2 * ( 3 + 4 )
Memoization Table column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
Memoization Table semantic value column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
Memoization Table column number column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
Packrat Parser まとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Left Recursion ,[object Object],[object Object],[object Object],[object Object],Expr ← Expr '-' Num / Num Num ← [1-9][0-9]*
マッチの様子? 1 - 3 - 5 Expr Expr Num input Num Num Expr ← Expr '-' Num / Num Num ← [1-9][0-9]*
Infinite Recursion ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Expr ← Expr '-' Num / Num Num ← [1-9][0-9]* Input: '1-3-5'
Detecting Left Recursion ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],同じルールで 同じ入力をパース ループが 検出出来る! Expr ← Expr '-' Num / Num Num ← [1-9][0-9]* Input: '1-3-5'
Packrat Parsing  再び ,[object Object],[object Object],memo<pair<rule,pos> , optional<svalue>> memo<pair<rule,pos> , pair<LR, optional<svalue>>>
Avoiding Infinite Recursion ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Expr ← Expr '-' Num / Num Input: '1-3-5'
Detecting Left Recursion ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Happy End… ? ,[object Object],[object Object],[object Object],[object Object],[object Object],(´ ・ ω ・` ) Expr ← Expr '-' Num / Num Input: '1-3-5'
Making Seed ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Seed Parse
Support Direct Left Recursion ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Growing The Seed! ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
マッチの様子 ( 再び ) 1 - 3 - 5 Expr (Grow1) Num input Num Num(Seed) Expr (Grow2) Expr Expr ← Expr '-' Num / Num (input: '1-3-5')
MemoizationTable の様子 LR ? LR ! Fail 3,2 3,2 seed parse! Expr ← Expr '-' Num / Num Num ← [1-9][0-9]* ; input: '3-4' 4,4 3-4,4 Growing! column 1 2 3 4 Expr Num input 3 - 4
PEG Parser ここまでのまとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
In d irect Left Recursion ,[object Object],[object Object],[object Object],[object Object],X ← Expr Expr ← X '-' Num / Num
Table behavior of parsing Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! キャッシュが見つかってしまう! column 1 2 3 4 X Expr Num input 4 - 3
In d irect Left Recursion ,[object Object],[object Object],[object Object],[object Object],X ← Expr Expr ← X '-' Num / Num
resource ,[object Object],LR ? LR ?
Rule Invocation Stack ,[object Object],[object Object],[object Object],Expr X Head Involved
By pass the MemoTable ,[object Object],[object Object],[object Object],[object Object],[object Object],[email_address] X,{Expr} Head Involved InvolvedSet
Adding Support for Indirect Left Recursion memo<pair<rule,pos> , pair<LR, optional<svalue>>> struct LR { AST seed; Rule rule Head head; LR * next; }; struct Head { Rule rule; RuleSet involvedSet,evalSet; }
Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! [email_address] X,{Expr} 4-3,4 3,4 4-3,4 growing! column 1 2 3 4 X Expr Num input 4 - 3
Support Direct Left Recursion ,[object Object],[object Object],[object Object]
parse_ident(ID, Pos) { Entry * m = MEMO(ID, Pos); if (m==NULL) { MEMO(R, P) = new MEMOENTRY(P, TAG_LR); m->ans = EVAL(R.Body); if (m->lr.detected && ans!=NULL) return GROWLR(R, P, m); else return m; return m; } else { //  エントリが見つかった場合 } }
Packrat Parser can support IndirectL.R. ! ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
References ,[object Object],[object Object],[object Object],[object Object]

Contenu connexe

Tendances

Perl6で遊ぼう
Perl6で遊ぼうPerl6で遊ぼう
Perl6で遊ぼう
VienosNotes
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
 
2011年12月16日
2011年12月16日2011年12月16日
2011年12月16日
nukaemon
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 

Tendances (19)

Perl6で遊ぼう
Perl6で遊ぼうPerl6で遊ぼう
Perl6で遊ぼう
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
C-langage
C-langageC-langage
C-langage
 
2011年12月16日
2011年12月16日2011年12月16日
2011年12月16日
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Functional Pearl + Brainfuck
Functional Pearl + BrainfuckFunctional Pearl + Brainfuck
Functional Pearl + Brainfuck
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Php s4
Php s4Php s4
Php s4
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
rpi_handson_2.5
rpi_handson_2.5rpi_handson_2.5
rpi_handson_2.5
 
Computation Expressions for Haxe
Computation Expressions for HaxeComputation Expressions for Haxe
Computation Expressions for Haxe
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
Pgunconf14 pg13-psql
Pgunconf14 pg13-psqlPgunconf14 pg13-psql
Pgunconf14 pg13-psql
 
Ext.Directについて
Ext.DirectについてExt.Directについて
Ext.Directについて
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 

En vedette

20130530-PEGjs
20130530-PEGjs20130530-PEGjs
20130530-PEGjs
zuqqhi 2
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognition
elliando dias
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
moai kids
 
正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方
webcampusschoo
 

En vedette (15)

拡張性のあるPEGパーサの実装
拡張性のあるPEGパーサの実装拡張性のあるPEGパーサの実装
拡張性のあるPEGパーサの実装
 
Racc でおてがる構文解析
Racc でおてがる構文解析Racc でおてがる構文解析
Racc でおてがる構文解析
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
PEGの回文っぽいExpression
PEGの回文っぽいExpressionPEGの回文っぽいExpression
PEGの回文っぽいExpression
 
新卒で即戦力なエンジニアになる
新卒で即戦力なエンジニアになる新卒で即戦力なエンジニアになる
新卒で即戦力なエンジニアになる
 
L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
 
Java女子部のあゆみ2014
Java女子部のあゆみ2014Java女子部のあゆみ2014
Java女子部のあゆみ2014
 
20130530-PEGjs
20130530-PEGjs20130530-PEGjs
20130530-PEGjs
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognition
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
 
正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方
 
SSH力をつけよう
SSH力をつけようSSH力をつけよう
SSH力をつけよう
 
競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略
 
青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)
 

Similaire à Parsing Left Recursive PEG

Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
Jiro Nishiguchi
 

Similaire à Parsing Left Recursive PEG (15)

ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHP
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
Patterns and Matching in Rust
Patterns and Matching in RustPatterns and Matching in Rust
Patterns and Matching in Rust
 
ソート
ソートソート
ソート
 
「トピックモデルによる統計的潜在意味解析」読書会 4章前半
「トピックモデルによる統計的潜在意味解析」読書会 4章前半「トピックモデルによる統計的潜在意味解析」読書会 4章前半
「トピックモデルによる統計的潜在意味解析」読書会 4章前半
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
Material
MaterialMaterial
Material
 
テストではまったお話 Test::More
テストではまったお話 Test::Moreテストではまったお話 Test::More
テストではまったお話 Test::More
 
PCさえあればいい。
PCさえあればいい。PCさえあればいい。
PCさえあればいい。
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 

Dernier

Dernier (11)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

Parsing Left Recursive PEG

  • 1. Parsing Left Recursive PEG with C++ www.kstm.org id:eldesh [email_address]
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13. Memoization Table column 1 2 3 4 5 6 7 8 Add Mul Prim Dec input 2 * ( 3 + 4 )
  • 14. Memoization Table column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
  • 15. Memoization Table semantic value column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
  • 16. Memoization Table column number column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
  • 17.
  • 18.
  • 19. マッチの様子? 1 - 3 - 5 Expr Expr Num input Num Num Expr ← Expr '-' Num / Num Num ← [1-9][0-9]*
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29. マッチの様子 ( 再び ) 1 - 3 - 5 Expr (Grow1) Num input Num Num(Seed) Expr (Grow2) Expr Expr ← Expr '-' Num / Num (input: '1-3-5')
  • 30. MemoizationTable の様子 LR ? LR ! Fail 3,2 3,2 seed parse! Expr ← Expr '-' Num / Num Num ← [1-9][0-9]* ; input: '3-4' 4,4 3-4,4 Growing! column 1 2 3 4 Expr Num input 3 - 4
  • 31.
  • 32.
  • 33. Table behavior of parsing Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! キャッシュが見つかってしまう! column 1 2 3 4 X Expr Num input 4 - 3
  • 34.
  • 35.
  • 36.
  • 37.
  • 38. Adding Support for Indirect Left Recursion memo<pair<rule,pos> , pair<LR, optional<svalue>>> struct LR { AST seed; Rule rule Head head; LR * next; }; struct Head { Rule rule; RuleSet involvedSet,evalSet; }
  • 39. Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! [email_address] X,{Expr} 4-3,4 3,4 4-3,4 growing! column 1 2 3 4 X Expr Num input 4 - 3
  • 40.
  • 41. parse_ident(ID, Pos) { Entry * m = MEMO(ID, Pos); if (m==NULL) { MEMO(R, P) = new MEMOENTRY(P, TAG_LR); m->ans = EVAL(R.Body); if (m->lr.detected && ans!=NULL) return GROWLR(R, P, m); else return m; return m; } else { // エントリが見つかった場合 } }
  • 42.
  • 43.