All Packages  Class Hierarchy  This Package  Previous  Next  Index

Class epp.Token

java.lang.Object
   |
   +----epp.Token

public abstract class Token
extends Object
クラス 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") にはなりません。

See Also:
Lex, Symbol, LiteralToken

Constructor Index

 o Token()

Method Index

 o isLiteralToken()
この token が LiteralToken なら true 、 そうでないければ false を返します。
 o isSymbol()
この token が Symbol なら true 、 そうでないければ false を返します。
 o literalContents()
この token が LiteralToken なら、 literalContents を返します。.
 o literalTag()
この token が LiteralToken なら、 literalTag を返します。.
 o print()
Opts.out に、このトークンを print する、デバッグ用メソッドです。.

Constructors

 o Token
 public Token()

Methods

 o isLiteralToken
 public boolean isLiteralToken()
この token が LiteralToken なら true 、 そうでないければ false を返します。

 o isSymbol
 public boolean isSymbol()
この token が Symbol なら true 、 そうでないければ false を返します。

 o literalTag
 public Symbol literalTag()
この token が LiteralToken なら、 literalTag を返します。. この token が LiteralToken でないなら、 fatal error です。

See Also:
LiteralToken
 o literalContents
 public String literalContents()
この token が LiteralToken なら、 literalContents を返します。. この token が LiteralToken でないなら、 fatal error です。

See Also:
LiteralToken
 o print
 public Token print()
Opts.out に、このトークンを print する、デバッグ用メソッドです。. 自分自身を値として返します。 使用例:
       if(lookahead().print() == :"+") ...


All Packages  Class Hierarchy  This Package  Previous  Next  Index