OSDN Git Service

syntax-treeの書き直しが概ね完了した。伴って、syntax_tree_test、及びparser_testの書き直しも行い、
[simplecms/utakata.git] / parser.h
1 #ifndef _PARSER_H_
2 #define _PARSER_H_
3
4 #include <string>
5 #include <vector>
6 #include <map>
7
8 #include "smart_ptr.h"
9 #include "parser_handler.h"
10 #include "parser_status.h"
11
12 namespace utakata {
13
14     namespace syntax {
15         class Tree;
16         class DatumID;
17     };
18
19     namespace lexer {
20         class Lexer;
21     };
22
23     namespace utf8 {
24         class UTF8InputStream;
25     };
26
27     namespace literal {
28         class Literal;
29     };
30
31     namespace parser {
32     
33         class DatumException : public std::exception
34         {
35         public:
36             DatumException(std::string str);
37             virtual ~DatumException() throw() {}
38             const char* what() const throw();
39
40         private:
41
42             std::string str_;
43         };
44
45         class Parser
46         {
47             // lexerを受け取り、lexerが保持する全体の解析を行いつつ、
48             // 実行を行う。
49             // 実行は、基本的に全体を読み込み、全体を保持した状態で行う。
50             
51         public:
52             
53             Parser(smart_ptr<lexer::Lexer> l);
54             virtual ~Parser() {}
55
56             // 受け取ったlexerからの字句の取得を行い、解析を行なう。
57             // 成功した場合には、先頭から順番にdatumとして読み込んだObjectの
58             // vectorを返す。
59             // 致命的なエラーが発生した場合には例外を返す。
60             smart_ptr<syntax::Tree> parse(smart_ptr<utf8::UTF8InputStream>& strm);
61
62         private:
63             smart_ptr<lexer::Lexer> lexer_;
64             // 各PARSERSTATUSに関連づけられたParserHandlerのmap
65             std::map<PARSERSTATUS, smart_ptr<IParserHandler> > handler_;
66         };
67
68         // 渡したlexemeがAbbrevationであるかどうかを調べる。
69         bool isAbbrev(smart_ptr<lexeme::ILexeme> l);
70
71         syntax::DatumID toDatumType(lexeme::LexemeID id);
72
73         // 各ハンドラの定義。
74
75         class InitHandler : public IParserHandler
76         {
77             // PS_INITに対応するハンドラ
78         public:
79             InitHandler() {}
80             virtual ~InitHandler() {}
81
82         private:
83
84             bool exec_(HandlerData &data);
85
86         };
87
88         // <list>に対応するものだけは、carとcdrでハンドラが分離している。
89         class ListCarHandler : public IParserHandler
90         {
91             // PS_LIST_CARである間に対応するハンドラ
92         public:
93             ListCarHandler() {}
94             virtual ~ListCarHandler() {}
95
96         private:
97
98             bool exec_(HandlerData& data);
99
100         };
101
102         
103         class ListCdrHandler : public IParserHandler
104         {
105             // PS_LIST_CDRである間に対応するハンドラ
106         public:
107             ListCdrHandler() {}
108             virtual ~ListCdrHandler() {}
109
110         private:
111
112             bool exec_(HandlerData& data);
113
114         };
115
116
117         class DotHandler : public IParserHandler
118         {
119             // PS_AFTER_DOTに対応するハンドラ
120         public:
121             DotHandler() {}
122             virtual ~DotHandler() {}
123
124         private:
125
126             bool exec_(HandlerData& data);
127
128         };
129
130         // <list>に対応するものだけは、carとcdrでハンドラが分離している。
131         class DotEndHandler : public IParserHandler
132         {
133             // PS_END_DOTに対応するハンドラ。
134         public:
135             DotEndHandler() {}
136             virtual ~DotEndHandler() {}
137
138         private:
139
140             bool exec_(HandlerData& data);
141
142         };
143
144
145         class AbbrevHandler : public IParserHandler
146         {
147             // PS_ABBREVIATIONに対応するハンドラ
148         public:
149             AbbrevHandler() {}
150             virtual ~AbbrevHandler() {}
151
152         private:
153
154             bool exec_(HandlerData& data);
155
156         };
157
158         class ErrorHandler : public IParserHandler
159         {
160             // PS_ERRORをハンドリングする。実際にはエラーを通告する
161             // のみ。
162         public:
163             ErrorHandler() {}
164             virtual ~ErrorHandler() {}
165             
166         private:
167
168             bool exec_(HandlerData& data);
169
170         };
171
172     };
173
174 };
175
176 #endif /* _PARSER_h_ */