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_JSONjson文字列を得る | 
| static int | AS_XMLxml文字列を得る(デフォルト) | 
| static int | END_AT_EOFEOFを予期していることを示す. | 
| 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 - 失敗