All Packages Class Hierarchy This Package Previous Next Index
java.lang.Object | +----epp.Token
クラス Token 自体は、 abstract class です。 Token には、 LiteralToken と Symbol の2つのサブクラスがあります。 全てのリテラル(整数定数、文字列定数など)のトークンは LiteralToken で 表現されます。 また、リテラル以外の全てのトークン(class, if, while などのキーワード、 +, -, == などの記号、変数名などの識別子)は、 Symbol で表現されます。
plug-in は、字句解析ルーチンを拡張することができますが、 クラス Token のサブクラスを新たに作ることはできません。 新たな種類のトークンを導入する場合、 必ず LiteralToken か Symbol の いずれかでトークンを表現しなければなりません。
字句解析器は、「キーワード」は区別しません。 if, class などのキーワードも、 x, y などの変数名・メソッド名も、 +, - などのオペレータもすべて Symbol で表します。
リテラルは、クラス LiteralToken で表され、 これを toString() で文字列に変換すると、リテラルの種類を表すリテラルタグと、 リテラルの中身を表す文字列の組になります。 例えば、 123 という整数リテラルは、 (int "123") に、 "abc" という文字列リテラルは、 (string "abc") になります。
例えば、次のようなプログラムを字句解析すると、
if (x == 0) System.out.println("Hello!");結果は、
if ( x == (int "0") ) System . out . println ( (string "Hello!") ) ;というようなトークンの列になります。 (epp の -token オプションによって、字句解析の結果を出力させる ことができます。)
リテラルタグとリテラルの中身は、 それぞれ、 literalTag(), literalContents() というメソッドで取り出すことができます。 これらのメソッドは、クラス Token に用意されており、 クラス LiteralToken にキャストしなくても呼び出すことができます。 例えば、あるトークンが文字列リテラルであった時に、その中身を 出力するプログラムは、以下のようになります。
Token token = ...; if (token.isLiteralToken() && token.literalTag() == :string){ System.out.println(token.literalContents()); }
EPP は言語拡張を目的としたプリプロセッサですから、 字句解析器は言語仕様への依存ができるだけ小さくなるように 注意して書かれています。 キーワードと識別子の区別をしないのはそのためです。 また、リテラルもできるだけプログラム中に書かれた形をそのまま 保つようにしています。 例えば、003.000 は (double "003.000") というふうに表されます。 (double "3.0") にはなりません。
public Token()
public boolean isLiteralToken()
public boolean isSymbol()
public Symbol literalTag()
public String literalContents()
public Token print()
if(lookahead().print() == :"+") ...
All Packages Class Hierarchy This Package Previous Next Index