Parsnip
parsing library
Loading...
Searching...
No Matches
parsnip_evaluate.h
Go to the documentation of this file.
1
9
10#include <vector>
11#include <regex>
12
13#include "parsnip_command.h"
14#include "parsnip_schema.h"
15
16namespace Parsnip {
17 inline void parser_assert (bool requirement, const char *explanation) {
18 if (!requirement) {
19 throw std::runtime_error (explanation);
20 }
21 }
22
23 inline void parser_assert (bool requirement, const char *explanation, const std::string &detail) {
24 if (!requirement) {
25 throw std::runtime_error (std::string (explanation) + ": " + detail);
26 }
27 }
28
30 class Evaluator {
31 friend class ValueEvaluator;
32 friend class KeywordEvaluator;
33 friend class RemainingValuesEvaluator;
34 friend class RemainderEvaluator;
35 friend class OptionEvaluator;
36 friend class OptionParser;
37 friend class Schema;
38 friend class SchemaSet;
39
40 public:
41 using StringType = std::string;
42 using CommandId = int;
43
44 private:
45 static const CommandId NoCommand = -1;
46 static const CommandId EndOfOption = -2;
47
48 protected:
50 CommandId command_id{NoCommand};
52 std::string name;
53
54 Evaluator() = default;
55
56 public:
57 Evaluator (Evaluator *original);
58 virtual ~Evaluator() = default;
59
60 protected:
61 static void set_name (EvaluatorRef &target, const std::string &name);
62 void setCommandId (CommandId id);
63
67 virtual Evaluator *getNextEvaluator (const StringType &token) const = 0;
68
73 virtual Parsnip::Data evaluateToken (class ArgvCursor *cursor) const = 0;
74
76 virtual void convertToOptionEvaluator() = 0;
77
89 virtual void constructSchema (const DictionarySchema &schema,
90 const Schema::OptionSchemas &option_schemas,
91 const SchemaIntegratorCallback &integrator) const = 0;
92
93 public:
94 static void construct (EvaluatorRef &evaluator,
95 const ArgvCursor &cursor,
96 CommandId id,
97 Parser *parent_parser);
98 int evaluate (ArgvCursor *cursor, Parsnip::Data &result_dict);
99 virtual bool operator== (const Evaluator &) const;
100 inline bool operator!= (const Evaluator &other) const {
101 return !(*this == other);
102 }
103 };
104
112 template <class DesiredEvaluator>
113 static inline DesiredEvaluator *uptype_construct (EvaluatorRef &parser, bool *existed = nullptr) {
114 DesiredEvaluator *possess = dynamic_cast<DesiredEvaluator *> (parser.get());
115 if (existed) {
116 // If not null, set existed to indicate if object was already of required type.
117 *existed = (possess != nullptr);
118 }
119 if (!possess) {
120 possess = new DesiredEvaluator (parser.get());
121 parser.reset (possess);
122 }
123 return possess;
124 }
125
128 virtual Evaluator *getNextEvaluator (const StringType &value) const override;
129 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
130 virtual void convertToOptionEvaluator() override;
131 virtual void constructSchema (const DictionarySchema &scheme,
132 const Schema::OptionSchemas &option_schemas,
133 const SchemaIntegratorCallback &integrator) const override;
134 };
135
138 virtual Evaluator *getNextEvaluator (const StringType &value) const override;
139 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
140 virtual void convertToOptionEvaluator() override;
141 virtual void constructSchema (const DictionarySchema &scheme,
142 const Schema::OptionSchemas &option_schemas,
143 const SchemaIntegratorCallback &integrator) const override;
144
145 public:
146 using Evaluator::Evaluator;
147 };
148
150 class ValueEvaluator : public Evaluator {
151 protected:
152 EvaluatorRef next_evaluator;
153
154 virtual Evaluator *getNextEvaluator (const StringType &value) const override;
155
156 public:
157 using Evaluator::Evaluator;
158 virtual bool operator== (const Evaluator &other) const override;
159 virtual void convertToOptionEvaluator() override;
160
161 virtual SchemaBase *getSchema() const = 0;
162 virtual void constructSchema (const DictionarySchema &scheme,
163 const Schema::OptionSchemas &option_schemas,
164 const SchemaIntegratorCallback &integrator) const override;
165
167 static void construct (EvaluatorRef &parser,
168 const ArgvCursor &cursor,
169 CommandId id,
170 Parser *parent_parser,
171 std::string name,
172 std::string keywords);
173 };
174
177 public:
178 using ValueEvaluator::ValueEvaluator;
179 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
180 virtual SchemaBase *getSchema() const override;
181 };
182
183 // A string evaluator that is checked by a regular expression
186 StringType expression;
187 using RegexType = std::basic_regex <StringType::value_type>;
188 RegexType regex;
189 public:
190 using StringEvaluator::StringEvaluator;
191 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
192 virtual bool operator== (const Evaluator &other) const override;
193 virtual SchemaBase *getSchema() const override final;
194
195 static RegExEvaluator *construct (EvaluatorRef &evaluator,
196 const std::string &name,
197 const StringType &expression,
198 const bool case_blind);
199 };
200
203 public:
204 using StringEvaluator::StringEvaluator;
205 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
206 };
207
210 long minimum;
211 long maximum;
212 int radix = 1;
213
214 public:
215 using ValueEvaluator::ValueEvaluator;
216 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
217 virtual bool operator== (const Evaluator &other) const override;
218 virtual SchemaBase *getSchema() const override final;
219
220 static IntegerEvaluator *construct (EvaluatorRef &evaluator,
221 const std::string &name,
222 const std::string &min,
223 const std::string &max);
224 };
225
228 double minimum;
229 double maximum;
230
231 public:
232 using ValueEvaluator::ValueEvaluator;
233 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
234 virtual bool operator== (const Evaluator &other) const override;
235 virtual SchemaBase *getSchema() const override final;
236
237 static RealEvaluator *construct (EvaluatorRef &parser,
238 const std::string &name,
239 const std::string &min,
240 const std::string &max);
241 };
242
245 friend class ValueEvaluator;
246 friend class OptionEvaluator;
247
248 EvaluatorRef numeric_evaluator;
249 std::unordered_map<StringType, EvaluatorRef> tokens;
250 bool numbers_present{false};
251
252 public:
253 using Evaluator::Evaluator;
254
255 inline static bool is_numeric (const std::string &value) {
256 return ((!value.empty() && isdigit (value[0]))
257 || (value.size() >= 2 && value[0] == '-' && isdigit (value[1])));
258 }
259
260 inline static std::string tolower (std::string value) {
261 for (auto &ch : value) {
262 ch = ::tolower (ch);
263 }
264 return value;
265 }
266
267 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
268 virtual Evaluator *getNextEvaluator (const StringType &token) const override;
269 virtual bool operator== (const Evaluator &other) const override;
270 virtual void convertToOptionEvaluator() override;
271
273 static void construct (EvaluatorRef &parser,
274 const ArgvCursor &cursor,
275 CommandId id,
276 Parser *parent_parser,
277 const std::string &name,
278 std::string keywords);
279 virtual void constructSchema (const DictionarySchema &scheme,
280 const Schema::OptionSchemas &option_schemas,
281 const SchemaIntegratorCallback &integrator) const override;
282 };
283
286 friend class Evaluator;
287 friend class RemainingValuesEvaluator;
288 friend class ValueEvaluator;
289
290 protected:
291 EvaluatorRef terminating_evaluator;
292
293 public:
294 using Evaluator::Evaluator;
295
296 virtual Evaluator *getNextEvaluator (const StringType &value) const override;
297 virtual bool operator== (const Evaluator &other) const override;
298 virtual void convertToOptionEvaluator() override;
299 };
300
303 friend ValueEvaluator;
304
305 public:
306 using RemainderEvaluator::RemainderEvaluator;
307
308 virtual Parsnip::Data evaluateToken (ArgvCursor *cursor) const override;
309 virtual void constructSchema (const DictionarySchema &scheme,
310 const Schema::OptionSchemas &option_schemas,
311 const SchemaIntegratorCallback &integrator) const override;
312 };
313
316 friend class OptionParser;
317 OptionParserRef option_parser;
320 bool regurgitate {false};
321 bool iterate {false};
322
323 protected:
324 virtual Parsnip::Data evaluateToken (class ArgvCursor *cursor) const override;
325
326 public:
327 using RemainderEvaluator::RemainderEvaluator;
328 virtual bool operator== (const Evaluator &) const override;
329
330 static std::vector<OptionEvaluator *> construct (EvaluatorRef &evaluator,
331 std::string option_parser_type,
332 bool iterative,
333 const Parser *parent_parser);
334 virtual void constructSchema (const DictionarySchema &scheme,
335 const Schema::OptionSchemas &option_schemas,
336 const SchemaIntegratorCallback &integrator) const override;
337 };
338
339} // namespace Parsnip
An iterator for argument vectors.
Definition parsnip_argv.h:42
Generic data type.
Definition parsnip.h:81
Schema component for validating dictionaries.
Definition parsnip_schema.h:307
An evaluator representing abrupt end of the command pattern.
Definition parsnip_evaluate.h:137
Evaluator base class.
Definition parsnip_evaluate.h:30
virtual void constructSchema(const DictionarySchema &schema, const Schema::OptionSchemas &option_schemas, const SchemaIntegratorCallback &integrator) const =0
Construct a schema from an evaluator tree.
virtual Parsnip::Data evaluateToken(class ArgvCursor *cursor) const =0
Evaluate command line tokens.
virtual Evaluator * getNextEvaluator(const StringType &token) const =0
Determine if and how to evaluate additional command line tokens.
int evaluate(ArgvCursor *cursor, Parsnip::Data &result_dict)
Evaluate a token in the command line, and recurse if there is more to go.
Definition parsnip_command.cpp:359
static void set_name(EvaluatorRef &target, const std::string &name)
Assign a name by which to store values for value evaluators.
Definition parsnip_evaluate.cpp:55
virtual void convertToOptionEvaluator()=0
Make any changes to the parse tree to convert it to an options evaluator.
CommandId command_id
If this completes a command, the command ID.
Definition parsnip_evaluate.h:50
static void construct(EvaluatorRef &evaluator, const ArgvCursor &cursor, CommandId id, Parser *parent_parser)
Construct token handler from the token in a parsing definition.
Definition parsnip_command.cpp:273
void setCommandId(CommandId id)
Set the command ID in an evaluator.
Definition parsnip_evaluate.cpp:68
virtual bool operator==(const Evaluator &) const
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:75
std::string name
If not empty, the name by which this value shall be accessed.
Definition parsnip_evaluate.h:52
Evaluate and validate an integral value field.
Definition parsnip_evaluate.h:209
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Definition parsnip_evaluate.cpp:229
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:251
static IntegerEvaluator * construct(EvaluatorRef &evaluator, const std::string &name, const std::string &min, const std::string &max)
Construct an evaluator (or validate the existing validator) for accepting an integer with a limited r...
Definition parsnip_evaluate.cpp:261
Evaluate a keyword in a command line.
Definition parsnip_evaluate.h:244
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Store the current keyword as a string, if it's marked for recording.
Definition parsnip_evaluate.cpp:345
virtual void convertToOptionEvaluator() override
Make any changes to the parse tree to convert it to an options evaluator.
Definition parsnip_evaluate.cpp:411
virtual void constructSchema(const DictionarySchema &scheme, const Schema::OptionSchemas &option_schemas, const SchemaIntegratorCallback &integrator) const override
Construct a schema from an evaluator tree.
Definition parsnip_evaluate.cpp:367
virtual Evaluator * getNextEvaluator(const StringType &token) const override
Select an evaluator for the next element based on current token.
Definition parsnip_evaluate.cpp:353
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:390
static void construct(EvaluatorRef &parser, const ArgvCursor &cursor, CommandId id, Parser *parent_parser, const std::string &name, std::string keywords)
Construct a keyword token handler.
Definition parsnip_command.cpp:138
Evaluate remainder with a different parser.
Definition parsnip_evaluate.h:315
virtual void constructSchema(const DictionarySchema &scheme, const Schema::OptionSchemas &option_schemas, const SchemaIntegratorCallback &integrator) const override
Construct a schema from an evaluator tree.
Definition parsnip_evaluate.cpp:484
virtual bool operator==(const Evaluator &) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:501
static std::vector< OptionEvaluator * > construct(EvaluatorRef &evaluator, std::string option_parser_type, bool iterative, const Parser *parent_parser)
Construct an evaluator (or validate the existing validator) that parsers the remainder with an option...
Definition parsnip_evaluate.cpp:516
virtual Parsnip::Data evaluateToken(class ArgvCursor *cursor) const override
Evaluate command line tokens.
Definition parsnip_evaluate.cpp:468
A class for parsing command line options (name-value pairs, for instance).
Definition parsnip_command.h:82
A class for parsing command lines.
Definition parsnip_command.h:100
Gather the rest of the command line as an untokenized string.
Definition parsnip_evaluate.h:202
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Definition parsnip_evaluate.cpp:219
Evaluate and validate a numeric value field.
Definition parsnip_evaluate.h:227
static RealEvaluator * construct(EvaluatorRef &parser, const std::string &name, const std::string &min, const std::string &max)
Construct an evaluator (or validate the existing validator) for accepting real number with a limited ...
Definition parsnip_evaluate.cpp:321
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:288
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Interpret the token as double, range check it, and store it.
Definition parsnip_evaluate.cpp:297
Evaluate a string value field.
Definition parsnip_evaluate.h:185
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Definition parsnip_evaluate.cpp:173
static RegExEvaluator * construct(EvaluatorRef &evaluator, const std::string &name, const StringType &expression, const bool case_blind)
Construct an evaluator (or validate the existing validator) for accepting an integer with a limited r...
Definition parsnip_evaluate.cpp:196
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:182
An evaluator that represents the rest of the command line.
Definition parsnip_evaluate.h:285
virtual Evaluator * getNextEvaluator(const StringType &value) const override
An evaluator that represents the rest of the command line.
Definition parsnip_evaluate.cpp:426
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:430
virtual void convertToOptionEvaluator() override
Make any changes to the parse tree to convert it to an options evaluator.
Definition parsnip_evaluate.cpp:438
Gather the rest of the command line tokens in a list.
Definition parsnip_evaluate.h:302
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Definition parsnip_evaluate.cpp:444
virtual void constructSchema(const DictionarySchema &scheme, const Schema::OptionSchemas &option_schemas, const SchemaIntegratorCallback &integrator) const override
Construct a schema from an evaluator tree.
Definition parsnip_evaluate.cpp:452
Definition parsnip_schema.h:28
Schema for one JSON object.
Definition parsnip.h:612
A schema built to validate JSON messages based on command line patterns.
Definition parsnip_command.h:171
Evaluate a string value field.
Definition parsnip_evaluate.h:176
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Definition parsnip_evaluate.cpp:164
An evaluator representing abrupt end of the command pattern.
Definition parsnip_evaluate.h:127
Evaluate a value/fill-in field.
Definition parsnip_evaluate.h:150
virtual Evaluator * getNextEvaluator(const StringType &value) const override
Determine if and how to evaluate additional command line tokens.
Definition parsnip_evaluate.cpp:131
virtual void convertToOptionEvaluator() override
Make any changes to the parse tree to convert it to an options evaluator.
Definition parsnip_evaluate.cpp:143
virtual bool operator==(const Evaluator &other) const override
Check if two evaluators are the same.
Definition parsnip_evaluate.cpp:135
virtual void constructSchema(const DictionarySchema &scheme, const Schema::OptionSchemas &option_schemas, const SchemaIntegratorCallback &integrator) const override
Construct a schema from an evaluator tree.
Definition parsnip_evaluate.cpp:150
static void construct(EvaluatorRef &parser, const ArgvCursor &cursor, CommandId id, Parser *parent_parser, std::string name, std::string keywords)
Construct a value/fill-in token handler.
Definition parsnip_command.cpp:187
Serialization and parsing library.
Definition parsnip.h:38
Parsnip command-line parsing.
Parsnip serialization schemas.