PEGの回文っぽいExpression
@chiguri
このスライドはなんのため?
 一時期(ごくごく一部で)話題になったPEG
(Parsing Expression Grammar)による回文っ
ぽいものがどういう言語を受理するか、を考える
ための資料
 PEGの動きを理解するのに使えるかもしれない。
使えないかもしれない。
 http://togetter.com/li/899899 で私とkmizuさ
んがいろいろ考えているやつ
背景
 aとbからなる回文をCFG(BNF)で書くと以下の
ようになる。
 S ::= “a” S “a” | “b” S “b” | “”
 偶数長の回文だけだが、簡単に拡張できるので無視
 PEGのParsing Expressionで似た式を書くと以下
のようになる。
 S ::= “a” S “a” / “b” S “b” / “”
 |が/になっている。
このPEは受理しない回文がある
 この式は、“aa”、“abba”、“abbbaabbba”を受理
する。
 それぞれ“a”、“ab”、“abbba”を折り返した回文。
 しかし、“abbaabba”を受理しない。
 これは“abba”を折り返した回文。
 なぜ?
注意
 私はPackrat Parsing(PEGを有用に、有名にした
構文解析手法)を知らない。
 メモ化や遅延評価を使うことで入力長のオーダーで構
文解析できる手法である、くらいまで
 したがって、これ以降Packrat Parsingの話はしな
いし、できない。
 個人的な感想だが、多くの場合、高速化手法は人間の
解釈に向かない。
Recursive Descent Parsing
 元々のPEGの特徴付けに用いられていたもの。
 解釈方法が若干特殊なため、CFGの考え方を引き
ずるとこんがらがるが、動きはシンプル。
 大きく違う点は、|ではなく/を使う部分、特にこ
れが絡んだ再帰的な場合の動き。
 他にも先読みなどがあるのだが、割と直感的なのでこ
こでは無視することにする。
表現のしかた
 以降では、与えられた文字列を
「読んだが規則が成功するか決まっていない部分」
「読んだ結果規則が成功した部分」
「まだ読んでいない部分」
の三つに分ける。
 それぞれ赤、青、黒で表す。
必ずこの順序で現れるが、可視性のため矢印でも
区切り箇所を表す。
 下からの矢印が最初の、上からの矢印が次の区切り。
“aaaaaaaaaaaaaaaaaaaaa”
回文っぽいものを例に
 S ::= “a” S “a” / “b” S “b” / “”
 対象は”abba”、全体はS !.とする(S以外は何も含
まない)
“abba”
一文字目
 S ::= “a” S “a” / “b” S “b” / “”
 まずaを読み、Sの最初の規則を試す。
 “a”にマッチするのでS “a”がスタックに積まれ、次へ。
“abba”
二文字目
 S ::= “a” S “a” / “b” S “b” / “”
 次の文字bを読み、Sの最初の規則を試す。
 “a”にマッチしないので失敗する
“abba”
二文字目
 S ::= “a” S “a” / “b” S “b” / “”
 次の規則を試す。
 “b”にマッチするのでS “b”がスタックに積まれ、次へ。
“abba”
三文字目
 S ::= “a” S “a” / “b” S “b” / “”
 次の文字bを読み、Sの最初の規則を試す。
 失敗する。
“abba”
三文字目
 S ::= “a” S “a” / “b” S “b” / “”
 次の規則を試す。
 S “b”がスタックに積まれ、次へ。
“abba”
四文字目
 S ::= “a” S “a” / “b” S “b” / “”
 次の文字aを読み、Sの最初の規則を試す。
 S “a”がスタックに積まれ、次へ。
“abba”
終端
 S ::= “a” S “a” / “b” S “b” / “”
 次の文字はないが、Sの最初の規則を試す。
 aがないので失敗。
“abba”
終端
 S ::= “a” S “a” / “b” S “b” / “”
 次の規則を試す。
 bがないので失敗。
“abba”
終端
 S ::= “a” S “a” / “b” S “b” / “”
 次の規則を試す。
 何も読まないので成功。
“abba”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 Sの次にaがないので失敗。状態を規則を試す前に戻す。
“abba”
失敗から次の試行へ
 S ::= “a” S “a” / “b” S “b” / “”
 成功していた規則をやめて次の規則へ移る。
 次はbではないので失敗。
“abba”
最後の規則へ
 S ::= “a” S “a” / “b” S “b” / “”
 次の規則へ移る。
 何も読まなくて良いので成功。
“abba”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 Sの次にbがないので失敗。状態を規則を試す前に戻す。
“abba”
失敗から次の試行へ
 S ::= “a” S “a” / “b” S “b” / “”
 成功していた規則をやめて次の規則へ移る。
 何も読まなくて良いので成功。
“abba”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 次がbなので成功。規則全体が完成。bbは読み終え。
“abba”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 次がaなので成功。規則全体が完成。
“abba”
終了
 S ::= “a” S “a” / “b” S “b” / “”
 スタックが空なので、解析全体が成功。
