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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Junichi Kobayashi
November 29, 2023
Programming
2.5k
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
XP をバイブルにする事業部で10年働いた新卒が語りたい『Tidy First?』/ Put your understanding into the code
junk0612
0
50
rage against annotate_predecessor
junk0612
0
270
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
730
From LALR to IELR: A Lrama's Next Step
junk0612
2
5.3k
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
240
Other Decks in Programming
See All in Programming
XHTMLが残したもの
yosuke_furukawa
PRO
1
350
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
110
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
260
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
220
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.4k
AIの中の人になってみる
htkym
0
150
業務時間外もAIに働いてもらう話
colorful12
3
9.8k
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
52
33k
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
120
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
320
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
260
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.5k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Speed Design
sergeychernyshev
33
2.1k
Navigating Team Friction
lara
192
16k
Unsuck your backbone
ammeep
672
58k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
460
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
480
How to train your dragon (web standard)
notwaldorf
97
6.8k
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.