Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
“A ::= aAa / a” in PEG
Search
Masaki Hara
June 09, 2013
Programming
0
210
“A ::= aAa / a” in PEG
さっき考えてたことのメモ
Masaki Hara
June 09, 2013
Tweet
Share
More Decks by Masaki Hara
See All by Masaki Hara
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
Dockerfileの考え方
qnighy
45
17k
Arm移行タイムアタック
qnighy
1
520
Quine, Polyglot, 良いコード
qnighy
5
740
Prolog入門
qnighy
5
1.5k
Rubyのobject_id
qnighy
6
1.6k
Getting along with YAML comments with Psych
qnighy
2
2.3k
状態設計から「なんとなく」を無くそう
qnighy
85
28k
日付時刻A to Z
qnighy
1
640
Other Decks in Programming
See All in Programming
Immutable ActiveRecord
megane42
0
140
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
270
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
170
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
技術を根付かせる / How to make technology take root
kubode
1
250
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
5
390
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
770
もう僕は OpenAPI を書きたくない
sgash708
5
1.8k
負債になりにくいCSSをデザイナとつくるには?
fsubal
10
2.5k
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
120
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
Featured
See All Featured
A better future with KSS
kneath
238
17k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Docker and Python
trallard
44
3.3k
Into the Great Unknown - MozCon
thekraken
35
1.6k
The Invisible Side of Design
smashingmag
299
50k
Typedesign – Prime Four
hannesfritz
40
2.5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
A Philosophy of Restraint
colly
203
16k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Transcript
“A ::= aAa / a” in PEG Masaki Hara さっき考えてたことのメモ
PEG • 手前から順番に試す • 文字列の一部分と一致したらそこで停止
PEG • 手前から順番に試す • 文字列の一部分と一致したらそこで停止 • 病的な例が知られている
PEGの病的な例 • “a := aAa / a” というルールを考える
PEGの病的な例 • “a := aAa / a” というルールを考える – 直感的にはaが奇数個並んだ文字列にマッチ
PEGの病的な例 • “a := aAa / a” というルールを考える – 直感的にはaが奇数個並んだ文字列にマッチ
– 実際はaが(2^n-1)個並んだ文字列にマッチ
PEGの病的な例の解析 • ここでは、文字列の後ろ側から順番に解析し てみる – 実際は手前から再帰的に試す
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a × aAaを試そうと するが失敗
a a a a a a a A ::= aAa
| a ◦ aを試す →成功
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a ×
a a a a a a a A ::= aAa
| a ◦ aにマッチ
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a ◦ aAaにマッチ
a a a a a a a A ::= aAa
| a aAaにマッチしてしまった のでaにはマッチしない
a a a a a a a A ::= aAa
| a A=aaaと決まっているので aaaaaにマッチしようとする →失敗
a a a a a a a A ::= aAa
| a ×
a a a a a a a A ::= aAa
| a ◦
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a ◦
a a a a a a a A ::= aAa
| a aaaにマッチ →全体にマッチしない (∴5文字は×)
a a a a a a a A ::= aAa
| a
a a a a a a a A ::= aAa
| a 7文字は◦
a a a a a a a A ::= aAa
| a 0 1 2 3 4 5 6 7
位置 マッチ先 1 0 2 1 3 0 4 3
5 2 6 1 7 0
位置 マッチ先 1 0 2 1 3 0 4 3
5 2 6 1 7 0 aAaにマッチする時 →数字が1減る
位置 マッチ先 1 0 2 1 3 0 4 3
5 2 6 1 7 0 aにマッチする時 →直後を参照
結論 • (2^n-1)個のaにマッチすることがわかった