Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for Kai Kai
February 03, 2026

ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ

Avatar for Kai

Kai

February 03, 2026
Tweet

More Decks by Kai

Other Decks in Programming

Transcript

  1. 他言語のカンファレンスと比較 カンファレンス 総セッション数 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調べ 間違ってたらごめんなさい
  2. 他言語との比較:実装 → 完成まで 簡単: 複雑: SyntaxError RuntimeError RuntimeError 簡単: 複雑:

    他言語: SyntaxError RuntimeError RuntimeError SyntaxError SyntaxError ※ この辺はトレードオフなので、他言語を貶める意図はありません
  3. 自然言語に近く人間に優しい wakate.rb は楽しいイ ベントでした ◎ イベント楽しい wakate.rb サイコー wakate.rb で

    したイベントは ◯ ? つまり錬金術の基本は等価交換 !! 何かを得ようとするなら それと同等の対価が必要って事だ — 鋼の錬金術師 エドワード・エルリック
  4. その前に:① lexer と parser lexer parser スクリプト トークン列 構文チェック •

    lexer:構文チェックの前処理としてスクリプトをトークン列に変換 • parser:トークン列を読んで構文を確認 ◦ OK:以降の処理に移る ◦ NG:SyntaxError ◦ ※ 本当はASTの構築をしていますが今回は省略
  5. その前に:① lexer と parser wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞

    名詞 助動詞 句点 楽しいはイベントです wakate.rb。 形容詞 接続詞 名詞 助動詞 名詞 句点 lexer parser スクリプト トークン列 構文チェック
  6. その前に:① lexer と parser 1 + 2 * 3 NUMBER

    OPERATOR NUMBER OPERATOR NUMBER 1 +* 2 3 NUMBER OPERATOR OPERATOR NUMBER NUMBER lexer parser スクリプト トークン列 構文チェック
  7. その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞

    助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 tokenize 還元
  8. その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞

    助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 tokenize 還元 還元
  9. その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞

    助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 tokenize 還元 還元 還元
  10. その前に:② parser の構文チェック方法 wakate.rb は 楽しいイベントです。 名詞 接続詞 形容詞 名詞

    助動詞 句点 [主題句] 形容詞 名詞 助動詞 句点 主題句 [名詞句] 助動詞 句点 [名詞 接続詞] 形容詞 名詞 助動詞 句点 主題句 [形容詞 名詞] 助動詞 句点 主題句 [述語句] 句点 主題句 [名詞句 助動詞] 句点 [主題句 述語句] 句点 [文] 句点 tokenize 還元 還元 還元 還元
  11. その前に:② parser の構文チェック方法 1 + 2 * 3 NUMBER OPERATOR

    NUMBER OPERATOR NUMBER NUMBER OPERATOR [EXPRESSION] [EXPRESSION] NUMBER OPERATOR [NUMBER OPERATOR NUMBER] [NUMBER OPERATOR EXPRESSION] PROGRAM EXPRESSION tokenize 還元 還元 還元
  12. 同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞

    名詞 I book it. 名詞 動詞 名詞 前の品詞や周囲の文字列によって次の tokenize の結果が異なる
  13. 同じ文字列でも tokenize の結果が異なる例 I read the book. 名詞 動詞 冠詞

    名詞 I book it. 名詞 動詞 名詞 手前の単語を先に 還元しておかないと、次の単語の品詞を決定できない ➢ lexer の処理 (tokenize) に parser の処理結果が必要になる The people to run book it. [名詞句] 動詞 名詞
  14. • 他にも様々な要素によって tokenize の結果が変わる • Ruby ではそれを 状態 として構造化 lexer

    と parser の密結合 lexer parser tokenize 状態の更新 還元 状態の更新 スクリプト
  15. • 手書きの再帰下降 parser • 現在のデフォルト • 高いエラー許容性 • ASTへの豊富なAPIの提供 •

    高い移植性 • parser プログラムを生成する ruby ライブラリ (parser ではない) • 保守性を大きく改善 • これまでと異なるアルゴリズムの採用 2つのParser の誕生 Prism Lrama
  16. • 魔境と呼ばれた parse.y に2つの全く異なるアプローチでアタック ◦ 手書きの再帰下降 parser ◦ parser generator

    • Prism:過去と全く異なるモダナイゼーション • Lrama:革新的な parser アルゴリズムの実証 魔境の開拓 ➢ CS/構文解析の歴史においても鮮烈な状況がたのしい!