EPP1.0 plug-ins

(Last update: 1998-02-22)

EPP 1.0 についてくる plug-in の説明です。

説明のあと、「plug-in ソース」「使用例」「変換結果」のリンクがあります。


目次


実用的 plug-in

plug-in プログラマーのためのサンプル plug-in

(配布パッケージの epplib.jar には入っていません。)

plug-in プログラムに使用する plug-in

(runtime が必要なので、普通の Java プログラムからは使えません。)

AutoSplitFiles

この plug-in を指定しておくと、 1つのファイルに、複数の public なクラスをまとめて書くことができます。 EPP は、クラスごとに自動的にファイルに分けてくれます。 friendly なクラス(つまり public が指定されていないクラス)は、 もともとのファイルに残されます。

各クラスの内容は、もともとのファイルでの位置と同じ行に出力されます。 例えば、 File.java に public なクラス A, C と friendly なクラス B が あったとすると、 eppout の下には File.java、 A.java 、 C.java が 作られ、それぞれの中身は以下のようになります。

 File.java          eppout/File.java  eppout/A.java    eppout/C.java
+--------------+    +--------------+ +--------------+ +--------------+ 
|public class A|    |              | |public class A| |              | 
+--------------+    +--------------+ +--------------+ +--------------+ 
|class B       | => |class B       | |              | |              | 
+--------------+    +--------------+ +--------------+ +--------------+ 
|public class C|    |              | |              | |public class C| 
+--------------+    +--------------+ +--------------+ +--------------+ 
展開後の Java プログラムを javac してエラーが出ても、 クラス名と行番号から、もともとの場所を容易に特定できます。

defmacro

C プリプロセッサの #define のように、簡単にマクロ定義ができるように する plug-in です。
例:
        defmacro max(a, b)  (a > b ? a : b)
        defmacro swap(t, a, b) {t tmp; tmp = a; a = b; b = tmp;}
マクロ展開のパターンは、"(" か "{" で始まらなければなりません。 "(" で始まる場合は式として、 "{" ではじまる場合はブロックとして その先がパーズされます cpp と違って、変換はトークン単位ではなく、構文解析後の tree に 対して行なわれます。 (したがって、この defmacro では、 Java の文法の変更はできません。)

マクロは関数呼び出しのスタイルに限られます。 #define と違って、次のようなマクロは定義できません。

        defmacro  SIZE   1024            /* これはだめです。 */
cpp の #define の場合は次のように展開後の引数の内側をかっこでくくる 必要がありますが、この defmacro ではその必要はありません。
        #define max(a, b)  ((a) > (b) ? (a) : (b))

plug-in ソース / 使用例 / 変換結果

EmbedCopyright

すべてのクラスファイル中に "Copyright 1998 ..." のような文字列を 埋め込むための plug-in です。 これを使うためには、 まず、カレントディレクトリに Copyright.txt というファイルを作り、 その中に埋め込みたいメッセージを書きます。 そして、
        epp -plug-in EmbedCopyright *.java
のようにしてこの plug-in を指定すれば、 Copyright.txt の中身が すべてのクラスの static field の初期値の形で埋め込まれます。
plug-in ソース / 使用例 / 変換結果

enum

連続した整数値を持つ定数の宣言を容易にする plug-in です。 使い方は使用例を見て下さい。
plug-in ソース / 使用例 / 変換結果

OptParam

C++ と同様に、省略可能な引数を持った メソッド定義を可能にする plug-in です。
plug-in ソース / 使用例 / 変換結果

UserOp

ユーザが定義したクラス用の演算子です。 Nik Shaylor さんの jpp (http://www.digiserve.com/nshaylor)にならって、 かっこつきのオペレータをユーザ用演算子としました。 優先順位は、組み込みの演算子と同じです。 各演算子は、以下のようなメソッド呼び出し式に展開されます。
       a (+)  b     a.plus(b)   
       a (-)  b     a.minus(b)
       a (*)  b     a.times(b)
       a (/)  b     a.divide(b)
       a (%)  b     a.modulus(b)
       a (<<) b     a.leftShift(b)
       a (>>) b     a.rightShift(b)
       a (>>>) b    a.unsignedRightShift(b)
       a (==) b     a.equals(b)
       a (!=) b    !a.equals(b)
       a (<)  b     a.lessThan(b)
       a (>)  b     a.greaterThan(b)
       a (<=) b    !a.greaterThan(b)
       a (>=) b    !a.lessThan(b)
       a (&) b      a.and(b)
       a (|) b      a.or(b)
       a (^) b      a.not(b)
この plug-in は、 EPP の lexical analyzar を拡張する例でもあります。
plug-in ソース / 使用例 / 変換結果

Math

この plug-in は、クラス Math が持つ static method を、 関数のように扱えるようにするものです。 例えば、 Math.sin(x) の代わりに、単に sin(x) と書けるようになります。
plug-in ソース / 使用例 / 変換結果

assert

assert マクロです。 条件式を評価して false だったら、ファイル名と行番号を System.err に 出力した後、 Error を throw します。 assert マクロを空文に展開するには、 noassert plug-in を使います。
plug-in ソース / 使用例 / 変換結果

noassert

assert マクロを空文に展開するための plug-in です。 通常は、 EPP を起動する時に以下のようにオプションを指定して使用します。
        epp -plug-in noassert File1.java File2.java ...
noassert plug-in を追加することで、 assert plug-in の機能を override します。
plug-in ソース / 使用例 / 変換結果

SWAP

swap マクロです。もっとも簡単な plug-in の例です。
plug-in ソース / 使用例 / 変換結果

CallByReference

この plug-in は、 call by reference っぽいものを実現します。 呼び出し側では、値を入れてもらう変数に & をつけて渡します。 呼ばれる関数の側は、その引数は配列型として宣言し、 x[0] = value; とやって値を返します。

なお、現在の実装では & をつけられるのは int 型の変数のみです。 現在のバージョンの EPP は型情報をいっさい扱っていないためです。
plug-in ソース / 使用例 / 変換結果


PComp

この plug-in は、比較演算子の文法を Python という言語と同じものにします。
        if (0 <= x && x < max) ...;
と書く代わりに、
        if (0 <= x < max) ...;
というふうに、数学的な記法そのままで書けます。

他の plug-in は Java の機能を「拡張」するものですが、 この plug-in は、オリジナルの Java の文法の一部を「置き換える」例に なっています。 (ソースコードの先頭の方で、 標準の Java パーザ部品を取り除いています。)

なお、この plug-in も、比較の対象は int 型だと仮定しています。
plug-in ソース / 使用例 / 変換結果


SystemMixin

この plug-in は、 plug-in 開発用です。
プログラムの部品化を支援する System Mixin の機能を Java に追加するものです。

Symbol

この plug-in は、 plug-in 開発用です。
lisp の symbol のようなものを提供します。 各 plug-in のソース中にある、 :foo や :"+" などが symbol を表します。

BackQuote

この plug-in は、 plug-in 開発用です。
lisp の backquote macro の機能を Java に追加し、 tree 状の抽象構文木を扱いやすくするためのものです。 たとえば Math plug-in のソースでは、以下のように backquote macro を 使っています。
    Tree fname = tree.args()[0];
    return `(invokeLong
             (name (id java) (id lang) (id Math))
             ,fname
             (argumentList ,@args));

EppMacros

この plug-in は、 plug-in 開発用です。
非終端記号と二項演算子の定義を容易にするために、 以下の2つのマクロを提供します。
        defineNonTerminal(NonTerminalName, DefaultValue);
        defineBinaryOperator(SystemMixinNAME, Token, PRECEDENCE);

To Home Page of EPP