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
LL法とLR法の違いは?調べてみた!-完全版-/Comparing LL and LR par...
Search
Junichi Kobayashi
November 29, 2023
Programming
2.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LL法とLR法の違いは?調べてみた!-完全版-/Comparing LL and LR parse algorithm -EX Edition-
Junichi Kobayashi
November 29, 2023
More Decks by Junichi Kobayashi
See All by Junichi Kobayashi
rage against annotate_predecessor
junk0612
0
260
The Implementations of Advanced LR Parser Algorithm
junk0612
3
2.8k
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
6
2.9k
LR で JSON パーサーを作る / Coding LR JSON Parser
junk0612
2
2k
「ナントカLR」を整理する / Clarifying LR Algorithms
junk0612
1
710
From LALR to IELR: A Lrama's Next Step
junk0612
2
5.1k
RubyConf Taiwan / Understanding Parser Generators surrounding Ruby with Contributing Lrama
junk0612
2
7.2k
ESM Super LT/Comparing LL and LR parse algorithm
junk0612
1
230
Lrama へのコントリビューションを通して学ぶ Ruby のパーサジェネレータ事情
junk0612
4
7.4k
Other Decks in Programming
See All in Programming
FDEが実現するAI駆動経営の現在地
gonta
2
260
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.9k
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.3k
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
Android CLI
fornewid
0
210
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
300
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
ラッコキーワード サービス紹介資料
rakko
1
4.2M
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Making Projects Easy
brettharned
120
6.7k
Automating Front-end Workflow
addyosmani
1370
210k
Statistics for Hackers
jakevdp
799
230k
Transcript
LL 法と LR 法の違いは? 調べてみた! 完全版 ESM アジャイル事業部 構文解析器研究部員 小林純一
(@junk0612) Fukuoka.rb #333 Ninja Talk 大会 オンライン 2023/11/29(Wed.)
Fukuoka.rb 333回目 おめでとう ございます
Fukuoka.rb 333回目 おめでとう ございます • RubyWorld Conference 2023 で行われたスポンサートーク 「ESM
スーパーライトニングトークス」の 私が担当した部分の再演・増補改訂版です • 半分も終わらないうちに時間が来てしまったので 面白いところまでたどり着けませんでした • この内容を 80 秒で話そうとしたのが良くなかった (反省) ◦ いや、終わらないだろうとは思ってたんですけど…… この発表は
LL 法と LR 法の違いは? 調べてみた! 完全版 ESM アジャイル事業部 構文解析器研究部員 小林純一
(@junk0612) Fukuoka.rb #333 Ninja Talk 大会 オンライン 2023/11/29(Wed.)
• 小林純一 • X / GitHub: @junk0612 • 株式会社永和システムマネジメント アジャイル事業部
◦ RubyxAgile グループ ◦ 構文解析器研究部員 • Lrama コントリビューター ◦ Named References の実装 ◦ 内部パーサーの Racc 化 など 自己紹介
None
None
None
世はまさに 大パーサー時代
LL 法 と LR 法
LL法とLR法 LL法 • トップダウン方式 • 左端導出 • 手書きに適している • 先読みによって構文を推測する
• Prism が採用している LR法 • ボトムアップ方式 • 右端導出 • 手書きには適さない • 決定論的に構文木を構築する • Lrama が生成するパーサーが 採用している
LL法とLR法 LL法 • トップダウン方式 • 左端導出 • 手書きに適している • 先読みによって構文を推測する
• Prism が採用している LR法 • ボトムアップ方式 • 右端導出 • 手書きには適さない • 決定論的に構文木を構築する • Lrama が生成するパーサーが 採用している
例: メソッド定義 method_definition def method_name ( args ) method_body end
method_definition def method_name ( args ) = method_body
Fukuoka.rb 333回目 おめでとう ございます • パーサーは自分が今どこを読んでいるかを知っている • 今読んでいるルールにおいて次に何が来るはずかは 文法ファイルからわかる •
次のトークンを先読みし、何であったかによって処理を分岐する ◦ 分岐の決定に必要なトークンの先読み数が k のとき LL(k) と表記する • 来るはずのないトークンが来たら文法エラーとする LL 法の基本的な考え方
method_definition LL法の場合
method_definition def method_name LL法の場合
method_definition def method_name 分岐 • → 引数 • → end-less
メソッド • → メソッド本体 ( = method_body LL法の場合
method_definition def method_name 分岐 • → 引数 • → end-less
メソッド • → メソッド本体 ( = method_body ( LL法の場合
method_definition def method_name ( args ) LL法の場合
method_definition def method_name ( args ) 分岐 • → end-less
メソッド • → メソッド本体 = method_body LL法の場合
method_definition def method_name ( args ) 分岐 • → end-less
メソッド • → メソッド本体 = method_body = LL法の場合
LL法の場合 method_definition def method_name ( args ) = method_body
Fukuoka.rb 333回目 おめでとう ございます • パーサーは自分が何を読んできたかを知っている • 読んできたトークンがどういう並びになったら 上位のトークンに置換可能かは、文法ファイルからわかる •
トークンを読み進んでいき、置換可能なトークンが一意になったら置換す ることを繰り返す • 現在の並びで置換可能なトークンがなくなったら文法エラーとする LR 法の基本的な考え方
LR法の場合 def
LR法の場合 def method_name
LR法の場合 def method_name ( args )
LR法の場合 def method_name ( args ) = method_body
LR法の場合 method_definition def method_name ( args ) = method_body
LL法とLR法 LL法 • トップダウン方式 • 左端導出 • 手書きに適している • 先読みによって構文を推測する
• Prism が採用している LR法 • ボトムアップ方式 • 右端導出 • 手書きには適さない • 決定論的に構文木を構築する • Lrama が生成するパーサーが 採用している
Let's parse everything your favorite algorithm.