“abba”
成功時→失敗時
 成功する場合の挙動はCFGとほぼ同じだが、失敗
時の巻き戻し方が少し違う。
 規則が失敗した場合、青になった部分(一度決定した
部分)について他の規則を試さずに赤の部分ごと戻す。
失敗する例
 S ::= “a” S “a” / “b” S “b” / “”
 対象は”aaaa”、全体はS !.とする
 以下、二つ目の規則は絶対に失敗するので無視する。
“aaaa”
一文字目
 S ::= “a” S “a” / “b” S “b” / “”
 まずaを読み、Sの最初の規則を試す。
 “a”にマッチするのでS “a”がスタックに積まれ、次へ。
“aaaa”
二文字目
 S ::= “a” S “a” / “b” S “b” / “”
 aを読み、Sの最初の規則を試す。
 “a”にマッチするのでS “a”がスタックに積まれ、次へ。
“aaaa”
三文字目
 S ::= “a” S “a” / “b” S “b” / “”
 aを読み、Sの最初の規則を試す。
 “a”にマッチするのでS “a”がスタックに積まれ、次へ。
“aaaa”
四文字目
 S ::= “a” S “a” / “b” S “b” / “”
 aを読み、Sの最初の規則を試す。
 “a”にマッチするのでS “a”がスタックに積まれ、次へ。
“aaaa”
終端
 S ::= “a” S “a” / “b” S “b” / “”
 文字がないので、最後の規則のみマッチする。
“aaaa”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 Sの次にaがないので失敗。状態を規則を試す前に戻す。
“aaaa”
失敗から次の試行へ
 S ::= “a” S “a” / “b” S “b” / “”
 成功していた規則をやめて次の規則へ移る。
 何も読まなくて良いので成功。
“aaaa”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 次がaなので成功。規則全体が完成、読み終えへ。
“aaaa”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 次がないので失敗。この規則を試す前の状態へ戻す。
 二文字目を読む前
“aaaa”
失敗から次の試行へ
 S ::= “a” S “a” / “b” S “b” / “”
 成功していた規則をやめて次の規則へ移る。
 何も読まなくて良いので成功。
“aaaa”
スタックを一つ戻す
 S ::= “a” S “a” / “b” S “b” / “”
 スタックを戻して、成功していた規則を続ける。
 次がaなので成功。規則全体が完成、読み終えへ。
“aaaa”
S全体の終了、失敗
 S ::= “a” S “a” / “b” S “b” / “”
 全体を読み終えたが、末尾に文字があるので失敗。
 これはマッチしない。
“aaaa”
本来成功するには
 S ::= “a” S “a” / “b” S “b” / “”
 以下の状態で、最後の規則を試す必要がある。
 「折り返し地点まで繰り返し規則で読むこと」
“aaaa”
失敗例では
 S ::= “a” S “a” / “b” S “b” / “”
 折り返し地点を飛ばした状態へ巻き戻される。
 「折り返し地点にはもう到達できない」
“aaaa” “aaaa”
 「成功した部分が他の規則を使えた場合に」
「他の規則を試行しないため」真ん中を折り返し
とみなす規則が適用されなかった。
 “abbaabba”の場合も、後ろの”abba”が成功して
しまうせいで全体がうまくいかなくなる。
 下の赤部分の最後、aが読まれた規則に失敗して戻る。
“abbaabba”
 部分的に回文があると、そこにマッチして折り返
し地点ごと規則が巻き戻される場合がある。これ
が原因で失敗している。
 PEGで
S ::= “a” S “a” / “”
が2^n-2の長さしか読めないのも失敗の巻き戻しが
まとめて行われるため。
結局元のPEは何を受理するか
 「後ろから順に、言語に含まれる文字列を見つけ
ては排除して、その中に折り返し地点が含まれた
ら拒否されるがそれ以外の回文は受理する」とい
うよく分からない言語。
 面倒な例を挙げれば“aabbaabbaa”は受理されないが、
“aabbaaaaaabbaa”は受理される。
 下線部は回文でしかも折り返し地点を含むが、青い部分がよ
り後ろにあり優先されるためその部分の回文は受理されない。
 青の失敗時に折り返し地点の直後まで戻される。
 嗚呼面倒臭・・・だれか定式化してください。
おまけ:HOPEG
 kmizuさんが考えている、パラメータ付きの非終
端記号(rule constructor)を導入したPEG
 REP(s) ::= s REP(s) / “” のような式が書ける。
 REP(“a”)で“a”*のような動きをする。
 処理系はここに https://github.com/kmizu/hopeg
 HO(Higher Order)といっているがパラメータ
はParsing expressionのみ想定。
 kmizuさんは元々Parametricと言っていたが、私が横
から「HOっぽい」と言ったためこの名前に。
HOPEGのパラメータ
 パラメータには任意のParsing Expressionを渡し
て良いので、こんなものも書ける。
 S(r) ::= ... S(“a” r) ...
 再帰呼び出しの度にrの先頭で”a”のチェックが増える。
 ある種の「残りをスタックに積む」ようなことが可能に。
