OSDN Git Service

parser_testをDatumParserに対応。
[simplecms/utakata.git] / src / parser / datum_parser.h
index 1033b28..87d4bf0 100755 (executable)
@@ -21,7 +21,8 @@ class IDatumBase;
 };
 
 namespace lexer {
-class ILexerCreater;
+class ILexerCreator;
+class IPartOfLexer;
 };
 
 namespace reader {
@@ -31,6 +32,11 @@ class EncodingReader;
 namespace parser {
 
 class SyntaxError;
+class DatumTree;
+
+namespace detail {
+class IParserState;
+} // end of namespace detail
 
 // 渡されたreaderから、lexerに基づいてdatumを構築し、返却します。n
 // parse時に構文違反が発生したデータについては、GetSyntaxErrorから、
@@ -48,25 +54,38 @@ class DatumParser {
   // 呼出元は、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_;
 };
 
 }