Kea  2.5.3
dhcp4/parser_context.h
Go to the documentation of this file.
1 // Copyright (C) 2015-2023 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef PARSER_CONTEXT_H
8 #define PARSER_CONTEXT_H
9 #include <string>
10 #include <map>
11 #include <vector>
12 #include <dhcp4/dhcp4_parser.h>
14 #include <exceptions/exceptions.h>
15 
16 // Tell Flex the lexer's prototype ...
17 #define YY_DECL isc::dhcp::Dhcp4Parser::symbol_type parser4_lex (Parser4Context& driver)
18 
19 // ... and declare it for the parser's sake.
21 
22 namespace isc {
23 namespace dhcp {
24 
29 public:
30  Dhcp4ParseError(const char* file, size_t line, const char* what) :
31  isc::Exception(file, line, what) { };
32 };
33 
36 {
37 public:
38 
49  typedef enum {
52 
56 
62 
65 
68 
71 
74 
77 
80 
83 
86 
89 
92  } ParserType;
93 
96 
98  virtual ~Parser4Context();
99 
101  std::vector<isc::data::ElementPtr> stack_;
102 
107  void scanStringBegin(const std::string& str, ParserType type);
108 
114  void scanFileBegin(FILE* f, const std::string& filename, ParserType type);
115 
117  void scanEnd();
118 
122  void includeFile(const std::string& filename);
123 
134  isc::data::ElementPtr parseString(const std::string& str,
135  ParserType parser_type);
136 
147  isc::data::ElementPtr parseFile(const std::string& filename,
148  ParserType parser_type);
149 
159  void error(const isc::dhcp::location& loc,
160  const std::string& what,
161  size_t pos = 0);
162 
170  void error(const std::string& what);
171 
179  static void fatal(const std::string& what);
180 
188  isc::data::Element::Position loc2pos(isc::dhcp::location& loc);
189 
199  void require(const std::string& name,
201  isc::data::Element::Position close_loc);
202 
211  void unique(const std::string& name,
213 
220  void warning(const isc::dhcp::location& loc, const std::string& what);
221 
227  void warnAboutExtraCommas(const isc::dhcp::location& loc);
228 
230  typedef enum {
232  NO_KEYWORD,
233 
235  CONFIG,
236 
239 
242 
245 
248 
251 
254 
257 
260 
263 
266 
269 
272 
275 
278 
281 
286 
289 
292 
295 
298 
301 
304 
307 
310 
313 
316 
319 
322 
325 
328 
331 
334 
337 
340 
343  } ParserContext;
344 
346  std::string file_;
347 
349  std::vector<std::string> files_;
350 
355  isc::dhcp::location loc_;
356 
358  std::vector<isc::dhcp::location> locs_;
359 
361  std::vector<struct yy_buffer_state*> states_;
362 
364  FILE* sfile_;
365 
371  std::vector<FILE*> sfiles_;
372 
375 
388  void enter(const ParserContext& ctx);
389 
393  void leave();
394 
398  const std::string contextName();
399 
400  private:
402  bool trace_scanning_;
403 
405  bool trace_parsing_;
406 
408  std::vector<ParserContext> cstack_;
409 
413  isc::data::ElementPtr parseCommon();
414 };
415 
416 }; // end of isc::eval namespace
417 }; // end of isc namespace
418 
419 #endif
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Evaluation error exception raised when trying to parse.
Dhcp4ParseError(const char *file, size_t line, const char *what)
Evaluation context, an interface to the expression evaluation.
void scanFileBegin(FILE *f, const std::string &filename, ParserType type)
Method called before scanning starts on a file.
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
std::vector< std::string > files_
File name stack.
void require(const std::string &name, isc::data::Element::Position open_loc, isc::data::Element::Position close_loc)
Check if a required parameter is present.
isc::data::Element::Position loc2pos(isc::dhcp::location &loc)
Converts bison's position to one understandable by isc::data::Element.
void leave()
Leave a syntactic context.
isc::data::ElementPtr parseString(const std::string &str, ParserType parser_type)
Run the parser on the string specified.
void unique(const std::string &name, isc::data::Element::Position loc)
Check if a parameter is already present.
void scanEnd()
Method called after the last tokens are scanned.
std::vector< FILE * > sfiles_
sFile (aka FILE) stack
void enter(const ParserContext &ctx)
Enter a new syntactic context.
Parser4Context()
Default constructor.
std::string file_
File name.
void warning(const isc::dhcp::location &loc, const std::string &what)
Warning handler.
void warnAboutExtraCommas(const isc::dhcp::location &loc)
Warning for extra commas.
const std::string contextName()
Get the syntactic context name.
ParserContext
Defines syntactic contexts for lexical tie-ins.
@ SUBNET4
Used while parsing Dhcp4/Subnet4 structures.
@ DATABASE_TYPE
Used while parsing Dhcp4/*-database/type.
@ POOLS
Used while parsing Dhcp4/subnet4/pools structures.
@ CLIENT_CLASSES
Used while parsing Dhcp4/client-classes structures.
@ RESERVATIONS
Used while parsing Dhcp4/reservations structures.
@ HOSTS_DATABASE
Used while parsing Dhcp4/hosts-database[s] structures.
@ NCR_PROTOCOL
Used while parsing Dhcp4/dhcp-ddns/ncr-protocol.
@ LOGGERS
Used while parsing Dhcp4/loggers structures.
@ DATABASE_ON_FAIL
Used while parsing Dhcp4/*-database/on-fail.
@ NCR_FORMAT
Used while parsing Dhcp4/dhcp-ddns/ncr-format.
@ SERVER_ID
Used while parsing Dhcp4/server-id structures.
@ DDNS_CONFLICT_RESOLUTION_MODE
Used while parsing Dhcp4/ib-ddns-conflict-resolution-mode.
@ COMPATIBILITY
Used while parsing compatibility parameters.
@ OUTBOUND_INTERFACE
Used while parsing Dhcp4/interfaces/outbound-interface structures.
@ CONFIG
Used while parsing content of Dhcp4.
@ OUTPUT_OPTIONS
Used while parsing Dhcp4/loggers/output-options structures.
@ RESERVATION_MODE
Used while parsing Dhcp4/reservation-mode.
@ CONTROL_SOCKET
Used while parsing Dhcp4/control-socket structures.
@ DHCP_DDNS
Used while parsing Dhcp4/dhcp-ddns.
@ OPTION_DATA
Used while parsing Dhcp4/option-data, Dhcp4/subnet4/option-data or anywhere option-data is present (c...
@ DHCP_MULTI_THREADING
Used while parsing Dhcp4/multi-threading structures.
@ LEASE_DATABASE
Used while parsing Dhcp4/lease-database structures.
@ SHARED_NETWORK
Used while parsing shared-networks structures.
@ EXPIRED_LEASES_PROCESSING
Used while parsing Dhcp4/expired-leases-processing.
@ CONFIG_CONTROL
Used while parsing Dhcp4/config-control.
@ INTERFACES_CONFIG
Used while parsing Dhcp4/interfaces structures.
@ HOST_RESERVATION_IDENTIFIERS
Used while parsing Dhcp4/host-reservation-identifiers.
@ OPTION_DEF
Used while parsing Dhcp4/option-def structures.
@ CONFIG_DATABASE
Used while parsing config-control/config-databases.
@ NO_KEYWORD
This one is used in pure JSON mode.
@ HOOKS_LIBRARIES
Used while parsing Dhcp4/hooks-libraries.
@ DHCP_QUEUE_CONTROL
Used while parsing Dhcp4/dhcp-queue-control structures.
@ REPLACE_CLIENT_NAME
Used while parsing Dhcp4/dhcp-ddns/replace-client-name.
@ RELAY
Used while parsing Dhcp4/subnet4relay structures.
@ DHCP_SOCKET_TYPE
Used while parsing Dhcp4/interfaces/dhcp-socket-type structures.
ParserType
Defines currently supported scopes.
@ PARSER_INTERFACES
This will parse the input as interfaces content.
@ PARSER_CONFIG_CONTROL
This will parse the input as config-control.
@ PARSER_DHCP_DDNS
This will parse the input as dhcp-ddns.
@ PARSER_DHCP4
This parser will parse the content as Dhcp4 config wrapped in a map (that's the regular config file)
@ PARSER_OPTION_DEFS
This will parse the input option definitions (for tests).
@ PARSER_HOST_RESERVATION
This will parse the input as host-reservation.
@ PARSER_OPTION_DATA
This will parse the input as option data.
@ PARSER_OPTION_DEF
This will parse the input as option definition.
@ PARSER_JSON
This parser will parse the content as generic JSON.
@ PARSER_POOL4
This will parse the input as pool4 content.
@ SUBPARSER_DHCP4
This parser will parse the content of Dhcp4 (without outer { } and without "Dhcp4").
@ PARSER_HOOKS_LIBRARY
This will parse the input as hooks-library.
@ PARSER_SUBNET4
This will parse the input as Subnet4 content.
static void fatal(const std::string &what)
Fatal error handler.
FILE * sfile_
sFile (aka FILE)
std::vector< struct yy_buffer_state * > states_
Lexer state stack.
isc::dhcp::location loc_
Location of the current token.
std::vector< isc::data::ElementPtr > stack_
JSON elements being parsed.
void includeFile(const std::string &filename)
Divert input to an include file.
void scanStringBegin(const std::string &str, ParserType type)
Method called before scanning starts on a string.
ParserContext ctx_
Current syntactic context.
std::vector< isc::dhcp::location > locs_
Location stack.
void error(const isc::dhcp::location &loc, const std::string &what, size_t pos=0)
Error handler.
virtual ~Parser4Context()
destructor
#define YY_DECL
Forward declaration of the ParserContext class.
Define the isc::dhcp::parser class.
boost::shared_ptr< Element > ElementPtr
Definition: data.h:26
Defines the logger used by the top-level component of kea-lfc.
Represents the position of the data element within a configuration string.
Definition: data.h:94