HOPEGによる回文
 HOPEGで回文を受理する式は以下のように書ける。
 PAL(s) ::= “a” PAL(“a” s) / “b” PAL(“b” s) / r
 PEGで失敗していたのと違い、「最初に全てのrで
成功した一番後ろ」が取られる。
 折り返し地点より後ろでは(文字数が足りないため)
必ず失敗する。
 中央で必ず成功する。
 「折り返し全体が成功するまで部分的な成功がない」
ことでPEGで起こった問題を回避している。

More Related Content

PDF
Plantilla ensamble-5
PDF
何となく勉強した気分になれるパーサ入門
PDF
Summerseminar2019
PDF
Linear logic (and Linear Lisp)
PDF
fibsを読む
PDF
ProofSummit2014 : VSTでCの検証
PDF
Nagoya Matsuri 2013 ぐだぐだAgda
PDF
ProofSummit2013 べらべらAbella
Plantilla ensamble-5
何となく勉強した気分になれるパーサ入門
Summerseminar2019
Linear logic (and Linear Lisp)
fibsを読む
ProofSummit2014 : VSTでCの検証
Nagoya Matsuri 2013 ぐだぐだAgda
ProofSummit2013 べらべらAbella

Recently uploaded (17)

PDF
9_前田音葉さん:「Yakushima Islandってなんか変じゃない?」.pdf
PDF
10_「孤独は敵なのか?」 桜花学園高等学校堀川愛可さんinspirehigh.pdf
PDF
5_「AIと仲良くなるには?」日本大学東北高等学校南梨夢乃さんinspirehigh.pdf
PDF
7_「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」明治大学付属中野八王子中学校宮本ゆりかさん.pdf
PDF
13_「他者と自分、対立を防ぐには?」市原中央高等学校 大野リリinspirehigh.pdf
PDF
外国人が日本のテーブルマナーに驚く理由は?_公文国際学園高等部 角田 恵梨佳さん
PDF
8_「世の中の流行はどのようにして生まれるのか」学校法人聖ドミニコ学園竹野はるいpptx.pdf
PDF
共同売店から考える沖縄の新しい流通のしくみ2025琉球大学流通原論講義資料.pdf
PDF
My Inspire High Award 2024(岡田秀幸).pptx.pdf
PDF
14_「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」公文国際学園高等部古澤琴子.pdf
PPTX
PPT KANJI IRODORI SHOKYUU 1 BAB 9 (FURIGANA)
PDF
「なぜ、好きなことにいつかは飽きるの?」大塚莉子 - My Inspire High Award 2024.pdf
PDF
3_「本当の『悪者』って何?」鷗友学園女子中学校_福島 雪乃さんinspirehigh.pdf
PDF
6_「老いることは不幸なこと?」植草学園大学附属高等学校森 珠貴さんinspirehigh.pdf
PDF
11_「なぜ議会への関心が低いのか?」長野県長野西高等学校 片桐 菜々美さん.pdf
PDF
12_「家族とは何か」星の杜中学校小倉ももこ『家族ってなに』inspirehigh.pdf
PDF
12_星の杜中学校小倉ももこ『家族ってなに』inspirehigh発表物.pdf
9_前田音葉さん:「Yakushima Islandってなんか変じゃない?」.pdf
10_「孤独は敵なのか?」 桜花学園高等学校堀川愛可さんinspirehigh.pdf
5_「AIと仲良くなるには?」日本大学東北高等学校南梨夢乃さんinspirehigh.pdf
7_「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」明治大学付属中野八王子中学校宮本ゆりかさん.pdf
13_「他者と自分、対立を防ぐには?」市原中央高等学校 大野リリinspirehigh.pdf
外国人が日本のテーブルマナーに驚く理由は?_公文国際学園高等部 角田 恵梨佳さん
8_「世の中の流行はどのようにして生まれるのか」学校法人聖ドミニコ学園竹野はるいpptx.pdf
共同売店から考える沖縄の新しい流通のしくみ2025琉球大学流通原論講義資料.pdf
My Inspire High Award 2024(岡田秀幸).pptx.pdf
14_「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」公文国際学園高等部古澤琴子.pdf
PPT KANJI IRODORI SHOKYUU 1 BAB 9 (FURIGANA)
「なぜ、好きなことにいつかは飽きるの?」大塚莉子 - My Inspire High Award 2024.pdf
3_「本当の『悪者』って何?」鷗友学園女子中学校_福島 雪乃さんinspirehigh.pdf
6_「老いることは不幸なこと?」植草学園大学附属高等学校森 珠貴さんinspirehigh.pdf
11_「なぜ議会への関心が低いのか?」長野県長野西高等学校 片桐 菜々美さん.pdf
12_「家族とは何か」星の杜中学校小倉ももこ『家族ってなに』inspirehigh.pdf
12_星の杜中学校小倉ももこ『家族ってなに』inspirehigh発表物.pdf
Ad
Ad

PEGの回文っぽいExpression