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 parse algorithm -EX Edition-
Search
Junichi Kobayashi
November 29, 2023
Programming
0
190
LL法とLR法の違いは?調べてみた!-完全版-/Comparing LL and LR parse algorithm -EX Edition-
Junichi Kobayashi
November 29, 2023
Tweet
Share
More Decks by Junichi Kobayashi
See All by Junichi Kobayashi
RubyConf Taiwan / Understanding Parser Generators surrounding Ruby with Contributing Lrama
junk0612
1
3.3k
ESM Super LT/Comparing LL and LR parse algorithm
junk0612
1
64
Lrama へのコントリビューションを通して学ぶ Ruby のパーサジェネレータ事情
junk0612
4
3.2k
ソフトウェア開発とコミュニケーション / Communication in Software Development
junk0612
0
1.1k
アジャイルという「マインドセット」 / Mindset named Agile
junk0612
0
830
Rails × パターン / Rails meets Patterns
junk0612
3
2.4k
「アジャイル開発」でハッピーになろう
junk0612
0
130
ESMに入ってよかったと思う5つの理由 / 5 Good Reasons To Join ESM
junk0612
0
250
Railsを仕事にする会社で新卒が1年間学んだこと
junk0612
6
2.1k
Other Decks in Programming
See All in Programming
Komplexe Oberflächen mit SVG und der Web Animation API
joergneumann
0
690
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
12
4.3k
PHPコードの実行モデルを理解する / Understanding-the-PHP-Execution-Model
shin1x1
0
780
最近コードレビューで指摘したこと
forrep
3
100
ソースコードを美しくたもつために ~コードレビューの認知限界を突破し、年間400リリースを達成する~
kotauchisunsun
1
140
Timeline エディター拡張入門
yucchiy
0
430
dbtのドメイン分割による データ基盤の改善とDigdagとの連携
sakama
0
500
TypeScript 関数型スタイルでバックエンド開発のリアル
naoya
49
15k
WebGLで始める コンピュータグラフィックス入門
heller77
0
370
Native Federation: The Future of Micro Frontends in Angular
manfredsteyer
PRO
0
160
Amazon Aurora Serverless v2が意外と高かった話と、AWS Database Migration Serviceの話
satoshi256kbyte
1
100
Criando a Woovi em uma semana
daniloab
0
120
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
176
21k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
242
1.2M
BBQ
matthewcrist
80
8.8k
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
Web Components: a chance to create the future
zenorocha
306
41k
Optimising Largest Contentful Paint
csswizardry
13
2.4k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
34
6.1k
Writing Fast Ruby
sferik
622
60k
A designer walks into a library…
pauljervisheath
201
23k
Adopting Sorbet at Scale
ufuk
69
8.6k
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.