public class SyntaxReader extends Object
構文定義に従い、入力文字列を解析します。
構文定義法、入力解析法などの総合的な説明を パッケージ otsu.symphonieの説明 で行ってありますので、まずご覧ください。
標準的使い方
次のような手順を踏みます。
read-APIで得られる情報はSyntaxElement
です。
SyntaxReader
sr =new SyntaxReader()
; //(1)SyntaxReader作成 sr.readSyntaxFile("syntaxDef.sn","utf-8")
; //(2)構文定義設定 sr.parse("text.txt");
//(3)入力設定SyntaxElement
eml=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で得る機構、
SyntaxDom
syntax=new SyntaxDom()
; syntax.readSyntaxFile("syntaxDef.sn","utf-8")
; Document doc= syntax.parseFile("text.txt","utf-8",SyntaxReader.NO_INDENT)
;
(2)XML文字列やjson文字列で得る機構
SyntaxConverter
syntax=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
- 失敗