public class SyntaxReader extends Object
構文定義に従い、入力文字列を解析します。
構文定義法、入力解析法などの総合的な説明を パッケージ otsu.symphonieの説明 で行ってありますので、まずご覧ください。
標準的使い方
次のような手順を踏みます。
read-APIで得られる情報はSyntaxElementです。
SyntaxReadersr =new SyntaxReader(); //(1)SyntaxReader作成 sr.readSyntaxFile("syntaxDef.sn","utf-8"); //(2)構文定義設定 sr.parse("text.txt");//(3)入力設定SyntaxElementeml=new SyntaxElement(); while( sr.read(elm,sr.END_AT_EOF)){ //(4)読む _pr.println(hiU.indent(elm.nest)+elm.toXMLString(option_)); }
もう少し細かく構文を取り扱う例を SyntaxReaderによる順次解析に置いてあります。
symphonieで用意されるその他の解析法
SyntaxReaderの他、symphonieには
(1)構文木をXML-DOMで得る機構、
SyntaxDomsyntax=new SyntaxDom(); syntax.readSyntaxFile("syntaxDef.sn","utf-8"); Document doc= syntax.parseFile("text.txt","utf-8",SyntaxReader.NO_INDENT);
(2)XML文字列やjson文字列で得る機構
SyntaxConvertersyntax=new SyntaxConverter(); syntax.readSyntaxFile("syntaxDef.sn","utf-8"); String xmlStr = syntax.parseFile("text.txt","utf-8",syntax.AS_XML); String jsonStr= syntax.parseFile("text.txt","utf-8",syntax.AS_JSON);
(3)解析し、構文木を表示させるコマンド
java -jar symphonie.jar syntax-check -syntax syntaxDef.sn -source text.txt -encoding utf-8
(4)構文解析アプレット
<!-- in HTML -->
<applet id="app" archive="symphonie.jar"
code="otsu.symphonie.SymphonieApp" ...>
<script type="text/javascript>
var syntax="... 構文定義 ...";
var text="... 解析したい文 ...";
app.readSyntaxString(syntax);
var xml=app.parseString(text,"te");
</script>
も用意してあります。
内部クラス
SyntaxReaderは幾つかの内部クラスにより処理を進めます。
通常は意識する必要はありませんが、構文エラー検出時にこれらの クラスがExceptionを投げます。
| クラス名 | 説明 | |
| SyntaxReaderEngine | 構文の候補管理を行います | |
| SyntaxDef | 構文情報読み込み後、参照解決を行います。 | |
| SyntaxDefReaderHi | SNで書かれた構文情報を読み込みます。歴史的理由でHiと 名付けられています。 | |
| TokenReaderEngine | トークン読み込みを行います。 |
| 修飾子とタイプ | フィールドと説明 |
|---|---|
static int |
AS_JSON
json文字列を得る
|
static int |
AS_XML
xml文字列を得る(デフォルト)
|
static int |
END_AT_EOF
EOFを予期していることを示す.
|
static int |
NO_INDENT
インデントを付けない
|
static int |
SKIP
指定データまでスキップする指定.
|
| コンストラクタと説明 |
|---|
SyntaxReader()
構文情報も解析文もセットされていないSyntaxReaderを作成します。
|
SyntaxReader(String syntaxFileName_)
構文定義ファイルを読み込む.
|
SyntaxReader(String syntaxFileName_,
String charSet_)
構文定義ファイルを文字コード指定で読み込む.
|
| 修飾子とタイプ | メソッドと説明 |
|---|---|
void |
parse(BufferedReader br_)
解析すべき入力を設定する.
|
void |
parse(String fileName_)
解析すべき入力ファイルを設定する.
|
void |
parse(String fileName_,
String charSet_)
解析すべき入力ファイルを設定する.
|
void |
parseFile(String fileName_)
解析すべき入力ファイルを設定する.
|
void |
parseFile(String fileName_,
String charSet_)
解析すべき入力ファイルを設定する.
|
void |
parseString(ArrayList<String> text_)
解析すべき文字列を設定する.
|
void |
parseString(String text_)
解析すべき文字列を設定する.
|
void |
parseString(String[] text_)
解析すべき文字列を設定する.
|
void |
printCurrent(PrintStream ps_)
現状の文法候補情報を印刷する
|
void |
printCurrent(PrintWriter ps_)
現状の文法候補情報を印刷する
|
void |
printSyntax(PrintStream ps_)
構文情報を印刷する
|
void |
printSyntax(PrintWriter ps_)
構文情報を印刷する
|
void |
printSyntaxDict(PrintStream ps_)
構文情報(定義別)を印刷する
|
void |
printSyntaxDict(PrintWriter ps_)
構文情報(定義別)を印刷する
|
void |
printTokenPriority(PrintStream ps_)
トークンの優先情報を印刷する
|
void |
printTokenPriority(PrintWriter ps_)
トークンの優先情報を印刷する
|
void |
printTokens(PrintStream ps_)
トークンの優先情報を印刷する
|
void |
printTokens(PrintWriter ps_)
トークンの優先情報を印刷する
|
void |
push(SyntaxElement elm_)
構文要素を戻す。
|
SyntaxElement |
read()
構文要素を読む.EOFはExceptionとなる
|
SyntaxElement |
read(long option_)
構文要素を読む。
|
SyntaxElement |
read(SyntaxElement elm_)
構文要素を読む.EOFはExceptionとなる
|
boolean |
read(SyntaxElement elm_,
long option_)
構文要素を読む。
|
SyntaxElement |
readBegin()
開始要素を読む。
|
SyntaxElement |
readBegin(String name_)
開始要素を指定して読む。
|
SyntaxElement |
readBegin(SyntaxElement elm_)
開始要素を読む。
|
SyntaxElement |
readBegin(SyntaxElement elm_,
String name_)
開始要素を指定して読む。
|
SyntaxElement |
readEnd()
終了要素を読む。
|
SyntaxElement |
readEnd(String name_)
指定終了要素を読む。
|
SyntaxElement |
readEnd(SyntaxElement elm_)
終了要素を読む。
|
SyntaxElement |
readEnd(SyntaxElement elm_,
String name_)
指定終了要素を読む。
|
SyntaxElement |
readNotEnd(SyntaxElement elm_)
終了以外を読む。
|
void |
readResSyntaxFile(Class class_,
String fileName_)
ファイル名を指定してリソース上の標準構文定義ファイルを読み込む.
|
void |
readResSyntaxFile(String fileName_)
ファイル名を指定してリソース上の標準構文定義ファイルを読み込む.
|
void |
readResSyntaxFile(String fileName_,
String charSet_)
ファイル名を指定してリソース上の標準構文定義ファイルを読み込む.
|
void |
readResSyntaxObjectFile(Class class_,
String objFile_)
リソース上の構文定義オブジェクトを読み込む
|
void |
readResSyntaxObjectFile(String objFile_)
リソース上の構文定義オブジェクトを読み込む
|
void |
readSyntax(BufferedReader rd_)
オープンされているテキスト入力機を用いて構文定義を読み込む.
|
void |
readSyntax(String fileName_)
ファイル名を指定して標準構文定義ファイルを読み込む.
|
void |
readSyntax(String fileName_,
String charSet_)
ファイル名、文字セット名を指定して標準構文定義ファイルを読み込む.
|
void |
readSyntaxFile(Class class_,
String fileName_,
String charSet_)
ファイル名を指定してリソース上の標準構文定義ファイルを読み込む.
|
void |
readSyntaxFile(String fileName_)
ファイル名を指定して標準構文定義ファイルを読み込む.
|
void |
readSyntaxFile(String fileName_,
String charSet_)
ファイル名を指定して標準構文定義ファイルを読み込む.
|
void |
readSyntaxObject(ObjectInputStream ois_)
構文定義オブジェクトを読み込む
|
void |
readSyntaxObjectFile(String objFile_)
構文定義オブジェクトを読み込む
|
void |
readSyntaxString(String syntax_)
Stringにセットされている構文定義を読み込む.
|
void |
readSyntaxString(String[] syntax_)
Stringにセットされている構文定義を読み込む。
|
SyntaxElement |
readToken(String name_)
トークン名を指定して読む。
|
SyntaxElement |
readToken(SyntaxElement elm_)
トークンを読む。
|
SyntaxElement |
readToken(SyntaxElement elm_,
String name_)
トークン名を指定して読む。
|
int |
readType(SyntaxElement elm_)
構文要素を読む.EOFはExceptionとなる
|
int |
readType(SyntaxElement elm_,
long option_)
構文要素を読む。
|
void |
restart()
構文定義を残し、解析状態をリセットする。
|
void |
setSourceName(String textSourceName_)
解析されるソース名を設定する.
|
void |
setSyntaxSourceName(String syntaxSourceName_)
構文定義ソース名を設定する.
|
void |
setTokenHook(TokenHook_if hook_)
解析途中のトークン読み取り部で、情報をフックする.
|
void |
skip()
現構文階層のENDまでスキップする.
|
void |
skip(int n_)
指定階層のENDまでスキップ
|
void |
skip(SyntaxElement elm_)
現構文階層のENDまでスキップする.
|
void |
skip(SyntaxElement elm_,
int nest_)
指定階層のENDまでスキップ
|
void |
tokenAsBeginEnd(boolean yes_)
トークンをBEGIN,ENDで通知する.
|
boolean |
tryReadBegin(String name_)
開始要素を指定して読む。
|
boolean |
tryReadBegin(String name_,
long option_)
開始要素を指定して読む。
|
boolean |
tryReadBegin(SyntaxElement elm_)
開始要素を読む。
|
boolean |
tryReadBegin(SyntaxElement elm_,
String name_)
開始要素を指定して読む。
|
boolean |
tryReadBegin(SyntaxElement elm_,
String name_,
long option_)
開始要素を指定して読む。
|
boolean |
tryReadBeginEnd(String name_)
開始要素を指定して読む。
|
boolean |
tryReadBeginEnd(SyntaxElement elm_,
String name_)
開始要素を指定して読む。
|
boolean |
tryReadEnd(SyntaxElement elm_)
終了要素を読む.
|
boolean |
tryReadEnd(SyntaxElement elm_,
String name_)
指定終了要素を読む
終了要素でない場合偽が返る。
|
boolean |
tryReadNotEnd(SyntaxElement elm_)
終了以外を読む。
|
boolean |
tryReadToken(SyntaxElement elm_)
トークンを読む。
|
boolean |
tryReadToken(SyntaxElement elm_,
String name_)
トークン名を指定して読む。
|
boolean |
tryReadToken(SyntaxElement elm_,
String name_,
long option_)
トークン名を指定して読む。
|
void |
writeSyntaxObject(ObjectOutputStream oos_)
構文定義オブジェクトを書き出す
|
void |
writeSyntaxObjectFile(String fileName_)
構文定義オブジェクトを書き出す
|
public static final int END_AT_EOF
read系のAPIでこの指定をすると、データ先頭でEOFとなった場合
EOFデータまたは偽を返します。
この指定が無い場合はUnexpectedEOFExceptionまたはEOFException
となります。
public static final int SKIP
public static final int NO_INDENT
public static final int AS_JSON
public static final int AS_XML
public SyntaxReader()
public SyntaxReader(String syntaxFileName_) throws Exception
syntaxFileName_ - 構文定義ファイル名Exception - 失敗public void readSyntax(String fileName_) throws Exception
fileName_ - 構文定義ファイル名Exception - 読み込み/解析失敗public void readSyntaxFile(String fileName_) throws Exception
fileName_ - 構文定義ファイル名Exception - 読み込み/解析失敗public void readSyntax(String fileName_, String charSet_) throws Exception
fileName_ - 構文定義ファイル名charSet_ - 文字セット名Exception - 読み込み/解析失敗public void readSyntaxFile(String fileName_, String charSet_) throws Exception
fileName_ - 構文定義ファイル名charSet_ - 文字セット名Exception - 読み込み/解析失敗public void readResSyntaxFile(String fileName_) throws Exception
fileName_ - 構文定義ファイル名Exception - 読み込み/解析失敗public void readResSyntaxFile(String fileName_, String charSet_) throws Exception
fileName_ - 構文定義ファイル名charSet_ - 文字セット名Exception - 読み込み/解析失敗public void readResSyntaxFile(Class class_, String fileName_) throws Exception
class_ - リソースの代表クラスfileName_ - 構文定義ファイル名Exception - 読み込み/解析失敗public void readSyntaxFile(Class class_, String fileName_, String charSet_) throws Exception
class_ - リソースの代表クラスfileName_ - 構文定義ファイル名charSet_ - 文字セット名Exception - 読み込み/解析失敗public void readSyntaxObjectFile(String objFile_) throws Exception
objFile_ - オブジェクトファイルException - 読み込み/解析失敗public void readResSyntaxObjectFile(String objFile_) throws Exception
objFile_ - オブジェクトファイルException - 読み込み/解析失敗public void readResSyntaxObjectFile(Class class_, String objFile_) throws Exception
class_ - リソースの代表クラスobjFile_ - オブジェクトファイルException - 読み込み/解析失敗public void readSyntax(BufferedReader rd_) throws Exception
rd_ - テキスト入力機Exception - 読み込み/解析失敗public void readSyntaxString(String syntax_) throws Exception
SN形式(SymphonicNotation) の構文定義を読み込みます。
syntax_ - 構文定義Exception - 解析失敗public void readSyntaxString(String[] syntax_) throws Exception
SN形式(SymphonicNotation)
の構文定義を読み込みます。
配列の各要素は行と見なされます。文字列自体には改行コードは
不要です。
syntax_ - 構文定義Exception - 解析失敗public void setSyntaxSourceName(String syntaxSourceName_) throws Exception
syntaxSourceName_ - ソース名Exception - 設定失敗public void restart()
public void setSourceName(String textSourceName_) throws Exception
ソース名を与えないparseで仮のソース名を設定します。エラー時には この名前が出ます。必須ではありません。
textSourceName_ - ソース名Exception - 設定失敗public void parse(BufferedReader br_) throws Exception
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
br_ - テキスト入力機Exception - 解析失敗public void parse(String fileName_) throws Exception
ファイルはこの関数の中でオープンされます。
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
fileName_ - ファイル名Exception - 読み込み/解析失敗public void parse(String fileName_, String charSet_) throws Exception
ファイルはこの関数の中でオープンされます。
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
fileName_ - ファイル名charSet_ - 文字セットException - 読み込み/解析失敗public void parseFile(String fileName_) throws Exception
ファイルはこの関数の中でオープンされます。
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
fileName_ - ファイル名Exception - 読み込み/解析失敗public void parseFile(String fileName_, String charSet_) throws Exception
ファイルはこの関数の中でオープンされます。
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
fileName_ - ファイル名charSet_ - 文字セットException - 読み込み/解析失敗public void parseString(String text_) throws Exception
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
一旦行分解を行って解析します。改行コードは"\n"に置き換えて解析されます。
text_ - 解析する文字列Exception - 解析失敗public void parseString(String[] text_) throws Exception
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
配列の各要素は行と見なされます。文字列自体に改行コードは不要です。
各行データには改行コード"\n"が最後に付加されます。行内に改行コード
がある場合、複合行として取り扱われます。
行、改行コードの取り扱い参照。
text_ - 解析する文字列Exception - 解析失敗public void parseString(ArrayList<String> text_) throws Exception
この関数は直ちにリターンします。
この後readBegin(String)などを呼び出してください。
配列の各要素は行と見なされます。文字列自体に改行コードは不要です。
各行データには改行コード"\n"が最後に付加されます。行内に改行コード
がある場合、複合行として取り扱われます。
行、改行コードの取り扱い参照。
text_ - 解析する文字列Exception - 解析失敗public void setTokenHook(TokenHook_if hook_)
hook_ - TokenHook_ifの実装オブジェクトpublic SyntaxElement read(SyntaxElement elm_) throws Exception
elm_ - このElementに情報を得るException - EOF/解析失敗public boolean read(SyntaxElement elm_, long option_) throws Exception
elm_ - このElementに情報を得るoption_ - オプションException - EOF/解析失敗public SyntaxElement read(long option_) throws Exception
option_ - オプションException - EOF/解析失敗public SyntaxElement read() throws Exception
Exception - EOF/解析失敗public int readType(SyntaxElement elm_) throws Exception
elm_ - このElementに情報を得るException - EOF/解析失敗public int readType(SyntaxElement elm_, long option_) throws Exception
elm_ - このElementに情報を得るoption_ - オプションException - EOF/解析失敗public SyntaxElement readBegin(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public SyntaxElement readBegin() throws Exception
Exception - 解析失敗public boolean tryReadBegin(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public SyntaxElement readBegin(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名Exception - 解析失敗public SyntaxElement readBegin(String name_) throws Exception
name_ - 構文要素名Exception - 解析失敗public boolean tryReadBegin(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名Exception - 解析失敗public boolean tryReadBeginEnd(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名Exception - 解析失敗public boolean tryReadBegin(SyntaxElement elm_, String name_, long option_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名option_ - オプションException - 解析失敗public boolean tryReadBegin(String name_) throws Exception
name_ - 構文要素名Exception - 解析失敗public boolean tryReadBeginEnd(String name_) throws Exception
name_ - 構文要素名Exception - 解析失敗public boolean tryReadBegin(String name_, long option_) throws Exception
name_ - 構文要素名option_ - オプションException - 解析失敗public SyntaxElement readToken(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - トークン名Exception - 解析失敗public SyntaxElement readToken(String name_) throws Exception
name_ - トークン名Exception - 解析失敗public SyntaxElement readToken(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public boolean tryReadToken(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public boolean tryReadToken(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - トークン名Exception - 解析失敗public boolean tryReadToken(SyntaxElement elm_, String name_, long option_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - トークン名option_ - オプションException - 解析失敗public SyntaxElement readNotEnd(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public boolean tryReadNotEnd(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public SyntaxElement readEnd() throws Exception
Exception - 解析失敗public SyntaxElement readEnd(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public SyntaxElement readEnd(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名Exception - 解析失敗public boolean tryReadEnd(SyntaxElement elm_) throws Exception
elm_ - 情報を受け取るSyntaxElementException - 解析失敗public boolean tryReadEnd(SyntaxElement elm_, String name_) throws Exception
elm_ - 情報を受け取るSyntaxElementname_ - 構文要素名Exception - 解析失敗public SyntaxElement readEnd(String name_) throws Exception
name_ - 要素名Exception - 解析失敗public void skip(SyntaxElement elm_) throws Exception
elm_ - END情報を取り込むSyntaxElementException - 解析失敗public void skip(int n_)
throws Exception
n_ - 階層(1なら現階層、2以上ならより浅い階層まで読み飛ばす)Exception - 解析失敗public void skip(SyntaxElement elm_, int nest_) throws Exception
elm_ - END情報を取り込むSyntaxElementnest_ - 階層(1なら現階層、2以上ならより浅い階層まで読み飛ばす)Exception - 解析失敗public void push(SyntaxElement elm_) throws Exception
elm_ - 書き戻すSyntaxElementException - 解析失敗public void tokenAsBeginEnd(boolean yes_)
通常はトークンはtype=SyntaxElement.TOKENで1回で通知されますが この指定をすると、BEGIN/ENDで通知されます。
yes_ - trueなら以後トークンをBEGIN/ENDで通知する形となります。public void printSyntax(PrintWriter ps_)
ps_ - 印刷ストリームpublic void printSyntax(PrintStream ps_)
ps_ - 印刷ストリームpublic void printCurrent(PrintStream ps_)
ps_ - 印刷ストリームpublic void printCurrent(PrintWriter ps_)
ps_ - 印刷ストリームpublic void printSyntaxDict(PrintStream ps_)
ps_ - 印刷ストリームpublic void printSyntaxDict(PrintWriter ps_)
ps_ - 印刷ストリームpublic void printTokenPriority(PrintStream ps_)
ps_ - 印刷ストリームpublic void printTokenPriority(PrintWriter ps_)
ps_ - 印刷ストリームpublic void printTokens(PrintStream ps_)
ps_ - 印刷ストリームpublic void printTokens(PrintWriter ps_)
ps_ - 印刷ストリームpublic void writeSyntaxObject(ObjectOutputStream oos_) throws Exception
oos_ - 出力用ストリームException - 失敗public void writeSyntaxObjectFile(String fileName_) throws Exception
fileName_ - 出力用ファイル名Exception - 失敗public void readSyntaxObject(ObjectInputStream ois_) throws Exception
ois_ - 入力用ストリームException - 失敗