Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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.