技術

6.2. ユーザ定義演算子: アイデア

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第6章 万華鏡: 言語の拡張: ユーザ定義演算子
第2節 ユーザ定義演算子: アイデア

我々が万華鏡に追加しようとしている”演算子オーバーロード機能(operator overloading)”は、C++のような言語のものより、より一般的なものである。
C++では、既存の演算子を再定義することしか出来ない。(文法をプログラマティックに変更したり、新しい演算子を導入したり、演算子の優先順位を変えたりなどが出来ない。)
この章では、ユーザ自身が演算子を追加できるような能力を万華鏡に追加する。

この章でユーザ定義演算子について示すのは、手書きの構文解析器の力と柔軟性を示すようなものである。
これまで我々が実装してきた構文解析器は、式の文法と演算子の優先順位を解析するために再帰下降法を使っている。(第2章を参照。)
演算子の優先順位の解析なしでは、プログラマが文法に新しい演算子を持ち込むのがとても難しくなってしまう。(文法はJITの実行によって動的に拡張されうる。)

ここでやりたいのは、プログラマブルな二項演算子や単項演算子の追加である。(現状では、万華鏡はひとつも単項演算子を持たない。)
ユーザ側における定義の例は以下のとおり。

# 単項演算子 論理否定。
def unary!(v)
  if v then
    0
  else
    1;

# "<"と同じ優先順位で">"を定義する。
def binary> 10 (LHS RHS)
  RHS < LHS;

# 二項演算子 論理和。(ショートサーキットしない事に注意。)
# 訳注: ショートサーキットしない = 論理和の評価で、左辺がtrueでも右辺も評価される
def binary| 5 (LHS RHS)
  if LHS then
    1
  else if RHS then
    1
  else
    0;

# 関連する演算子よりわずかに低い優先順位で"="を定義する。
def binary= 9 (LHS RHS)
  !(LHS < RHS | LHS > RHS);

多くの言語は、その言語自身でその言語のための標準ランタイムライブラリを実装する能力を得る事を目標としている。
万華鏡では、言語の重要なパーツをライブラリの中に実装することが出来る。

これらの機能の実装について2つの部分に分解する。
ユーザ定義の二項演算子のサポートの実装と、ユーザ定義の単項演算子のサポートの実装である。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示