9 #include "parser_handler.h"
10 #include "parser_status.h"
24 class UTF8InputStream;
33 class DatumException : public std::exception
36 DatumException(std::string str);
37 virtual ~DatumException() throw() {}
38 const char* what() const throw();
47 // lexerを受け取り、lexerが保持する全体の解析を行いつつ、
49 // 実行は、基本的に全体を読み込み、全体を保持した状態で行う。
53 Parser(smart_ptr<lexer::Lexer> l);
56 // 受け取ったlexerからの字句の取得を行い、解析を行なう。
57 // 成功した場合には、先頭から順番にdatumとして読み込んだObjectの
59 // 致命的なエラーが発生した場合には例外を返す。
60 smart_ptr<syntax::Tree> parse(smart_ptr<utf8::UTF8InputStream>& strm);
63 smart_ptr<lexer::Lexer> lexer_;
64 // 各PARSERSTATUSに関連づけられたParserHandlerのmap
65 std::map<PARSERSTATUS, smart_ptr<IParserHandler> > handler_;
68 // 渡したlexemeがAbbrevationであるかどうかを調べる。
69 bool isAbbrev(smart_ptr<lexeme::ILexeme> l);
71 syntax::DatumID toDatumType(lexeme::LexemeID id);
75 class InitHandler : public IParserHandler
80 virtual ~InitHandler() {}
84 bool exec_(HandlerData &data);
88 // <list>に対応するものだけは、carとcdrでハンドラが分離している。
89 class ListCarHandler : public IParserHandler
91 // PS_LIST_CARである間に対応するハンドラ
94 virtual ~ListCarHandler() {}
98 bool exec_(HandlerData& data);
103 class ListCdrHandler : public IParserHandler
105 // PS_LIST_CDRである間に対応するハンドラ
108 virtual ~ListCdrHandler() {}
112 bool exec_(HandlerData& data);
117 class DotHandler : public IParserHandler
119 // PS_AFTER_DOTに対応するハンドラ
122 virtual ~DotHandler() {}
126 bool exec_(HandlerData& data);
130 // <list>に対応するものだけは、carとcdrでハンドラが分離している。
131 class DotEndHandler : public IParserHandler
133 // PS_END_DOTに対応するハンドラ。
136 virtual ~DotEndHandler() {}
140 bool exec_(HandlerData& data);
145 class AbbrevHandler : public IParserHandler
147 // PS_ABBREVIATIONに対応するハンドラ
150 virtual ~AbbrevHandler() {}
154 bool exec_(HandlerData& data);
158 class ErrorHandler : public IParserHandler
160 // PS_ERRORをハンドリングする。実際にはエラーを通告する
164 virtual ~ErrorHandler() {}
168 bool exec_(HandlerData& data);
176 #endif /* _PARSER_h_ */