LL法とLR法の違いは?調べてみた!-完全版-/Comparing LL and LR parse algorithm -EX Edition-
by
Junichi Kobayashi
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
LL 法と LR 法の違いは? 調べてみた! 完全版 ESM アジャイル事業部 構文解析器研究部員 小林純一 (@junk0612) Fukuoka.rb #333 Ninja Talk 大会 オンライン 2023/11/29(Wed.)
Slide 2
Slide 2 text
Fukuoka.rb 333回目 おめでとう ございます
Slide 3
Slide 3 text
Fukuoka.rb 333回目 おめでとう ございます ● RubyWorld Conference 2023 で行われたスポンサートーク 「ESM スーパーライトニングトークス」の 私が担当した部分の再演・増補改訂版です ● 半分も終わらないうちに時間が来てしまったので 面白いところまでたどり着けませんでした ● この内容を 80 秒で話そうとしたのが良くなかった (反省) ○ いや、終わらないだろうとは思ってたんですけど…… この発表は
Slide 4
Slide 4 text
LL 法と LR 法の違いは? 調べてみた! 完全版 ESM アジャイル事業部 構文解析器研究部員 小林純一 (@junk0612) Fukuoka.rb #333 Ninja Talk 大会 オンライン 2023/11/29(Wed.)
Slide 5
Slide 5 text
● 小林純一 ● X / GitHub: @junk0612 ● 株式会社永和システムマネジメント アジャイル事業部 ○ RubyxAgile グループ ○ 構文解析器研究部員 ● Lrama コントリビューター ○ Named References の実装 ○ 内部パーサーの Racc 化 など 自己紹介
Slide 6
Slide 6 text
No content
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
世はまさに 大パーサー時代
Slide 10
Slide 10 text
LL 法 と LR 法
Slide 11
Slide 11 text
LL法とLR法 LL法 ● トップダウン方式 ● 左端導出 ● 手書きに適している ● 先読みによって構文を推測する ● Prism が採用している LR法 ● ボトムアップ方式 ● 右端導出 ● 手書きには適さない ● 決定論的に構文木を構築する ● Lrama が生成するパーサーが 採用している
Slide 12
Slide 12 text
LL法とLR法 LL法 ● トップダウン方式 ● 左端導出 ● 手書きに適している ● 先読みによって構文を推測する ● Prism が採用している LR法 ● ボトムアップ方式 ● 右端導出 ● 手書きには適さない ● 決定論的に構文木を構築する ● Lrama が生成するパーサーが 採用している
Slide 13
Slide 13 text
例: メソッド定義 method_definition def method_name ( args ) method_body end method_definition def method_name ( args ) = method_body
Slide 14
Slide 14 text
Fukuoka.rb 333回目 おめでとう ございます ● パーサーは自分が今どこを読んでいるかを知っている ● 今読んでいるルールにおいて次に何が来るはずかは 文法ファイルからわかる ● 次のトークンを先読みし、何であったかによって処理を分岐する ○ 分岐の決定に必要なトークンの先読み数が k のとき LL(k) と表記する ● 来るはずのないトークンが来たら文法エラーとする LL 法の基本的な考え方
Slide 15
Slide 15 text
method_definition LL法の場合
Slide 16
Slide 16 text
method_definition def method_name LL法の場合
Slide 17
Slide 17 text
method_definition def method_name 分岐 ● → 引数 ● → end-less メソッド ● → メソッド本体 ( = method_body LL法の場合
Slide 18
Slide 18 text
method_definition def method_name 分岐 ● → 引数 ● → end-less メソッド ● → メソッド本体 ( = method_body ( LL法の場合
Slide 19
Slide 19 text
method_definition def method_name ( args ) LL法の場合
Slide 20
Slide 20 text
method_definition def method_name ( args ) 分岐 ● → end-less メソッド ● → メソッド本体 = method_body LL法の場合
Slide 21
Slide 21 text
method_definition def method_name ( args ) 分岐 ● → end-less メソッド ● → メソッド本体 = method_body = LL法の場合
Slide 22
Slide 22 text
LL法の場合 method_definition def method_name ( args ) = method_body
Slide 23
Slide 23 text
Fukuoka.rb 333回目 おめでとう ございます ● パーサーは自分が何を読んできたかを知っている ● 読んできたトークンがどういう並びになったら 上位のトークンに置換可能かは、文法ファイルからわかる ● トークンを読み進んでいき、置換可能なトークンが一意になったら置換す ることを繰り返す ● 現在の並びで置換可能なトークンがなくなったら文法エラーとする LR 法の基本的な考え方
Slide 24
Slide 24 text
LR法の場合 def
Slide 25
Slide 25 text
LR法の場合 def method_name
Slide 26
Slide 26 text
LR法の場合 def method_name ( args )
Slide 27
Slide 27 text
LR法の場合 def method_name ( args ) = method_body
Slide 28
Slide 28 text
LR法の場合 method_definition def method_name ( args ) = method_body
Slide 29
Slide 29 text
LL法とLR法 LL法 ● トップダウン方式 ● 左端導出 ● 手書きに適している ● 先読みによって構文を推測する ● Prism が採用している LR法 ● ボトムアップ方式 ● 右端導出 ● 手書きには適さない ● 決定論的に構文木を構築する ● Lrama が生成するパーサーが 採用している
Slide 30
Slide 30 text
Let's parse everything your favorite algorithm.