All Packages  Class Hierarchy  This Package  Previous  Next  Index

Class epp.Parser

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

public class Parser
extends Object
EPP プリプロセッサが持つメソッドのうち Java 言語のパーザ部分を定義するメソッドです。.

注意: このクラスは、 javadoc を作るための便宜的なクラスです。 実際の EPP のソースコード中には存在しません。

plug-in の中から、SystemMixin 構文を使って、 各メソッドの挙動を拡張することにより、 EPP が処理する Java 言語の 文法を拡張することができます。

EPP のパーザは、再帰下降スタイルで書かれています。 再帰下降パーザとは、各 non-terminal を1つの関数で表すスタイルで 書かれたパーザです。 関数は、 non-terminal を1つ構文解析し、結果を tree として返します。 例えば EPP の場合、 expression() というメソッド呼び出しは、 現在のトークンから「式」が始まるものと仮定して構文解析を始め、 成功したら構文解析の結果を抽象構文木として返します。

非終端記号の多くは、 defineNonterminal というマクロで定義されます。 このマクロは、 xxxTop, xxxLeft, xxxRight というメソッドを自動的に 定義します。 plug-in は、これらのメソッドを拡張することで、 非終端記号に新たな選択肢を追加することができます。 どのような非終端記号があるかは、 「EPP が受理する Java 文法」 を見て下さい。

EPP では構文解析中にバックトラックする機構を提供してます。 純粋な1トークン先読み再帰下降構文解析では LL(1) の文法しか解析できませんが、 バックトラックすることにより、より広範囲の文法を扱えます。

See Also:
backtrack

Constructor Index

 o Parser()

Method Index

 o convertExpressionToType(Tree)
式として構文解析された抽象構文木を、型を表現する正規形に変換する メソッドです。.
 o type()
非終端記号 Type を構文解析し、結果を返すメソッドです。.
 o xxx()
非終端記号 xxx を構文解析し、結果の抽象構文木を返すメソッドです。.
 o xxx1()
非終端記号 xxx の選択肢が全てマッチしなかった時に呼ばれるメソッドです。.
 o xxxLeft(Tree)
非終端記号 xxx が持つ選択肢のうち、 左再帰ルールを構文解析して返すメソッドです。.
 o xxxRight(Tree)
非終端記号 xxx が持つ選択肢のうち、 右結合2項演算子を構文解析して返すメソッドです。.
 o xxxTop()
非終端記号 xxx が持つ選択肢のうち、 先頭の1トークンだけで判断できるものを構文解析して返すメソッドです。.

Constructors

 o Parser
 public Parser()

Methods

 o xxx
 public Tree xxx()
非終端記号 xxx を構文解析し、結果の抽象構文木を返すメソッドです。. xxx は非終端記号の名前の先頭を小文字にしたものです。 (例えば、 statement, expression, classBodyDeclaration など。) defineNonterminal マクロを使って定義されます。 このメソッドは、普通、 plug-in が拡張・再定義してはいけません。 (行番号処理などが狂う可能性があります。) 構文を拡張したい場合は、 xxxTop, xxxRight, xxxLeft というメソッドを 拡張して下さい。

 o xxxTop
 public Tree xxxTop()
非終端記号 xxx が持つ選択肢のうち、 先頭の1トークンだけで判断できるものを構文解析して返すメソッドです。.

このメソッドは、defineNonterminal マクロによって自動的に定義されます。

 o xxxRight
 public Tree xxxRight(Tree tree)
非終端記号 xxx が持つ選択肢のうち、 右結合2項演算子を構文解析して返すメソッドです。. 引数 tree は、2項演算子の左辺を構文解析した結果の tree です。

このメソッドは、defineNonterminal マクロによって自動的に定義されます。

 o xxxLeft
 public Tree xxxLeft(Tree tree)
非終端記号 xxx が持つ選択肢のうち、 左再帰ルールを構文解析して返すメソッドです。. 引数 tree は、非終端記号 xxx を構文解析した結果の tree です。

このメソッドは、defineNonterminal マクロによって自動的に定義されます。

 o xxx1
 public Tree xxx1()
非終端記号 xxx の選択肢が全てマッチしなかった時に呼ばれるメソッドです。. 式の場合は、普通次の優先度の非終端記号のメソッドを呼び出すように 定義されています。 このメソッドは、普通 plug-in は再定義しません。

 o type
 public Tree type()
非終端記号 Type を構文解析し、結果を返すメソッドです。.

実装の都合上、メソッド type は、まずメソッド primary を呼び出し、 その返値を型を表現する正規形に変換して、返します。 正規形に変換するために、メソッド convertExpressionToType を 呼び出します。

plug-in が新しい「型の表現」を導入するためには、 メソッド primaryTop とメソッド convertExpressionToType を 拡張する必要があります。

See Also:
convertExpressionToType
 o convertExpressionToType
 public Tree convertExpressionToType(Tree exp)
式として構文解析された抽象構文木を、型を表現する正規形に変換する メソッドです。. EPP のパーザは、再帰下降による実装の都合上、 型名を最初、式として構文解析します。 その後、このメソッドで、 型名として扱いやすい形に変換します。 例えば "int" という識別子は、式として構文解析した結果は (id int) ですが、これを正規形に変換すると (name (id int)) になります。

型の正規形は、次のように定義されます。

 CanonicalType:
	(name Identifier Identifier*)
	(arrayOf CanonicalType)
       <extended alternatives>

型を表現する抽象構文木として不適切なものが引数に渡された時は、 EppUserError が throw されます。

See Also:
type, TypeNameChecker

All Packages  Class Hierarchy  This Package  Previous  Next  Index