演算子空間の実装方法
次に実装方法について考えます。
具体的なJSONを使って記述した演算子表を以下に示します。
{ infixes:{100:"+",200:"*"}, operatorSpace:{ asm:{ extends:"root", infixes:{100:"-",200:"/"} } } }
infixes は中置演算子の表です。oparatorSpace が演算子空間でasmという演算子空間を定義しています。
extendsによって、asm演算子空間はroot演算子空間を継承します。
パースする際には、プログラムが開始した場合は+と*があるとしてパースします。asmがあったら次にある式はasm演算子空間にあるとして演算子表をasmの物を使ってパースします。
記号表の変更は、前あった記号表を置き換え、終了したら元に戻します。消すわけではないことに注意しましょう。
無名のローカルなユーザー定義演算子定義が仮に出来るとすれば、演算子表は保存しておいて置きかえるとよいでしょう。
無名な演算子空間は、例えば obscure{ ここ } というようにすれば可能でしょう。