Ruby Parser開発日誌 (18) - Rearchitect Ripper

Rubyのparserを語る上で忘れてはいけない存在としてRipperというライブラリがあります。 RipperはRubyのコードを構文解析するためのライブラリとしてirbやrdocなどで長く使われてきました。 一方でBug #10436のように長い間未解決のバグがあったり、Bug #189…

Ruby Parser開発日誌 (17) - 演算子の優先度はいつ使われるのか

AWKの式でa + bが構文解析でa (+b)ではなくて、(a) + (b)と解釈されるのはなぜでしょうかという質問をいただきました。 私はAWKに詳しいわけではないですが、LR parser なかでもBison用に書かれた文法定義ファイルであれば解説できると思うので、少し踏み込…

BuriKaigi 2024に参加してparser generatorの話をしてきた

1月20日に開催されたBuriKaigi 2024に参加するために19日から21日の三日間、富山に行ってきました。 burikaigi.dev 1/19 (0日目) お昼過ぎに東京駅から北陸新幹線にのって富山駅へ移動しました。 人生3回目の北陸でしたが、はじめての北陸新幹線でした。本当…

Ruby Parser開発日誌 (16) - 2023年を振り返って

とにかくparserとparser generatorをやっている一年でした。世はまさに"大パーサー時代"!!! Ruby3.3 リリースが目前に迫りました!リリースに向けまつもとさんから「大構文解析時代! Parser age」のキーワードを頂きTシャツにアレンジしました。多くの皆…

Ruby Parser開発日誌 (15) - Ruby の NODE を Union から卒業させた

まもなくRuby 3.3.0がリリースされますね。 LramaによるBisonの置き換え、named referencesによるparse.yのリファクタリングなど、parser本体の大きな改善が入ったバージョンになります。 今回はRuby 3.3向けに行った改善のうち「Rubyの抽象構文木のデータ構…

Ruby Parser開発日誌 (14) - LR parser完全に理解した

こんにちはかねこです。私はCRuby(ruby/ruby)のコミッタをやっているのですが、最近はCRubyをメインのターゲットとしてLALR parser generator Lramaの開発をしています。 現役のLALR parser generator開発者として、日頃私以上にLR parserのことを考えている…

Ruby Parser開発日誌 (13) - Ruby Parser Roadmapをつくった

Ruby Parser Roadmapをつくったのでご紹介します。 docs.google.com 大きな2つのゴール 現在注力している領域が2つあります。ひとつはLSPのサポート(図中では青色)、もうひとつはparse.yをより平易にするための取り組みです(図中では赤色)。またその他のゴー…

Ruby Parser開発日誌 (12) - LR parser generatorの提供する文法の健全性

LR parser generatorを難しいと感じるのはおそらくShift/Reduce ConflictやReduce/Reduce Conflictに遭遇したときでしょう。 嫌われがちなこれらのConflictが、実はわかりにくい文法を生み出すことを防いでいるというのが今日のお話です。 Bugs にあがった2…

Ruby Parser開発日誌 (11) - RubyKaigi 2023 follow upで進捗について話してきた

8/19に開催されたRubyKaigi 2023 follow upで、Rubyのparserとparser generatorに関する進捗と今後の方針について話をしてきました。 rhc.connpass.com 当日の資料はこちらにアップロードしてあります。 speakerdeck.com 進捗とこれからの話 RubyKaigiでの発…

Ruby Parser開発日誌 (10) - parse.y リファクタリングチャレンジ はじめました

前回のあらすじ Ruby Parser開発日誌 (9) - RubyKaigi 2023で発表してきた ~ 世はまさに”大パーサー時代” ~ - かねこにっき RubyKaigiにいってきました。スライドや登壇時の動画は以下のリンクから参照できます。ぜひご覧ください。 rubykaigi.org parse.y …

Ruby Parser開発日誌 (9) - RubyKaigi 2023で発表してきた ~ 世はまさに”大パーサー時代” ~

5/10から5/14の5日間、RubyKaigi 2023に参加するために松本市に行ってきました。前回参加したのがRubyKaigi 2019の福岡のときなので、じつに4年ぶりの参加でした。 今回はコミッター/登壇者/LTスピーカーとしての参加になりました。その結果、0日目のDevMeet…

