OSDN Git Service

parser_testをDatumParserに対応。
[simplecms/utakata.git] / src / parser / datum_parser.h
1 // 字句解析された字句より、datum を構築するparserを提供します。
2 // 外部には以下のインターフェースのみが提供されています。
3 // utakata::parser::DatumParser -- datum syntaxの構文解析結果を返却します。
4 //
5 // 返却されるのは、単純なdatumとbinary treeで構築された構文木が返却されます。
6 #ifndef _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
7 #define _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
8
9 #include <string>
10 #include <vector>
11 #include <map>
12
13 #include "lib/smart_ptr.h"
14 #include "lib/scoped_ptr.h"
15 #include "lib/binary_tree.h"
16
17 namespace utakata {
18
19 namespace datum {
20 class IDatumBase;
21 };
22
23 namespace lexer {
24 class ILexerCreator;
25 class IPartOfLexer;
26 };
27
28 namespace reader {
29 class EncodingReader;
30 };
31
32 namespace parser {
33
34 class SyntaxError;
35 class DatumTree;
36
37 namespace detail {
38 class IParserState;
39 } // end of namespace detail
40
41 // 渡されたreaderから、lexerに基づいてdatumを構築し、返却します。n
42 // parse時に構文違反が発生したデータについては、GetSyntaxErrorから、
43 // 構文違反が発生したDatumとエラー情報をまとめたSyntaxError構造体を
44 // 取得することができます。
45 // DatumParser自身からは例外が発生することはありません。
46 class DatumParser {
47  public:
48   DatumParser() : use_lexer_() {}
49   virtual ~DatumParser() {}
50
51   // 渡されたreaderから、datum syntaxに基づいて変換された構文木を返却
52   // します。
53   // 返却された構文木は、呼出元において解体責任が生じます。
54   // 呼出元は、scoped_ptr等を利用して返されたポインタを保持するべきです。
55   // 内部にてなんらかのエラーが発生した場合、構文違反が発生します。
56   // また、何らかのエラーが発生した場合、返り値はNULLが返却されます。
57   parser::DatumTree* Parse(reader::EncodingReader* reader);
58
59   // 渡されたILexerCreatorを用いて、利用するLexerを設定します。
60   void SetLexerWithCreator(const lexer::ILexerCreator& creator);
61
62   // 構文違反が発生した場合に限り、作成されたSyntaxErrorが新規に作成されて
63   // 返却されます。
64   // 構文違反が発生していない場合、常にis_nullがtrueを返すsmart_ptrを
65   // 返却します。
66   const akebono::smart_ptr<parser::SyntaxError>& GetSyntaxError() const {
67     return syntax_error_;
68   }
69
70   // 現在構文エラー情報を保持しているかどうかを返却します。
71   bool HasSyntaxError() const {return syntax_error_.is_null();}
72
73  private:
74
75   // Parseの内部詳細を実装する関数です。実際の解析はこの関数内で行われます。
76   // datumの解析時に構文異常などが発生した場合、falseを返却します。
77   bool ParseDetail(const lexer::Token& token, DatumTree* target_tree);
78
79   // 内部で利用されるlexerを保存します。保存されるlexerは、set_lexer_creator
80   // によって新しいLexerCreatorが設定される度に更新されます。
81   akebono::scoped_ptr<lexer::IPartOfLexer> use_lexer_;
82
83   // 構文異常などが発生した場合に作成される、構文異常用のオブジェクトです。
84   akebono::smart_ptr<parser::SyntaxError> syntax_error_;
85
86   // 現在のParserの内部表現を保有し、各状態における処理を行う
87   // インターフェースの実装を保持します。
88   akebono::scoped_ptr<parser::detail::IParserState> current_state_;
89 };
90
91 }
92 }
93
94 #endif /* _UTAKATA_SRC_PARSER_DATUM_PARSER_H_ */