Garbanzo proto 1 - akamah/garbanzo GitHub Wiki

プロトタイプその1

インタプリタの仕様

  • 文(sentence, 非終端記号)をひとつ読みこむたびに、インタプリタが順番に実行する。
  • 構文拡張(extension)は文に含めるとする。
  • 最初に定義されている構文は、構文拡張のみにしてみる。
  • 構文拡張で、print, +, *を実装してみよう。

内部表現の仕様

  • 内部表現は、Rubyの言語要素とは明確に分かれるものとする。そのため、Rubyのコードが構文拡張の時に実行できるのは妥協点とする。
  • とりあえず、印字、足し算、掛け算を持つものとする。
  • バイトコードまではまだ落ちないので、足し算や掛け算は式がネストしていても構わないとする。

構文解析

  • 構文には、ルールを足したり引いたりできるべきである。
  • 構文の拡張はパーサ内部で行われるため、構文の拡張を行った結果として、実行すべきコードが出てくることはない。
  • 取って付けだが、パーサコンビネータ風味のパーサを作成した。大変使いづらいが、後ほど放棄する予定なので、適当に使う。

開発の今後

プロトタイプその1では、Rubyの記法で内部表現を記述できていた。しかしいずれはrubyへの依存をなくす予定なので、 少なくとも最低1通りは内部表現の記法が必要である。同時に、構造を持ったオブジェクトも内部表現も必要となってくる。 言語の内部構造で構文解析器を拡張することが最終的な目標となるので、 これらのことは構文解析器の拡張が言語の内部で完結できる直前に行いたい。

プロトタイプのバージョン2では、上の目標と現状との中間地点を目標とする。 具体的には、

  • rubyで解釈する、構文拡張の文法を暫定的に用意し、現状用いているRubyのevalでの構文の拡張の代替とする ところまでを、プロトタイプのバージョン2としたい。

この目標を定める理由は、以下の二つである。

  • 構文拡張のための構文・オブジェクトの操作方法を考えてみて、構文の操作に必要な概念のエッセンスを抽出する
  • もしうまくいった場合、その言語の文法を、最初に定義された文法として定めてしまう。

(2016/1/13追記): 現在作成したプロトタイプバージョン2は,Garbanzoの構文をGarbanzoで記述できる方式として作成中であるため, ここに書いたバージョン2の予定とは別のものとなっている.