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.