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
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Search
Kai
February 03, 2026
Programming
0
100
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
Kai
February 03, 2026
Tweet
Share
More Decks by Kai
See All by Kai
AmazonConnectを コンタクトセンターと 呼んでいた頃
aki_pin0
0
9
Rubyが好きな話
aki_pin0
0
20
Other Decks in Programming
See All in Programming
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
120
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
120
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
360
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
190
SourceGeneratorのススメ
htkym
0
430
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
340
CSC307 Lecture 07
javiergs
PRO
1
560
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
CSC307 Lecture 05
javiergs
PRO
0
500
浮動小数の比較について
kishikawakatsumi
0
220
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
200
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
7
1k
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
230
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
650
Embracing the Ebb and Flow
colly
88
5k
Code Review Best Practice
trishagee
74
20k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
68
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
72
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
930
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
450
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
250
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
Kai ふん…おもしれぇ Parser。 RubyKaigi 行ってやるぜ
None
楽しみですね!
いろんなトピックのセッションがある and more…
中でも…
Parserのセッションが多い!
他言語のカンファレンスと比較 カンファレンス 総セッション数 Parser 関連 割合 RubyKaigi 2025 57件 4件
7.01% PyCon US 2025 75件 1件 1.30% GopherCon UK 2025 22件 0件 0% RustConf 2025 23件 0件 0% ※ Claude調べ 間違ってたらごめんなさい
こんな画像も落ちてた
一方で
よくわからない …
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題
利用者間 ⇔ 言語開発者でギャップがあるかも? Parser 言語開発者 利用者
利用者間 ⇔ 言語開発者でギャップがあるかも? Parser 言語開発者 利用者 もったいない!
とはいえ、難しいものは難しい
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない それはそう
• おもしろポイントがまだ見えていない • アプリケーションの実装から離れている • 学術理論に基づく部分はハードルが高いかも Parser に興味持つのむずいかもしれない問題 しゃーない それはそう
見えてほしい!
• 私:私の考える Ruby Parser おもしろポイントを喋る • 皆さん:Parser 関係のセッションに興味が湧く • 技術的な話はほぼしません!
• 厳密に正しくない説明もします! 目的:
おもしろポイント
おもしろポイント 言語の思想に基づく 内部実装の複雑性の解消
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
Ruby の思想:A Programmer's Best Friend https://www.ruby-lang.org/ja/
他言語との比較:実装 → 完成まで 簡単: 複雑: 他言語: SyntaxError RuntimeError RuntimeError SyntaxError
SyntaxError
他言語との比較:実装 → 完成まで 簡単: 複雑: SyntaxError RuntimeError RuntimeError 簡単: 複雑:
他言語: SyntaxError RuntimeError RuntimeError SyntaxError SyntaxError ※ この辺はトレードオフなので、他言語を貶める意図はありません
• 動的な型付け • 自然言語に近い書きやすい文法 • エラーよりも実行可能側に倒す ◦ 許容される文法が多く、SyntaxErrorを起こしづらい ◦ 実行時もエラーを値で返すものが多い
文法における Ruby の思想
自然言語に近く人間に優しい wakate.rb は楽しいイ ベントでした ◎ イベント楽しい wakate.rb サイコー wakate.rb で
したイベントは ◯ ?
自然言語に近く人間に優しい wakate.rb は楽しいイ ベントでした ◎ イベント楽しい wakate.rb サイコー wakate.rb で
したイベントは ◯ ? つまり錬金術の基本は等価交換 !! 何かを得ようとするなら それと同等の対価が必要って事だ — 鋼の錬金術師 エドワード・エルリック
自然な文法の対価 Parser 内部実装の複雑性
その前に:① lexer と parser lexer parser スクリプト トークン列 構文チェック •
lexer:構文チェックの前処理としてスクリプトをトークン列に変換 • parser:トークン列を読んで構文を確認 ◦ OK:以降の処理に移る ◦ NG:SyntaxError ◦ ※ 本当はASTの構築をしていますが今回は省略
その前に:① lexer と parser wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞
名詞 助動詞 句点 楽しいはイベントです wakate.rb。 形容詞 接続詞 名詞 助動詞 名詞 句点 lexer parser スクリプト トークン列 構文チェック
その前に:① lexer と parser 1 + 2 * 3 NUMBER
OPERATOR NUMBER OPERATOR NUMBER 1 +* 2 3 NUMBER OPERATOR OPERATOR NUMBER NUMBER lexer parser スクリプト トークン列 構文チェック
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 tokenize
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 tokenize 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 tokenize 還元 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 tokenize 還元 還元 還元
その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞
助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 [主題句 述語句] 句点 [文] 句点 tokenize 還元 還元 還元 還元
その前に:② parser の構文チェック方法 1 + 2 * 3 NUMBER OPERATOR
NUMBER OPERATOR NUMBER NUMBER OPERATOR [EXPRESSION] [EXPRESSION] NUMBER OPERATOR [NUMBER OPERATOR NUMBER] [NUMBER OPERATOR EXPRESSION] PROGRAM EXPRESSION tokenize 還元 還元 還元
ruby の複雑性 同じ文字列でも tokenize の結果が異なる場合がある
同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞
名詞 I book it. 名詞 動詞 名詞 前の品詞や周囲の文字列によって次の tokenize の結果が異なる
同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞
名詞 I book it. 名詞 動詞 名詞 手前の単語を先に 還元しておかないと、次の単語の品詞を決定できない ➢ lexer の処理 (tokenize) に parser の処理結果が必要になる The people to run book it. [名詞句] 動詞 名詞
同じ文字列でも tokenize の結果が異なる例 前のトークンや周囲の文字列によって次の tokenize の結果が異なる ➢ 前のトークンが確定するのは …? ➢
parser による還元が終わった後 tOR として tokenize それぞれ tokenize
lexer と parser の密結合 他言語: lexer parser スクリプト lexer parser
スクリプト トークン列 構文チェック
• 他にも様々な要素によって tokenize の結果が変わる • Ruby ではそれを 状態 として構造化 lexer
と parser の密結合 lexer parser tokenize 状態の更新 還元 状態の更新 スクリプト
魔境爆誕
• メンテナビリティ • エラー許容性 • 移植性 • パフォーマンス 他にも様々な課題 https://techracho.bpsinc.jp/hachi8833/2023_07_10/131808
➢ これらの課題に立ち向かうため、 2つの Parser() が誕生!
• 手書きの再帰下降 parser • 現在のデフォルト • 高いエラー許容性 • ASTへの豊富なAPIの提供 •
高い移植性 • parser プログラムを生成する ruby ライブラリ (parser ではない) • 保守性を大きく改善 • これまでと異なるアルゴリズムの採用 2つのParser の誕生 Prism Lrama
• 魔境と呼ばれた parse.y に2つの全く異なるアプローチでアタック ◦ 手書きの再帰下降 parser ◦ parser generator
• Prism:過去と全く異なるモダナイゼーション • Lrama:革新的な parser アルゴリズムの実証 魔境の開拓 ➢ CS/構文解析の歴史においても鮮烈な状況がたのしい!
興味出た?まずは過去セッションをチェック! Prism Lrama https://youtu.be/3vzpv9GZdLo?si=_jWMZBGsDNAUYhnP https://youtu.be/CjYLcnlXO2Y?si=TgrMXn-OuFDJ8_qI
他にもチェックチェック • https://yui-knk.hatenablog.com/entry/2023/11/01/082815 • https://yui-knk.hatenablog.com/entry/2023/12/06/082203 • https://gihyo.jp/article/2024/01/ruby3.3-lrama • https://gihyo.jp/article/2024/01/ruby3.3-prism •
https://techracho.bpsinc.jp/hachi8833/2023_07_10/131808
• Ruby は自然言語的に書ける楽しい言語 • 文法を実現するために、Parserの内部実装は複雑化 • 保守性以外にも様々な課題 • それに立ち向かうため、PrismとLramaという異なるアプローチ まとめ