OSDN Git Service

fix ticket #18663
[yamy/yamy.git] / parser.h
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
2 // parser.h\r
3 \r
4 \r
5 #ifndef _PARSER_H\r
6 #  define _PARSER_H\r
7 \r
8 #  include "misc.h"\r
9 #  include "stringtool.h"\r
10 #  include <vector>\r
11 \r
12 \r
13 ///\r
14 class Token\r
15 {\r
16 public:\r
17         ///\r
18         enum Type {\r
19                 Type_string,                            ///\r
20                 Type_number,                            ///\r
21                 Type_regexp,                            ///\r
22                 Type_openParen,                         ///\r
23                 Type_closeParen,                                ///\r
24                 Type_comma,                                     ///\r
25         };\r
26 \r
27 private:\r
28         u_char m_type;                          ///\r
29         bool m_isValueQuoted;                           ///\r
30         int m_numericValue;                             ///\r
31         tstringi m_stringValue;                 ///\r
32         long m_data;                                    ///\r
33 \r
34 public:\r
35         ///\r
36         Token(const Token &i_token);\r
37         ///\r
38         Token(int i_value, const tstringi &i_display);\r
39         ///\r
40         Token(const tstringi &i_value, bool i_isValueQuoted,\r
41                   bool i_isRegexp = false);\r
42         ///\r
43         Token(Type i_type);\r
44 \r
45         /// is the value quoted ?\r
46         bool isQuoted() const {\r
47                 return m_isValueQuoted;\r
48         }\r
49 \r
50         /// value type\r
51         Type getType() const {\r
52                 return static_cast<Type>(m_type);\r
53         }\r
54         ///\r
55         bool isString() const {\r
56                 return m_type == Type_string;\r
57         }\r
58         ///\r
59         bool isNumber() const {\r
60                 return m_type == Type_number;\r
61         }\r
62         ///\r
63         bool isRegexp() const {\r
64                 return m_type == Type_regexp;\r
65         }\r
66         ///\r
67         bool isOpenParen() const {\r
68                 return m_type == Type_openParen;\r
69         }\r
70         ///\r
71         bool isCloseParen() const {\r
72                 return m_type == Type_closeParen;\r
73         }\r
74         ///\r
75         bool isComma() const {\r
76                 return m_type == Type_comma;\r
77         }\r
78 \r
79         /// get numeric value\r
80         int getNumber() const;\r
81 \r
82         /// get string value\r
83         tstringi getString() const;\r
84 \r
85         /// get regexp value\r
86         tstringi getRegexp() const;\r
87 \r
88         /// get data\r
89         long getData() const {\r
90                 return m_data;\r
91         }\r
92         ///\r
93         void setData(long i_data) {\r
94                 m_data = i_data;\r
95         }\r
96 \r
97         /// case insensitive equal\r
98         bool operator==(const tstringi &i_str) const {\r
99                 return *this == i_str.c_str();\r
100         }\r
101         ///\r
102         bool operator==(const _TCHAR *i_str) const;\r
103         ///\r
104         bool operator!=(const tstringi &i_str) const {\r
105                 return *this != i_str.c_str();\r
106         }\r
107         ///\r
108         bool operator!=(const _TCHAR *i_str) const {\r
109                 return !(*this == i_str);\r
110         }\r
111 \r
112         /** paren equal\r
113             @param i_c '<code>(</code>' or '<code>)</code>' */\r
114         bool operator==(const _TCHAR i_c) const;\r
115         /** paren equal\r
116             @param i_c '<code>(</code>' or '<code>)</code>' */\r
117         bool operator!=(const _TCHAR i_c) const {\r
118                 return !(*this == i_c);\r
119         }\r
120 \r
121         /// add string\r
122         void add(const tstringi &i_str);\r
123 \r
124         /// stream output\r
125         friend tostream &operator<<(tostream &i_ost, const Token &i_token);\r
126 };\r
127 \r
128 \r
129 ///\r
130 class Parser\r
131 {\r
132 public:\r
133         ///\r
134         typedef std::vector<Token> Tokens;\r
135 \r
136 private:\r
137         ///\r
138         typedef std::vector<tstringi> Prefixes;\r
139 \r
140 private:\r
141         size_t m_lineNumber;                            /// current line number\r
142         const Prefixes *m_prefixes;                     /** string that may be prefix\r
143                                                     of a token */\r
144 \r
145         size_t m_internalLineNumber;                    /// next line number\r
146         const _TCHAR *m_ptr;                            /// read pointer\r
147         const _TCHAR *m_end;                            /// end pointer\r
148 \r
149 private:\r
150         /// get a line\r
151         bool getLine(tstringi *o_line);\r
152 \r
153 public:\r
154         ///\r
155         Parser(const _TCHAR *i_str, size_t i_length);\r
156 \r
157         /** get a parsed line.  if no more lines exist, returns false */\r
158         bool getLine(Tokens *o_tokens);\r
159 \r
160         /// get current line number\r
161         size_t getLineNumber() const {\r
162                 return m_lineNumber;\r
163         }\r
164 \r
165         /** set string that may be prefix of a token.  prefix_ is not\r
166             copied, so it must be preserved after setPrefix() */\r
167         void setPrefixes(const Prefixes *m_prefixes);\r
168 };\r
169 \r
170 \r
171 #endif // !_PARSER_H\r