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
Ecosystem on parse.y
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
S.H.
February 28, 2026
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ecosystem on parse.y
福岡Rubyist会議05
S.H.
February 28, 2026
More Decks by S.H.
See All by S.H.
Termfront: Ruby標準ライブラリだけで作るFPS
gamelinks007
1
80
Ruby on Bare Metal
gamelinks007
0
100
ゆるゆるMastodon 鯖缶生活
gamelinks007
0
780
1週間で作るActivityPubリレーサーバ
gamelinks007
0
180
Rails 8で作るActivityPub リレーサーバ
gamelinks007
0
620
Developing an ActivityPub Relay with Rails 8
gamelinks007
0
110
Mastodon on Ruby master
gamelinks007
0
190
Trying to Make Ruby's Parser Available as a Gem
gamelinks007
1
670
ユーザーから見たLrama
gamelinks007
0
260
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
690
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
160
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Embracing the Ebb and Flow
colly
88
5.1k
Into the Great Unknown - MozCon
thekraken
41
2.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Docker and Python
trallard
47
3.9k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Transcript
Ecosystem on parse.y S.H. 福岡Rubyist会議05
自己紹介 S.H.(Shun Hiraoka) 株式会社永和システムマネジメント Hamada.rb たまにRuby本体にパッチを投げています 最近はparse.yを使ってエコシステムを作れな いか頑張っている
今日話すこと なぜparse.yを使ってエコシステムを作りたい のか エコシステムの基礎になるKanayago(金屋子) の紹介 そこから生まれたエコシステムの芽となるツール 今後の展望
なぜparse.yで エコシステムを 作りたいのか
Rubyには2つのパーサーがある Prism 手書きの再帰下降パーサー Ruby 3.4からはデフォルトのパーサー ユーザー向けにライブラリとしても公式に提供されている parse.y LRパーサー Ruby 3.3までのデフォルトのパーサー
ユーザー向けにライブラリは公式に提供されていない
Prismでいいのでは? Ruby本体で使われているパーサーがそのまま ライブラリとして使える RuboCopやTypeProfなどではPrismでコー ドを解析している 普通に使うのであればPrismで充分
parse.yが必要な背景 いくつかの文法上のエッジケースがPrismには 存在する parse.yからもユーザー向けにライブラリを提供 するべき ユーザーが選べるパーサーの選択肢を広げたい
Universal Parserの存在 Universal Parserはparse.yを外部から扱える ようにする仕組み 参考実装をベースに、実用的なライブラリとして Kanayago(金屋子)を作り始めた
起点となる Kanayago (金屋子)
Kanayago(金屋子) parse.yを資産として再利用するライブラリ parse.yをRubyレイヤーで扱えるようにした唯 一のライブラリ parse.yをC拡張から再利用し、生成された ASTをRubyのオブジェクトとして返す 名前は製鉄の神の名前から取った
前回から設計上の課題 福岡Rubyist会議04では構想と初期実装を紹 介 C拡張のみでコードが読みにくい ASTをHashとArrayベースで実装しており、 実用には向かなかった ASTも一部のみのサポート 特定のバージョンでのみ動作するビルド構成
現在までの課題への対策と対応 実装はRubyとC拡張のハイブリッドへ変更する ASTをクラスベースへ移行する すべてのASTをサポートする 複数のRubyのバージョンでビルドできるように する
クラスベースへの移行 RubyとC拡張で実装しなおした Rubyでは各ASTのクラスを定義 C拡張ではparse.yへ引数で受け取ったコード を渡し、ASTを生成 生成されたASTをC拡張内でRubyのオブジェ クトへ変換
Rubyでの実装 module Kanayago class IntegerNode # ASTの持つ値を外部からアクセスできるように設定 # node_attributesでパターンマッチにも対応 node_attributes
:val, :minus, :base end end
C拡張での実装 VALUE integer_node_new(const NODE *node) { VALUE result = rb_class_new_instance(0,
0, rb_cIntegerNode); // CRubyのASTが持つ値をインスタンス変数へ詰める rb_ivar_set(result, rb_intern("@val"), rb_node_integer_literal_val(node)); rb_ivar_set(result, rb_intern("@minus"), RNODE_INTEGER(node)->minus == TRUE ? Qtrue : Qfalse); rb_ivar_set(result, rb_intern("@base"), INT2FIX(RNODE_INTEGER(node)->base)); return result; }
設計としての判断 クラスベースへ移行するにあたり、すべてをCで 書くのは現実的ではない インスタンス変数へのアクセスなどはRubyで対 応するほうが保守しやすいはず KanayagoのASTを拡張する際にRubyの コードを変更すれば対応しやすくなる
実装が難しかった個所 parse.yのASTノードは100種類以上あり、そ れぞれRubyのクラスへマッピングする必要が あった ASTが別のASTを値として持つツリー構造をど う再現するかも課題だった
実装の難しさへの対応 ASTノードのマッピングに関しては大まかな方 針を出してClaude Codeで対応 ツリー構造に関してはASTの変換処理を再帰で 呼ぶ形で解消
Kanayagoのサポート状況の改善 parse.yが生成するASTはすべてサポート Ubuntu/macOS/WindowsでCIをサポート Ruby 3.4/4.0をサポート ビルド時にバージョン対応のtarball取得やパッ チ適用で複数環境をサポート
ビルドのイメージ
エコシステムの芽 となるツール
Kanayagoを使って作ったもの Kanayagoをベースに新しいツールや仕組みを 作った KanayagoのLSPとエディタ向けの拡張機能 テストの雛型作成ツールのIgata(鋳型)
KanayagoのLSP Kanayago自体をLSPとして起動できるように 改修 Kanayagoと各種エディタをLSPで繋ぎ、リア ルタイムにシンタックスエラーを検知 コードを書きながらシンタックスエラーを修正で きる
KanayagoのLSPの強み PrismとRuby LSPでもできるが、エッジケー スはすり抜ける Kanayagoでは除外できる a rescue b => c
in d # PrismではSyntaxErrorにならない # parse.yではSyntaxErrorになる # [Bug #21713] # https://bugs.ruby-lang.org/issues/21713
LSPサーバを実装 def analyze(source) diagnostics = [] # KanayagoでソースコードをASTへ変換 result =
Kanayago.parse(source) # SyntaxErrorの場合はエラー情報を詰める if result.invalid? error = result.error diagnostic = create_diagnostic(error, result.script_lines) diagnostics << diagnostic end diagnostics end
現状のサポートエディタ VSCode Vim Neovim Emacs Helix Zed
vscode-kanayago VSCodeからインストールできます
Zed(rubyの拡張機能) ZedのRuby拡張にマージ済み リリース待ち
Igata(鋳型) テストの雛型を生成するツール テストがない既存のコードへのテスト追加の補助 として作成 MinitestとRSpecをサポート bundle exec igata lib/user.rb >
test/test_user.rb # => テストコードの雛型が生成される
Igataの仕組み ソースコードを受け取り、KanayagoでASTを 取得 取得したASTを元に条件分岐やメソッドの引数 情報などを集計 集計した内容を元に指定されたテストフレーム ワーク用のフォーマットを呼び、テストコードを生 成
入力例 class User def initialize(name, age) @name = name @age
= age end def adult? @age >= 18 end end
出力例(Minitestの場合) # frozen_string_literal: true require "test_helper" class UserTest < Minitest::Test
def test_initialize # Arguments: # - name (required) # - age (required) skip "Not implemented yet" end def test_adult? # Comparisons: >= (@age >= 18) # Boundary value suggestions: # @age >= 18: [17 (below), 18 (boundary), 19 (above)] skip "Not implemented yet" end end
IgataからKanayagoへ入った変更 Mastodonのパースできないケースがあったので 修正 KanayagoがmacOSで動かない報告に対応
Igataで見つかった課題の例 Mastodonのschema.rbなど大きなファイルを パースするとSegmentation faultが起きる AST走査中にGCが走り、ASTデータが回収さ れていた RB_GC_GUARDで走査完了までGCから保護 して解決
修正したコード例 VALUE vparser = TypedData_Make_Struct(0, struct ruby_parser, &ruby_parser_data_type, parser); /*
... */ VALUE vast = rb_parser_compile_string(vparser, "main", source, 0); rb_ast_t *ast = rb_ruby_ast_data_get(vast); VALUE ast_node = ast_to_node_instance(ast->body.root); // vast、vparserがGCされるとSegmentation faultになる // GCされないようにガードを付けている RB_GC_GUARD(vast); RB_GC_GUARD(vparser);
今後の展望
現状のエコシステム LSPとエディタ向けの拡張機能でユーザーが直 接parse.yの恩恵を受けられるようになってい る Igataでのテスト雛型の生成 エコシステムの芽はできているが、まだまだツー ルを増やせる余地がある 例: Linterなど基盤があれば作れるツールは多い
parse.yを中心としたエコシステム 基盤層としてparse.yのASTを返す Kanayago Kanayagoの上に乗るツール群としてLSP、 Igata ユーザーはエディタ拡張、テスト生成などを利用 できる Kanayagoを基盤にすれば、誰でもparse.yを 活用したツールを作れる
エコシステムの全体像
Rubyが自分自身を読み解く可能性 KanayagoとCRubyはどちらもCとRubyで実 装されている KanayagoのアプローチをCRubyに移植でき る可能性がある 実現すれば、Rubyがparse.yを通じて自分自 身のコードを読み解くことができる
今後のエコシステムの発展のために Kanayagoで出来ることはまだまだあります 人手が足りていないので手伝ってくれる人は絶 賛募集中です 一緒にparse.yを起点としたエコシステムを作っ ていきませんか?
まとめ Kanayagoが実用段階になり、LSPやIgataと いったツールが生まれた 小さな試行の積み重ねだが、parse.yを中心と したエコシステムが形になりつつある 「Rubyのparse.yをRuby自身で活用する」と いう新しい可能性を一緒に広げていきたい