};
namespace lexer {
-class ILexerCreater;
+class ILexerCreator;
+class IPartOfLexer;
};
namespace reader {
namespace parser {
class SyntaxError;
+class DatumTree;
+
+namespace detail {
+class IParserState;
+} // end of namespace detail
// 渡されたreaderから、lexerに基づいてdatumを構築し、返却します。n
// parse時に構文違反が発生したデータについては、GetSyntaxErrorから、
// 呼出元は、scoped_ptr等を利用して返されたポインタを保持するべきです。
// 内部にてなんらかのエラーが発生した場合、構文違反が発生します。
// また、何らかのエラーが発生した場合、返り値はNULLが返却されます。
- akebono::binary_tree<datum::IDatumBase>* Parse(reader::EncodingReader* reader);
+ parser::DatumTree* Parse(reader::EncodingReader* reader);
// 渡されたILexerCreatorを用いて、利用するLexerを設定します。
- void SetLexerWithCreator(const ILexerCreator& creator);
+ void SetLexerWithCreator(const lexer::ILexerCreator& creator);
// 構文違反が発生した場合に限り、作成されたSyntaxErrorが新規に作成されて
// 返却されます。
// 構文違反が発生していない場合、常にis_nullがtrueを返すsmart_ptrを
// 返却します。
- const parser::SyntaxError& GetSyntaxError() const {
- return *syntax_error_;
+ const akebono::smart_ptr<parser::SyntaxError>& GetSyntaxError() const {
+ return syntax_error_;
}
+ // 現在構文エラー情報を保持しているかどうかを返却します。
+ bool HasSyntaxError() const {return syntax_error_.is_null();}
+
private:
+
+ // Parseの内部詳細を実装する関数です。実際の解析はこの関数内で行われます。
+ // datumの解析時に構文異常などが発生した場合、falseを返却します。
+ bool ParseDetail(const lexer::Token& token, DatumTree* target_tree);
+
// 内部で利用されるlexerを保存します。保存されるlexerは、set_lexer_creator
// によって新しいLexerCreatorが設定される度に更新されます。
akebono::scoped_ptr<lexer::IPartOfLexer> use_lexer_;
+ // 構文異常などが発生した場合に作成される、構文異常用のオブジェクトです。
akebono::smart_ptr<parser::SyntaxError> syntax_error_;
+
+ // 現在のParserの内部表現を保有し、各状態における処理を行う
+ // インターフェースの実装を保持します。
+ akebono::scoped_ptr<parser::detail::IParserState> current_state_;
};
}