2026-01-01から1ヶ月間の記事一覧

Ruby Parser開発日誌 (24-27) - parse.yが生成するノードを変える ー xstringとdsym

27日目: xstringと式展開を含んだsymbolに対応する 前回は%記法、文字列の結合、ヒアドキュメントなどの対応をしました。 今回は`cmd`のような文字列(通称xstring)と式展開を含んだsymbolに取り組みたいと思います。 parserを変更する xstringに関連する生成…

Ruby Parser開発日誌 (24-26) - parse.yが生成するノードを変える ー 文字列 その2 (%記法, 文字列の結合, ヒアドキュメント)

26日目: 文字列に関するいろいろ 前回は文字リテラル、文字列リテラル、式展開などの対応をしました。 しかし文字列に関連するトピックはこれだけではありません。 今回は%記法、文字列の結合、ヒアドキュメントなどをみていきます。 %記法 Rubyには%記法と…

Ruby Parser開発日誌 (24-25) - parse.yが生成するノードを変える ー 文字列

25日目: 文字列に立ち向かう 久しぶりにリテラル周りの対応を進めようかという気持ちになったので、今日は文字列に取り組んでいきます。 シンプルなケース stringで最もシンプルなケースは次の3つでしょう。 "str" 'str' ?c (文字リテラル) いずれのケースも…

Ruby Parser開発日誌 (24-24) - parse.yが生成するノードを変える ー aliasとback_refとnth_ref

24日目: aliasとback_refとnth_ref ずっと制御構文をやっていたので、たまには気分を変えてaliasの書き換えをやっていきたいと思います1。 aliasのノードを書き換える 書き換え前の世界ではグローバル変数のaliasを表すNODE_VALIASとそれ以外のaliasを表すNO…

Ruby Parser開発日誌 (24-23) - parse.yが生成するノードを変える ー superとyield

23日目: superとyieldに対応する 前回はbreak, next, redoといった制御構文に対応したので、今回はsuperとyieldに取り組みます。 superのノードを書き換える Rubyではsuper 1のように引数を渡したときと、superのように引数を渡さないときで挙動がだいぶ変わ…

Ruby Parser開発日誌 (24-22) - parse.yが生成するノードを変える ー break, next, redo

22日目: break, next, redoに対応する 前回はretryの書き換えをしたところで、whileやuntilの対応をまだしていなかったことに気がついたので、それらloopの対応をしたのでした。 今回はloopやブロックに対する制御構文であるbreak, next, redoに取り組みます…

Ruby Parser開発日誌 (24-21) - parse.yが生成するノードを変える ー retry, while, until

21日目: 制御構文に対応する 前回はbegin ... rescue ... endに対応したので、今回はretryをはじめとする制御構文を書き換えていきましょう。 retryに対応する rertyは引数を取らないため、そのノードもシンプルです。 begin p :begin rescue p :rescue retr…

Ruby Parser開発日誌 (24-20) - parse.yが生成するノードを変える ー rescueとensureのコンパイル

20日目: rescueとensureをコンパイルする 前回はrescueとensureのノードを書き換えたので、今回はそれらをコンパイルできるようにしていきましょう。 バイトコードを眺める compile.cをいじるまえに、rescueやensureがどのようなバイトコードになるのかを確…

Ruby Parser開発日誌 (24-19) - parse.yが生成するノードを変える ー rescueとensure

19日目: rescueとensureを対応する 今回はrescueとensureに取り組みます。 難しい部分はおそらくコンパイルするときにcatch tableを用意したりする部分だと思うのですが、その辺は既存の仕組みに乗っかれるはずなのでノードの書き換え自体はそこまで難しくな…

Ruby Parser開発日誌 (24-18) - parse.yが生成するノードを変える ー クラスとモジュール

18日目: class, singleton class, moduleの定義 今回はclass定義やmodule定義をやっていきます。 なんでこれまでやってこなかったんだっけとしばらく考えていたのですが、class C; endのように定数の参照が関係するので定数の対応をしてからにしようと思って…

Ruby Parser開発日誌 (24-17) - parse.yが生成するノードを変える ー 定数 (shareable constantとmultiple assignment)

17日目: shareable constantと定数へのmultiple assignment 前回は定数の参照と代入に関するノードを書き換えました。 その途中でshareable_constant_valueマジックコメントの有無によって構文木の構造が変わることに気がついたのでした。 今回はshareable_c…

Ruby Parser開発日誌 (24-16) - parse.yが生成するノードを変える ー 定数

16日目: 定数の参照と代入 しばらくmultiple assignmentの実装が続いたので、今回はちょっと目先を変えて定数の参照と代入をやっていきます。 ノードを眺める いつものように書き換え前後のノードの確認からはじめましょう。 書き換え前 書き換え後 A, A::B…

Ruby Parser開発日誌 (24-15) - parse.yが生成するノードを変える ー 仮引数のmultiple assignment

15日目: 仮引数にもあるmultiple assignment さて、multiple assignmentでおそらく最も複雑な部分を実装したので今回は仮引数部分のmultiple assignmentに取り組みます1。 以下のコードのように、Rubyではメソッド定義などの仮引数のところにもmultiple assi…

Ruby Parser開発日誌 (24-14) - parse.yが生成するノードを変える ー multiple assignment (おまけ)

14日目: multiple assignmentのコンパイルに関する細かな話 multiple assignmentのノードの変更とコンパイルは前回までで大体できました。 今日はノードの書き換えのときには触れなかったmultiple assignmentのコンパイルに関する小話を2つしたいと思います…

Ruby Parser開発日誌 (24-13) - parse.yが生成するノードを変える ー multiple assignment (コンパイラ編)

13日目: multiple assignmentをコンパイルする 前回はmultiple assignmentのノードを変更したので、今回はコンパイラをやっていこうとおもいます。 バイトコードを観察する 取り扱うノードの種類が微妙に変わったので、multiple assignmentに対応するバイト…

Ruby Parser開発日誌 (24-12) - parse.yが生成するノードを変える ー multiple assignment (parser編)

12日目: multiple assignment attr assignmentに続いて今回はmultiple assignmentをやっていこうとおもいます。 multiple assignmentというのはa, b = fooのように左辺に2つ以上の何かがある代入のことです1。 multiple assignmentに類似した概念はメソッド…