Ruby Parser開発日誌 (8) - Universal Parserへの道

前回のあらすじ Ruby Parser開発日誌 (7) - doについて考える - かねこにっき Rubyのdoのもつ複雑さを中心にMaintainabilityの改善方法について考えました。Practical LR Parser Generationで紹介されているNonterminal attributesというアプローチにprecede…

Ruby Parser開発日誌 (7) - doについて考える

前回のあらすじ Ruby Parser開発日誌 (6) - parse.yのMaintainabilityの話 - かねこにっき Rubyのparserの複雑さを分析し、parserとlexerの密結合を解消に挑戦しました。Practical LR Parser Generationという論文を参考に条件付き生成規則をLramaに実装し、…

Ruby Parser開発日誌 (6) - parse.yのMaintainabilityの話

前回のあらすじ Ruby Parser開発日誌 (5) - Lrama LALR (1) parser generatorを実装した - かねこにっき Error Recoveryを実装するためにLrama LALR (1) parser generatorを実装しました。 Error Recoveryについては目処がたったので今回はparse.yのMaintain…

RipperでPattern Matchingを扱ったときにGC周りでinconsistencyが起きる問題を直した話 - もしくはparserのメモリ管理の話

たまにはRuby Parser開発日誌以外の話ということでRipperの話をします。 先日このようなpatchを書いたのでその話です。 github.com ちょっと前からmaster branchでfound internal inconsistencyが発生していました。 具体的なlogは http://ci.rvm.jp/results…

Ruby Parser開発日誌 (5) - Lrama LALR (1) parser generatorを実装した

前回のあらすじ Ruby Parser開発日誌 (4) - かねこにっき Error Recoveryに関する理解も深まり、Rubyのparserへ実装するために3つの実装方法を検討しましたが、どれもあまり簡単な方法ではありませんでした。この問題を解決するためにLALR parser generator…

Ruby Parser開発日誌 (4)

前回のあらすじ Ruby Parser開発日誌 (3) - かねこにっき LR parserの仕組みとInsert/Delete/ShiftによるError Recoveryについて、具体例を交えながら理解を深めました。 今回はいよいよError RecoveryをどうやってRubyに実装していくかを考えていきましょう…

Ruby Parser開発日誌 (3)

前回のあらすじ Ruby Parser開発日誌 (2) - かねこにっき Error Recoveryについてまとめました。もう少し詳しくError Recoveryを説明したほうがいいと思ったので、今回は前回の内容を具体例を用いながら解説します。 最初にLR parserの仕組みについて説明し…

Ruby Parser開発日誌 (2)

前回のあらすじ Ruby Parser開発日誌 (1) - かねこにっき Ruby 3.3にむけてLALR parserを前提にError Recoveryを実装していくことになりました。 現在の進捗 Corchuelo et al. のサブセットを実装した error recovery tokenのsemantic valueやlocationを設定…

Ruby Parser開発日誌 (1)

Error Tolerant parserに関するアイデア 9月半ばに行われたRubyKaigi 2022以来、3ヶ月くらいError Tolerant parserについて調べたり考えたり実装をしたりしています。 途中でもいいからなにかにアウトプットしておくとよいというアドバイスをもらったので、…

Ruby 2.7.7 のリリースにほんのちょっとだけ関わった話

11/24にRuby 2.7.7, 3.0.5, 3.1.3がリリースされました https://www.ruby-lang.org/ja/news/2022/11/24/ruby-2-7-7-released/ https://www.ruby-lang.org/ja/news/2022/11/24/ruby-3-0-5-released/ https://www.ruby-lang.org/ja/news/2022/11/24/ruby-3-1-3…

Ruby 3.2のParser目玉機能

今年の後半は久しぶりにRubyに機能を追加したりしており、Ruby 3.2に3つの機能(もしくは変更)をいれたので紹介したい。 Ruby 3.2リリースまであと一ヶ月くらいあるので、現時点でBugなどをみつけたら教えてほしい。 1. RubyVM::AbstractSyntaxTreeにkeep_tok…