Parse.cci
Go to the documentation of this file.
1 //
2 // Copyright (c) 2020 Fraunhofer Institute for Applied Information Technology (FIT)
3 // Network Research Group (NET)
4 // Schloss Birlinghoven, 53754 Sankt Augustin, GERMANY
5 // Contact: support@wiback.org
6 //
7 // This file is part of the SENF code tree.
8 // It is licensed under the 3-clause BSD License (aka New BSD License).
9 // See LICENSE.txt in the top level directory for details or visit
10 // https://opensource.org/licenses/BSD-3-Clause
11 //
12 
13 
14 /** \file
15  \brief Parse inline non-template implementation */
16 
17 // We do NOT want to include the complete parser definition into every other compilation unit
18 // (disabled) #include "Parse.ih"
19 
20 // Custom includes
21 #include <senf/Utils/senfassert.hh>
22 
23 #define prefix_ inline
24 //-/////////////////////////////////////////////////////////////////////////////////////////////////
25 
26 //-/////////////////////////////////////////////////////////////////////////////////////////////////
27 // senf::console::Token
28 
29 prefix_ std::string const & senf::console::Token::value()
30  const
31 {
32  return token_;
33 }
34 
35 prefix_ senf::console::Token::TokenType senf::console::Token::type()
36  const
37 {
38  return type_;
39 }
40 
41 prefix_ unsigned senf::console::Token::line()
42  const
43 {
44  return line_;
45 }
46 
47 prefix_ unsigned senf::console::Token::column()
48  const
49 {
50  return column_;
51 }
52 
53 prefix_ unsigned senf::console::Token::index()
54  const
55 {
56  return index_;
57 }
58 
59 prefix_ bool senf::console::Token::is(unsigned tokens)
60  const
61 {
62  return tokens & type_;
63 }
64 
65 prefix_ bool senf::console::Token::operator==(Token const & other)
66  const
67 {
68  return type() == other.type() && value() == other.value();
69 }
70 
71 prefix_ bool senf::console::Token::operator!=(Token const & other)
72  const
73 {
74  return ! operator==(other);
75 }
76 
77 prefix_ senf::console::Token::Token()
78  : type_ (None), token_ (), line_ (0), column_ (0), index_ (0)
79 {}
80 
81 prefix_ senf::console::Token::Token(TokenType type, std::string token)
82  : type_ (type), token_ (token), line_ (0), column_ (0), index_ (0)
83 {}
84 
85 prefix_ senf::console::Token senf::console::NoneToken()
86 {
87  return Token(Token::None,"");
88 }
89 
90 prefix_ senf::console::Token senf::console::PathSeparatorToken()
91 {
92  return Token(Token::PathSeparator,"/");
93 }
94 
95 prefix_ senf::console::Token senf::console::ArgumentGroupOpenToken()
96 {
97  return Token(Token::ArgumentGroupOpen,"(");
98 }
99 
100 prefix_ senf::console::Token senf::console::ArgumentGroupCloseToken()
101 {
102  return Token(Token::ArgumentGroupClose,")");
103 }
104 
105 prefix_ senf::console::Token senf::console::DirectoryGroupOpenToken()
106 {
107  return Token(Token::DirectoryGroupOpen,"{");
108 }
109 
110 prefix_ senf::console::Token senf::console::DirectoryGroupCloseToken()
111 {
112  return Token(Token::DirectoryGroupClose,"}");
113 }
114 
115 prefix_ senf::console::Token senf::console::CommandTerminatorToken()
116 {
117  return Token(Token::CommandTerminator,";");
118 }
119 
120 prefix_ senf::console::Token senf::console::OtherPunctuationToken(std::string const & value)
121 {
122  return Token(Token::OtherPunctuation, value);
123 }
124 
125 prefix_ senf::console::Token senf::console::BasicStringToken(std::string const & value)
126 {
127  return Token(Token::BasicString, value);
128 }
129 
130 prefix_ senf::console::Token senf::console::HexStringToken(std::string const & value)
131 {
132  return Token(Token::HexString, value);
133 }
134 
135 prefix_ senf::console::Token senf::console::WordToken(std::string const & value)
136 {
137  return Token(Token::Word, value);
138 }
139 
140 //-/////////////////////////////////////////////////////////////////////////////////////////////////
141 // senf::console::ParseCommandInfo
142 
143 prefix_ senf::console::ParseCommandInfo::ParseCommandInfo()
144  : builtin_ (NoBuiltin)
145 {}
146 
147 prefix_ senf::console::ParseCommandInfo::BuiltinCommand
148 senf::console::ParseCommandInfo::builtin()
149  const
150 {
151  return builtin_;
152 }
153 
154 prefix_ senf::console::ParseCommandInfo::TokensRange
155 senf::console::ParseCommandInfo::commandPath()
156  const
157 {
158  return boost::make_iterator_range(commandPath_.begin(), commandPath_.end());
159 }
160 
161 prefix_ senf::console::ParseCommandInfo::ArgumentsRange
162 senf::console::ParseCommandInfo::arguments()
163  const
164 {
165  return boost::make_iterator_range( ArgumentIterator(tokens_.begin()),
166  ArgumentIterator(tokens_.end()) );
167 }
168 
169 prefix_ senf::console::ParseCommandInfo::TokensRange senf::console::ParseCommandInfo::tokens()
170  const
171 {
172  return boost::make_iterator_range(tokens_.begin(), tokens_.end());
173 }
174 
175 prefix_ void senf::console::ParseCommandInfo::clear()
176 {
177  builtin_ = NoBuiltin;
178  commandPath_.clear();
179  tokens_.clear();
180 }
181 
182 prefix_ bool senf::console::ParseCommandInfo::empty()
183 {
184  return builtin_ == NoBuiltin && commandPath_.empty();
185 }
186 
187 prefix_ void senf::console::ParseCommandInfo::builtin(BuiltinCommand builtin)
188 {
189  builtin_ = builtin;
190 }
191 
192 prefix_ void
193 senf::console::ParseCommandInfo::command(std::vector<Token> & commandPath)
194 {
195  commandPath_.clear();
196  commandPath_.swap(commandPath);
197 }
198 
199 prefix_ void senf::console::ParseCommandInfo::addToken(Token const & token)
200 {
201  tokens_.push_back(token);
202 }
203 
204 //-/////////////////////////////////////////////////////////////////////////////////////////////////
205 // senf::console::ParseCommandInfo::ArgumentIterator
206 
207 prefix_ senf::console::ParseCommandInfo::ArgumentIterator::ArgumentIterator()
208 {}
209 
210 prefix_ senf::console::ParseCommandInfo::ArgumentIterator::
211 ArgumentIterator(ParseCommandInfo::TokensRange::iterator i)
212  : b_(i), e_(i)
213 {}
214 
215 prefix_ senf::console::ParseCommandInfo::ArgumentIterator::reference
216 senf::console::ParseCommandInfo::ArgumentIterator::dereference()
217  const
218 {
219  if (b_ == e_) setRange();
220  return b_->is(Token::ArgumentGroupOpen)
221  ? boost::make_iterator_range(boost::next(b_), boost::prior(e_))
222  : boost::make_iterator_range(b_, e_);
223 }
224 
225 prefix_ bool
226 senf::console::ParseCommandInfo::ArgumentIterator::equal(ArgumentIterator const & other)
227  const
228 {
229  return b_ == other.b_;
230 }
231 
232 prefix_ void senf::console::ParseCommandInfo::ArgumentIterator::increment()
233 {
234  if (b_ == e_) setRange();
235  b_ = e_;
236 }
237 
238 //-/////////////////////////////////////////////////////////////////////////////////////////////////
239 
240 prefix_ senf::console::CheckedArgumentIteratorWrapper::
241 CheckedArgumentIteratorWrapper(ParseCommandInfo::ArgumentsRange const & range,
242  std::string const & msg)
243  : i_ (range.begin()), e_ (range.end()), msg_ (msg)
244 {}
245 
246 prefix_ senf::console::CheckedArgumentIteratorWrapper::
247 CheckedArgumentIteratorWrapper(ParseCommandInfo::TokensRange const & range,
248  std::string const & msg)
249  : i_ (range.begin()), e_ (range.end()), msg_ (msg)
250 {}
251 
252 prefix_ senf::console::CheckedArgumentIteratorWrapper::~CheckedArgumentIteratorWrapper()
253  noexcept(false)
254 {
255  if (i_ != e_ && ! std::uncaught_exception())
256  throw SyntaxErrorException(msg_);
257 }
258 
259 prefix_ senf::console::CheckedArgumentIteratorWrapper::operator ParseCommandInfo::ArgumentIterator()
260 {
261  return i_;
262 }
263 
264 prefix_ bool senf::console::CheckedArgumentIteratorWrapper::boolean_test()
265  const
266 {
267  return i_ != e_;
268 }
269 
270 prefix_ bool senf::console::CheckedArgumentIteratorWrapper::done()
271  const
272 {
273  return i_ == e_;
274 }
275 
276 prefix_ void senf::console::CheckedArgumentIteratorWrapper::clear()
277 {
278  i_ = e_;
279 }
280 
281 prefix_ senf::console::CheckedArgumentIteratorWrapper::reference
282 senf::console::CheckedArgumentIteratorWrapper::dereference()
283  const
284 {
285  if (i_ == e_)
286  throw SyntaxErrorException(msg_);
287  return *i_;
288 }
289 
290 prefix_ void senf::console::CheckedArgumentIteratorWrapper::increment()
291 {
292  if (i_ == e_)
293  throw SyntaxErrorException(msg_);
294  ++ i_;
295 }
296 
297 prefix_ bool senf::console::CheckedArgumentIteratorWrapper::
298 operator==(ParseCommandInfo::ArgumentIterator const & other)
299  const
300 {
301  return i_ == other;
302 }
303 
304 prefix_ bool senf::console::CheckedArgumentIteratorWrapper::
305 operator!=(ParseCommandInfo::ArgumentIterator const & other)
306  const
307 {
308  return i_ != other;
309 }
310 
311 prefix_ senf::console::ParseCommandInfo::ArgumentIterator
312 senf::console::CheckedArgumentIteratorWrapper::operator++(int)
313 {
314  ParseCommandInfo::ArgumentIterator i (i_);
315  increment();
316  return i;
317 }
318 
319 //-/////////////////////////////////////////////////////////////////////////////////////////////////
320 // senf::console::SingleCommandParser
321 
322 prefix_ senf::console::CommandParser::Impl & senf::console::CommandParser::impl()
323 {
324  SENF_ASSERT(impl_, "Internal error: PIMPL pointer NULL ??");
325  return *impl_;
326 }
327 
328 //-/////////////////////////////////////////////////////////////////////////////////////////////////
329 #undef prefix_
330 
331 
332 // Local Variables:
333 // mode: c++
334 // fill-column: 100
335 // comment-column: 40
336 // c-file-style: "senf"
337 // indent-tabs-mode: nil
338 // ispell-local-dictionary: "american"
339 // compile-command: "scons -u test"
340 // End: