pianod2
multisource multiuser scriptable networked music player
parsnip_evaluate.h
Go to the documentation of this file.
1 
10 #include <vector>
11 #include <regex>
12 
13 #include "parsnip_command.h"
14 #include "parsnip_schema.h"
15 
16 namespace 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;
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:
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:
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:
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
187  using RegexType = std::basic_regex <StringType::value_type>;
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:
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 
227  class RealEvaluator : public ValueEvaluator {
228  double minimum;
229  double maximum;
230 
231  public:
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 
244  class KeywordEvaluator : public Evaluator {
245  friend class ValueEvaluator;
246  friend class OptionEvaluator;
247 
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 
285  class RemainderEvaluator : public Evaluator {
286  friend class Evaluator;
288  friend class ValueEvaluator;
289 
290  protected:
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 
304 
305  public:
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;
320  bool regurgitate {false};
321  bool iterate {false};
322 
323  protected:
324  virtual Parsnip::Data evaluateToken (class ArgvCursor *cursor) const override;
325 
326  public:
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
virtual Evaluator * getNextEvaluator(const StringType &value) const override
An evaluator representing of one option phrase.
Definition: parsnip_evaluate.cpp:108
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:121
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Evaluate command line tokens.
Definition: parsnip_evaluate.cpp:112
virtual void convertToOptionEvaluator() override
Make any changes to the parse tree to convert it to an options evaluator.
Definition: parsnip_evaluate.cpp:117
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.
bool operator!=(const Evaluator &other) const
Definition: parsnip_evaluate.h:100
virtual ~Evaluator()=default
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
int CommandId
Definition: parsnip_evaluate.h:42
friend class RemainderEvaluator
Definition: parsnip_evaluate.h:34
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
static const CommandId EndOfOption
Definition: parsnip_evaluate.h:46
friend class ValueEvaluator
Definition: parsnip_evaluate.h:31
void setCommandId(CommandId id)
Set the command ID in an evaluator.
Definition: parsnip_evaluate.cpp:68
static const CommandId NoCommand
Definition: parsnip_evaluate.h:45
virtual bool operator==(const Evaluator &) const
Check if two evaluators are the same.
Definition: parsnip_evaluate.cpp:75
std::string StringType
Definition: parsnip_evaluate.h:41
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
long maximum
Maximum acceptable value.
Definition: parsnip_evaluate.h:211
long minimum
Minimum acceptable value.
Definition: parsnip_evaluate.h:210
Evaluate a keyword in a command line.
Definition: parsnip_evaluate.h:244
EvaluatorRef numeric_evaluator
Definition: parsnip_evaluate.h:248
static bool is_numeric(const std::string &value)
Definition: parsnip_evaluate.h:255
std::unordered_map< StringType, EvaluatorRef > tokens
Definition: parsnip_evaluate.h:249
static std::string tolower(std::string value)
Definition: parsnip_evaluate.h:260
Evaluate remainder with a different parser.
Definition: parsnip_evaluate.h:315
OptionParserRef option_parser
Definition: parsnip_evaluate.h:317
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
Evaluate and validate a numeric value field.
Definition: parsnip_evaluate.h:227
double maximum
Maximum acceptable value.
Definition: parsnip_evaluate.h:229
double minimum
Minimum acceptable value.
Definition: parsnip_evaluate.h:228
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
StringType expression
The string defining the regular expression.
Definition: parsnip_evaluate.h:186
RegexType regex
The compiled regular expression.
Definition: parsnip_evaluate.h:188
virtual SchemaBase * getSchema() const override final
Definition: parsnip_evaluate.cpp:190
std::basic_regex< StringType::value_type > RegexType
Definition: parsnip_evaluate.h:187
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
EvaluatorRef terminating_evaluator
Definition: parsnip_evaluate.h:291
Gather the rest of the command line tokens in a list.
Definition: parsnip_evaluate.h:302
friend ValueEvaluator
Definition: parsnip_evaluate.h:303
Definition: parsnip_schema.h:28
Schema for one JSON object.
Definition: parsnip.h:612
std::unordered_map< class OptionParser *, SchemaRef > OptionSchemas
Definition: parsnip.h:615
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 SchemaBase * getSchema() const override
Definition: parsnip_evaluate.cpp:168
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
virtual void convertToOptionEvaluator() override
Make any changes to the parse tree to convert it to an options evaluator.
Definition: parsnip_evaluate.cpp:93
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:97
virtual Evaluator * getNextEvaluator(const StringType &value) const override
An evaluator representing abrupt end of the command pattern.
Definition: parsnip_evaluate.cpp:84
virtual Parsnip::Data evaluateToken(ArgvCursor *cursor) const override
Evaluate command line tokens.
Definition: parsnip_evaluate.cpp:88
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
EvaluatorRef next_evaluator
Definition: parsnip_evaluate.h:152
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
virtual SchemaBase * getSchema() const =0
uint32_t value
Definition: audiooutput.cpp:68
Serialization and parsing library.
Definition: mediaunit.h:26
std::shared_ptr< OptionParser > OptionParserRef
Definition: parsnip_command.h:97
static DesiredEvaluator * uptype_construct(EvaluatorRef &parser, bool *existed=nullptr)
If an evaluator isn't constructed, create it.
Definition: parsnip_evaluate.h:113
std::unique_ptr< class Evaluator, EvaluatorDeleter > EvaluatorRef
Definition: parsnip_command.h:79
void parser_assert(bool requirement, const char *explanation)
Definition: parsnip_evaluate.h:17
std::function< void(const int, const class DictionarySchema &)> SchemaIntegratorCallback
Definition: parsnip_schema.h:25
Parsnip command-line parsing.
Parsnip serialization schemas.