1 // 字句解析された字句より、datum を構築するparserを提供します。
2 // 外部には以下のインターフェースのみが提供されています。
3 // utakata::parser::DatumParser -- datum syntaxの構文解析結果を返却します。
5 // 返却されるのは、単純なdatumとbinary treeで構築された構文木が返却されます。
6 #ifndef _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
7 #define _UTAKATA_SRC_PARSER_DATUM_PARSER_H_
13 #include "lib/smart_ptr.h"
14 #include "lib/scoped_ptr.h"
15 #include "lib/binary_tree.h"
39 } // end of namespace detail
41 // 渡されたreaderから、lexerに基づいてdatumを構築し、返却します。n
42 // parse時に構文違反が発生したデータについては、GetSyntaxErrorから、
43 // 構文違反が発生したDatumとエラー情報をまとめたSyntaxError構造体を
45 // DatumParser自身からは例外が発生することはありません。
48 DatumParser() : use_lexer_() {}
49 virtual ~DatumParser() {}
51 // 渡されたreaderから、datum syntaxに基づいて変換された構文木を返却
53 // 返却された構文木は、呼出元において解体責任が生じます。
54 // 呼出元は、scoped_ptr等を利用して返されたポインタを保持するべきです。
55 // 内部にてなんらかのエラーが発生した場合、構文違反が発生します。
56 // また、何らかのエラーが発生した場合、返り値はNULLが返却されます。
57 parser::DatumTree* Parse(reader::EncodingReader* reader);
59 // 渡されたILexerCreatorを用いて、利用するLexerを設定します。
60 void SetLexerWithCreator(const lexer::ILexerCreator& creator);
62 // 構文違反が発生した場合に限り、作成されたSyntaxErrorが新規に作成されて
64 // 構文違反が発生していない場合、常にis_nullがtrueを返すsmart_ptrを
66 const akebono::smart_ptr<parser::SyntaxError>& GetSyntaxError() const {
70 // 現在構文エラー情報を保持しているかどうかを返却します。
71 bool HasSyntaxError() const {return syntax_error_.is_null();}
75 // Parseの内部詳細を実装する関数です。実際の解析はこの関数内で行われます。
76 // datumの解析時に構文異常などが発生した場合、falseを返却します。
77 bool ParseDetail(const lexer::Token& token, DatumTree* target_tree);
79 // 内部で利用されるlexerを保存します。保存されるlexerは、set_lexer_creator
80 // によって新しいLexerCreatorが設定される度に更新されます。
81 akebono::scoped_ptr<lexer::IPartOfLexer> use_lexer_;
83 // 構文異常などが発生した場合に作成される、構文異常用のオブジェクトです。
84 akebono::smart_ptr<parser::SyntaxError> syntax_error_;
86 // 現在のParserの内部表現を保有し、各状態における処理を行う
88 akebono::scoped_ptr<parser::detail::IParserState> current_state_;
94 #endif /* _UTAKATA_SRC_PARSER_DATUM_PARSER_H_ */