鱒身(Masu_mi)のブログ

知った事をメモする場所。

Luaに演算子を追加してみた

NetBSD、カーネル内部でLua動作 ってニュースがありました。 さすが変態OSって言ってる人もいた。 とりあえず、読むだけでなく中のソースコードを触るきっかけに使わせてもらいました。

タイトル通り << >> 演算子を追加しました。 github

書き換えた箇所

以下のオペコード生成までがLuaバイトコード生成の部分。 演算子の追加のために仮想マシンを書き換えた。実際の挙動のためにイベント・タグメソッドを実装した。

llex.c, llex.h 字句解析器
lparser.c, lparser.h 構文解析器
lcode.c オペコード生成
lvm.c 仮想マシン
ltm.c, ltm.h イベント, タグメソッド

Luaの構文解析器は手書き

理由は以下が 挙げらていた

  • 生成されたコードがANSI C標準でない
  • クオリティコントロールが難しい(解析時スタックオーバーフローなど)
  • 再入可能ではない(解析中にパーサを呼び直すなど)
  • ボトムアップ型パーサーは実行時コード生成にあまり向かない

ただ文法を記述してコードが生成されるのと違って管理コストが大きくシンタックスが成熟する前に手書きにするのはお勧めしないと書かれていた。

書いてみたのだが、自然に感じる記号を選ぶという事は難しいと思った。また演算子を追加するとプリミティブ全てに対してサポート有無・内容を決める必要が出てくる。 この判断は表面的な文字列から逸脱してはならない。 気楽にテーブルだけで適用される << を追加したのだけど不自然だし扱い辛い事この上なかった。

近いうち、構文解析やタグメソッド呼び出し機構など内部の機構と関連関数に関してまとめようと思う。