Kea 2.7.4
dhcp4_parser.cc
Go to the documentation of this file.
1// A Bison parser, made by GNU Bison 3.8.2.
2
3// Skeleton implementation for Bison LALR(1) parsers in C++
4
5// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
6
7// This program is free software: you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation, either version 3 of the License, or
10// (at your option) any later version.
11
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License
18// along with this program. If not, see <https://www.gnu.org/licenses/>.
19
20// As a special exception, you may create a larger work that contains
21// part or all of the Bison parser skeleton and distribute that work
22// under terms of your choice, so long as that work isn't itself a
23// parser generator using the skeleton or a modified version thereof
24// as a parser skeleton. Alternatively, if you modify or redistribute
25// the parser skeleton itself, you may (at your option) remove this
26// special exception, which will cause the skeleton and the resulting
27// Bison output files to be licensed under the GNU General Public
28// License without this special exception.
29
30// This special exception was added by the Free Software Foundation in
31// version 2.2 of Bison.
32
33// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
34// especially those whose name start with YY_ or yy_. They are
35// private implementation details that can be changed or removed.
36
37
38// Take the name prefix into account.
39#define yylex parser4_lex
40
41
42
43#include "dhcp4_parser.h"
44
45
46// Unqualified %code blocks.
47#line 34 "dhcp4_parser.yy"
48
50
51// Avoid warnings with the error counter.
52#if defined(__GNUC__) || defined(__clang__)
53#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
54#endif
55
56#line 57 "dhcp4_parser.cc"
57
58
59#ifndef YY_
60# if defined YYENABLE_NLS && YYENABLE_NLS
61# if ENABLE_NLS
62# include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
63# define YY_(msgid) dgettext ("bison-runtime", msgid)
64# endif
65# endif
66# ifndef YY_
67# define YY_(msgid) msgid
68# endif
69#endif
70
71
72// Whether we are compiled with exception support.
73#ifndef YY_EXCEPTIONS
74# if defined __GNUC__ && !defined __EXCEPTIONS
75# define YY_EXCEPTIONS 0
76# else
77# define YY_EXCEPTIONS 1
78# endif
79#endif
80
81#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
82/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
83 If N is 0, then set CURRENT to the empty location which ends
84 the previous symbol: RHS[0] (always defined). */
85
86# ifndef YYLLOC_DEFAULT
87# define YYLLOC_DEFAULT(Current, Rhs, N) \
88 do \
89 if (N) \
90 { \
91 (Current).begin = YYRHSLOC (Rhs, 1).begin; \
92 (Current).end = YYRHSLOC (Rhs, N).end; \
93 } \
94 else \
95 { \
96 (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
97 } \
98 while (false)
99# endif
100
101
102// Enable debugging if requested.
103#if PARSER4_DEBUG
104
105// A pseudo ostream that takes yydebug_ into account.
106# define YYCDEBUG if (yydebug_) (*yycdebug_)
107
108# define YY_SYMBOL_PRINT(Title, Symbol) \
109 do { \
110 if (yydebug_) \
111 { \
112 *yycdebug_ << Title << ' '; \
113 yy_print_ (*yycdebug_, Symbol); \
114 *yycdebug_ << '\n'; \
115 } \
116 } while (false)
117
118# define YY_REDUCE_PRINT(Rule) \
119 do { \
120 if (yydebug_) \
121 yy_reduce_print_ (Rule); \
122 } while (false)
123
124# define YY_STACK_PRINT() \
125 do { \
126 if (yydebug_) \
127 yy_stack_print_ (); \
128 } while (false)
129
130#else // !PARSER4_DEBUG
131
132# define YYCDEBUG if (false) std::cerr
133# define YY_SYMBOL_PRINT(Title, Symbol) YY_USE (Symbol)
134# define YY_REDUCE_PRINT(Rule) static_cast<void> (0)
135# define YY_STACK_PRINT() static_cast<void> (0)
136
137#endif // !PARSER4_DEBUG
138
139#define yyerrok (yyerrstatus_ = 0)
140#define yyclearin (yyla.clear ())
141
142#define YYACCEPT goto yyacceptlab
143#define YYABORT goto yyabortlab
144#define YYERROR goto yyerrorlab
145#define YYRECOVERING() (!!yyerrstatus_)
146
147#line 14 "dhcp4_parser.yy"
148namespace isc { namespace dhcp {
149#line 150 "dhcp4_parser.cc"
150
153#if PARSER4_DEBUG
154 : yydebug_ (false),
155 yycdebug_ (&std::cerr),
156#else
157 :
158#endif
159 ctx (ctx_yyarg)
160 {}
161
164
167
168 /*---------.
169 | symbol. |
170 `---------*/
171
172
173
174 // by_state.
175 Dhcp4Parser::by_state::by_state () YY_NOEXCEPT
176 : state (empty_state)
177 {}
178
179 Dhcp4Parser::by_state::by_state (const by_state& that) YY_NOEXCEPT
180 : state (that.state)
181 {}
182
183 void
184 Dhcp4Parser::by_state::clear () YY_NOEXCEPT
185 {
186 state = empty_state;
187 }
188
189 void
190 Dhcp4Parser::by_state::move (by_state& that)
191 {
192 state = that.state;
193 that.clear ();
194 }
195
196 Dhcp4Parser::by_state::by_state (state_type s) YY_NOEXCEPT
197 : state (s)
198 {}
199
201 Dhcp4Parser::by_state::kind () const YY_NOEXCEPT
202 {
203 if (state == empty_state)
205 else
206 return YY_CAST (symbol_kind_type, yystos_[+state]);
207 }
208
209 Dhcp4Parser::stack_symbol_type::stack_symbol_type ()
210 {}
211
212 Dhcp4Parser::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
213 : super_type (YY_MOVE (that.state), YY_MOVE (that.location))
214 {
215 switch (that.kind ())
216 {
217 case symbol_kind::S_value: // value
218 case symbol_kind::S_map_value: // map_value
219 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
220 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
221 case symbol_kind::S_socket_type: // socket_type
222 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
223 case symbol_kind::S_on_fail_mode: // on_fail_mode
224 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
225 case symbol_kind::S_auth_type_value: // auth_type_value
226 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
227 value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (that.value));
228 break;
229
230 case symbol_kind::S_BOOLEAN: // "boolean"
231 value.YY_MOVE_OR_COPY< bool > (YY_MOVE (that.value));
232 break;
233
234 case symbol_kind::S_FLOAT: // "floating point"
235 value.YY_MOVE_OR_COPY< double > (YY_MOVE (that.value));
236 break;
237
238 case symbol_kind::S_INTEGER: // "integer"
239 value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (that.value));
240 break;
241
242 case symbol_kind::S_STRING: // "constant string"
243 value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (that.value));
244 break;
245
246 default:
247 break;
248 }
249
250#if 201103L <= YY_CPLUSPLUS
251 // that is emptied.
252 that.state = empty_state;
253#endif
254 }
255
256 Dhcp4Parser::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
257 : super_type (s, YY_MOVE (that.location))
258 {
259 switch (that.kind ())
260 {
261 case symbol_kind::S_value: // value
262 case symbol_kind::S_map_value: // map_value
263 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
264 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
265 case symbol_kind::S_socket_type: // socket_type
266 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
267 case symbol_kind::S_on_fail_mode: // on_fail_mode
268 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
269 case symbol_kind::S_auth_type_value: // auth_type_value
270 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
271 value.move< ElementPtr > (YY_MOVE (that.value));
272 break;
273
274 case symbol_kind::S_BOOLEAN: // "boolean"
275 value.move< bool > (YY_MOVE (that.value));
276 break;
277
278 case symbol_kind::S_FLOAT: // "floating point"
279 value.move< double > (YY_MOVE (that.value));
280 break;
281
282 case symbol_kind::S_INTEGER: // "integer"
283 value.move< int64_t > (YY_MOVE (that.value));
284 break;
285
286 case symbol_kind::S_STRING: // "constant string"
287 value.move< std::string > (YY_MOVE (that.value));
288 break;
289
290 default:
291 break;
292 }
293
294 // that is emptied.
295 that.kind_ = symbol_kind::S_YYEMPTY;
296 }
297
298#if YY_CPLUSPLUS < 201103L
299 Dhcp4Parser::stack_symbol_type&
300 Dhcp4Parser::stack_symbol_type::operator= (const stack_symbol_type& that)
301 {
302 state = that.state;
303 switch (that.kind ())
304 {
305 case symbol_kind::S_value: // value
306 case symbol_kind::S_map_value: // map_value
307 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
308 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
309 case symbol_kind::S_socket_type: // socket_type
310 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
311 case symbol_kind::S_on_fail_mode: // on_fail_mode
312 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
313 case symbol_kind::S_auth_type_value: // auth_type_value
314 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
315 value.copy< ElementPtr > (that.value);
316 break;
317
318 case symbol_kind::S_BOOLEAN: // "boolean"
319 value.copy< bool > (that.value);
320 break;
321
322 case symbol_kind::S_FLOAT: // "floating point"
323 value.copy< double > (that.value);
324 break;
325
326 case symbol_kind::S_INTEGER: // "integer"
327 value.copy< int64_t > (that.value);
328 break;
329
330 case symbol_kind::S_STRING: // "constant string"
331 value.copy< std::string > (that.value);
332 break;
333
334 default:
335 break;
336 }
337
338 location = that.location;
339 return *this;
340 }
341
342 Dhcp4Parser::stack_symbol_type&
343 Dhcp4Parser::stack_symbol_type::operator= (stack_symbol_type& that)
344 {
345 state = that.state;
346 switch (that.kind ())
347 {
348 case symbol_kind::S_value: // value
349 case symbol_kind::S_map_value: // map_value
350 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
351 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
352 case symbol_kind::S_socket_type: // socket_type
353 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
354 case symbol_kind::S_on_fail_mode: // on_fail_mode
355 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
356 case symbol_kind::S_auth_type_value: // auth_type_value
357 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
358 value.move< ElementPtr > (that.value);
359 break;
360
361 case symbol_kind::S_BOOLEAN: // "boolean"
362 value.move< bool > (that.value);
363 break;
364
365 case symbol_kind::S_FLOAT: // "floating point"
366 value.move< double > (that.value);
367 break;
368
369 case symbol_kind::S_INTEGER: // "integer"
370 value.move< int64_t > (that.value);
371 break;
372
373 case symbol_kind::S_STRING: // "constant string"
374 value.move< std::string > (that.value);
375 break;
376
377 default:
378 break;
379 }
380
381 location = that.location;
382 // that is emptied.
383 that.state = empty_state;
384 return *this;
385 }
386#endif
387
388 template <typename Base>
389 void
390 Dhcp4Parser::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
391 {
392 if (yymsg)
393 YY_SYMBOL_PRINT (yymsg, yysym);
394 }
395
396#if PARSER4_DEBUG
397 template <typename Base>
398 void
399 Dhcp4Parser::yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const
400 {
401 std::ostream& yyoutput = yyo;
402 YY_USE (yyoutput);
403 if (yysym.empty ())
404 yyo << "empty symbol";
405 else
406 {
407 symbol_kind_type yykind = yysym.kind ();
408 yyo << (yykind < YYNTOKENS ? "token" : "nterm")
409 << ' ' << yysym.name () << " ("
410 << yysym.location << ": ";
411 switch (yykind)
412 {
413 case symbol_kind::S_STRING: // "constant string"
414#line 313 "dhcp4_parser.yy"
415 { yyoutput << yysym.value.template as < std::string > (); }
416#line 417 "dhcp4_parser.cc"
417 break;
418
419 case symbol_kind::S_INTEGER: // "integer"
420#line 313 "dhcp4_parser.yy"
421 { yyoutput << yysym.value.template as < int64_t > (); }
422#line 423 "dhcp4_parser.cc"
423 break;
424
425 case symbol_kind::S_FLOAT: // "floating point"
426#line 313 "dhcp4_parser.yy"
427 { yyoutput << yysym.value.template as < double > (); }
428#line 429 "dhcp4_parser.cc"
429 break;
430
431 case symbol_kind::S_BOOLEAN: // "boolean"
432#line 313 "dhcp4_parser.yy"
433 { yyoutput << yysym.value.template as < bool > (); }
434#line 435 "dhcp4_parser.cc"
435 break;
436
437 case symbol_kind::S_value: // value
438#line 313 "dhcp4_parser.yy"
439 { yyoutput << yysym.value.template as < ElementPtr > (); }
440#line 441 "dhcp4_parser.cc"
441 break;
442
443 case symbol_kind::S_map_value: // map_value
444#line 313 "dhcp4_parser.yy"
445 { yyoutput << yysym.value.template as < ElementPtr > (); }
446#line 447 "dhcp4_parser.cc"
447 break;
448
449 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
450#line 313 "dhcp4_parser.yy"
451 { yyoutput << yysym.value.template as < ElementPtr > (); }
452#line 453 "dhcp4_parser.cc"
453 break;
454
455 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
456#line 313 "dhcp4_parser.yy"
457 { yyoutput << yysym.value.template as < ElementPtr > (); }
458#line 459 "dhcp4_parser.cc"
459 break;
460
461 case symbol_kind::S_socket_type: // socket_type
462#line 313 "dhcp4_parser.yy"
463 { yyoutput << yysym.value.template as < ElementPtr > (); }
464#line 465 "dhcp4_parser.cc"
465 break;
466
467 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
468#line 313 "dhcp4_parser.yy"
469 { yyoutput << yysym.value.template as < ElementPtr > (); }
470#line 471 "dhcp4_parser.cc"
471 break;
472
473 case symbol_kind::S_on_fail_mode: // on_fail_mode
474#line 313 "dhcp4_parser.yy"
475 { yyoutput << yysym.value.template as < ElementPtr > (); }
476#line 477 "dhcp4_parser.cc"
477 break;
478
479 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
480#line 313 "dhcp4_parser.yy"
481 { yyoutput << yysym.value.template as < ElementPtr > (); }
482#line 483 "dhcp4_parser.cc"
483 break;
484
485 case symbol_kind::S_auth_type_value: // auth_type_value
486#line 313 "dhcp4_parser.yy"
487 { yyoutput << yysym.value.template as < ElementPtr > (); }
488#line 489 "dhcp4_parser.cc"
489 break;
490
491 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
492#line 313 "dhcp4_parser.yy"
493 { yyoutput << yysym.value.template as < ElementPtr > (); }
494#line 495 "dhcp4_parser.cc"
495 break;
496
497 default:
498 break;
499 }
500 yyo << ')';
501 }
502 }
503#endif
504
505 void
506 Dhcp4Parser::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
507 {
508 if (m)
509 YY_SYMBOL_PRINT (m, sym);
510 yystack_.push (YY_MOVE (sym));
511 }
512
513 void
514 Dhcp4Parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
515 {
516#if 201103L <= YY_CPLUSPLUS
517 yypush_ (m, stack_symbol_type (s, std::move (sym)));
518#else
519 stack_symbol_type ss (s, sym);
520 yypush_ (m, ss);
521#endif
522 }
523
524 void
525 Dhcp4Parser::yypop_ (int n) YY_NOEXCEPT
526 {
527 yystack_.pop (n);
528 }
529
530#if PARSER4_DEBUG
531 std::ostream&
532 Dhcp4Parser::debug_stream () const
533 {
534 return *yycdebug_;
535 }
536
537 void
538 Dhcp4Parser::set_debug_stream (std::ostream& o)
539 {
540 yycdebug_ = &o;
541 }
542
543
544 Dhcp4Parser::debug_level_type
545 Dhcp4Parser::debug_level () const
546 {
547 return yydebug_;
548 }
549
550 void
551 Dhcp4Parser::set_debug_level (debug_level_type l)
552 {
553 yydebug_ = l;
554 }
555#endif // PARSER4_DEBUG
556
557 Dhcp4Parser::state_type
558 Dhcp4Parser::yy_lr_goto_state_ (state_type yystate, int yysym)
559 {
560 int yyr = yypgoto_[yysym - YYNTOKENS] + yystate;
561 if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
562 return yytable_[yyr];
563 else
564 return yydefgoto_[yysym - YYNTOKENS];
565 }
566
567 bool
568 Dhcp4Parser::yy_pact_value_is_default_ (int yyvalue) YY_NOEXCEPT
569 {
570 return yyvalue == yypact_ninf_;
571 }
572
573 bool
574 Dhcp4Parser::yy_table_value_is_error_ (int yyvalue) YY_NOEXCEPT
575 {
576 return yyvalue == yytable_ninf_;
577 }
578
579 int
581 {
582 return parse ();
583 }
584
585 int
587 {
588 int yyn;
590 int yylen = 0;
591
592 // Error handling.
593 int yynerrs_ = 0;
594 int yyerrstatus_ = 0;
595
597 symbol_type yyla;
598
600 stack_symbol_type yyerror_range[3];
601
603 int yyresult;
604
605#if YY_EXCEPTIONS
606 try
607#endif // YY_EXCEPTIONS
608 {
609 YYCDEBUG << "Starting parse\n";
610
611
612 /* Initialize the stack. The initial state will be set in
613 yynewstate, since the latter expects the semantical and the
614 location values to have been already stored, initialize these
615 stacks with a primary value. */
616 yystack_.clear ();
617 yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
618
619 /*-----------------------------------------------.
620 | yynewstate -- push a new symbol on the stack. |
621 `-----------------------------------------------*/
622 yynewstate:
623 YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
625
626 // Accept?
627 if (yystack_[0].state == yyfinal_)
628 YYACCEPT;
629
630 goto yybackup;
631
632
633 /*-----------.
634 | yybackup. |
635 `-----------*/
636 yybackup:
637 // Try to take a decision without lookahead.
638 yyn = yypact_[+yystack_[0].state];
639 if (yy_pact_value_is_default_ (yyn))
640 goto yydefault;
641
642 // Read a lookahead token.
643 if (yyla.empty ())
644 {
645 YYCDEBUG << "Reading a token\n";
646#if YY_EXCEPTIONS
647 try
648#endif // YY_EXCEPTIONS
649 {
650 symbol_type yylookahead (yylex (ctx));
651 yyla.move (yylookahead);
652 }
653#if YY_EXCEPTIONS
654 catch (const syntax_error& yyexc)
655 {
656 YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
657 error (yyexc);
658 goto yyerrlab1;
659 }
660#endif // YY_EXCEPTIONS
661 }
662 YY_SYMBOL_PRINT ("Next token is", yyla);
663
664 if (yyla.kind () == symbol_kind::S_YYerror)
665 {
666 // The scanner already issued an error message, process directly
667 // to error recovery. But do not keep the error token as
668 // lookahead, it is too special and may lead us to an endless
669 // loop in error recovery. */
670 yyla.kind_ = symbol_kind::S_YYUNDEF;
671 goto yyerrlab1;
672 }
673
674 /* If the proper action on seeing token YYLA.TYPE is to reduce or
675 to detect an error, take that action. */
676 yyn += yyla.kind ();
677 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ())
678 {
679 goto yydefault;
680 }
681
682 // Reduce or error.
683 yyn = yytable_[yyn];
684 if (yyn <= 0)
685 {
686 if (yy_table_value_is_error_ (yyn))
687 goto yyerrlab;
688 yyn = -yyn;
689 goto yyreduce;
690 }
691
692 // Count tokens shifted since error; after three, turn off error status.
693 if (yyerrstatus_)
694 --yyerrstatus_;
695
696 // Shift the lookahead token.
697 yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla));
698 goto yynewstate;
699
700
701 /*-----------------------------------------------------------.
702 | yydefault -- do the default action for the current state. |
703 `-----------------------------------------------------------*/
704 yydefault:
705 yyn = yydefact_[+yystack_[0].state];
706 if (yyn == 0)
707 goto yyerrlab;
708 goto yyreduce;
709
710
711 /*-----------------------------.
712 | yyreduce -- do a reduction. |
713 `-----------------------------*/
714 yyreduce:
715 yylen = yyr2_[yyn];
716 {
717 stack_symbol_type yylhs;
718 yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);
719 /* Variants are always initialized to an empty instance of the
720 correct type. The default '$$ = $1' action is NOT applied
721 when using variants. */
722 switch (yyr1_[yyn])
723 {
724 case symbol_kind::S_value: // value
725 case symbol_kind::S_map_value: // map_value
726 case symbol_kind::S_ddns_replace_client_name_value: // ddns_replace_client_name_value
727 case symbol_kind::S_ddns_conflict_resolution_mode_value: // ddns_conflict_resolution_mode_value
728 case symbol_kind::S_socket_type: // socket_type
729 case symbol_kind::S_outbound_interface_value: // outbound_interface_value
730 case symbol_kind::S_on_fail_mode: // on_fail_mode
731 case symbol_kind::S_control_socket_type_value: // control_socket_type_value
732 case symbol_kind::S_auth_type_value: // auth_type_value
733 case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
734 yylhs.value.emplace< ElementPtr > ();
735 break;
736
737 case symbol_kind::S_BOOLEAN: // "boolean"
738 yylhs.value.emplace< bool > ();
739 break;
740
741 case symbol_kind::S_FLOAT: // "floating point"
742 yylhs.value.emplace< double > ();
743 break;
744
745 case symbol_kind::S_INTEGER: // "integer"
746 yylhs.value.emplace< int64_t > ();
747 break;
748
749 case symbol_kind::S_STRING: // "constant string"
750 yylhs.value.emplace< std::string > ();
751 break;
752
753 default:
754 break;
755 }
756
757
758 // Default location.
759 {
760 stack_type::slice range (yystack_, yylen);
761 YYLLOC_DEFAULT (yylhs.location, range, yylen);
762 yyerror_range[1].location = yylhs.location;
763 }
764
765 // Perform the reduction.
766 YY_REDUCE_PRINT (yyn);
767#if YY_EXCEPTIONS
768 try
769#endif // YY_EXCEPTIONS
770 {
771 switch (yyn)
772 {
773 case 2: // $@1: %empty
774#line 322 "dhcp4_parser.yy"
775 { ctx.ctx_ = ctx.NO_KEYWORD; }
776#line 777 "dhcp4_parser.cc"
777 break;
778
779 case 4: // $@2: %empty
780#line 323 "dhcp4_parser.yy"
781 { ctx.ctx_ = ctx.CONFIG; }
782#line 783 "dhcp4_parser.cc"
783 break;
784
785 case 6: // $@3: %empty
786#line 324 "dhcp4_parser.yy"
787 { ctx.ctx_ = ctx.DHCP4; }
788#line 789 "dhcp4_parser.cc"
789 break;
790
791 case 8: // $@4: %empty
792#line 325 "dhcp4_parser.yy"
793 { ctx.ctx_ = ctx.INTERFACES_CONFIG; }
794#line 795 "dhcp4_parser.cc"
795 break;
796
797 case 10: // $@5: %empty
798#line 326 "dhcp4_parser.yy"
799 { ctx.ctx_ = ctx.SUBNET4; }
800#line 801 "dhcp4_parser.cc"
801 break;
802
803 case 12: // $@6: %empty
804#line 327 "dhcp4_parser.yy"
805 { ctx.ctx_ = ctx.POOLS; }
806#line 807 "dhcp4_parser.cc"
807 break;
808
809 case 14: // $@7: %empty
810#line 328 "dhcp4_parser.yy"
811 { ctx.ctx_ = ctx.RESERVATIONS; }
812#line 813 "dhcp4_parser.cc"
813 break;
814
815 case 16: // $@8: %empty
816#line 329 "dhcp4_parser.yy"
817 { ctx.ctx_ = ctx.DHCP4; }
818#line 819 "dhcp4_parser.cc"
819 break;
820
821 case 18: // $@9: %empty
822#line 330 "dhcp4_parser.yy"
823 { ctx.ctx_ = ctx.OPTION_DEF; }
824#line 825 "dhcp4_parser.cc"
825 break;
826
827 case 20: // $@10: %empty
828#line 331 "dhcp4_parser.yy"
829 { ctx.ctx_ = ctx.OPTION_DATA; }
830#line 831 "dhcp4_parser.cc"
831 break;
832
833 case 22: // $@11: %empty
834#line 332 "dhcp4_parser.yy"
835 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; }
836#line 837 "dhcp4_parser.cc"
837 break;
838
839 case 24: // $@12: %empty
840#line 333 "dhcp4_parser.yy"
841 { ctx.ctx_ = ctx.DHCP_DDNS; }
842#line 843 "dhcp4_parser.cc"
843 break;
844
845 case 26: // $@13: %empty
846#line 334 "dhcp4_parser.yy"
847 { ctx.ctx_ = ctx.CONFIG_CONTROL; }
848#line 849 "dhcp4_parser.cc"
849 break;
850
851 case 28: // value: "integer"
852#line 342 "dhcp4_parser.yy"
853 { yylhs.value.as < ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); }
854#line 855 "dhcp4_parser.cc"
855 break;
856
857 case 29: // value: "floating point"
858#line 343 "dhcp4_parser.yy"
859 { yylhs.value.as < ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location))); }
860#line 861 "dhcp4_parser.cc"
861 break;
862
863 case 30: // value: "boolean"
864#line 344 "dhcp4_parser.yy"
865 { yylhs.value.as < ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); }
866#line 867 "dhcp4_parser.cc"
867 break;
868
869 case 31: // value: "constant string"
870#line 345 "dhcp4_parser.yy"
871 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); }
872#line 873 "dhcp4_parser.cc"
873 break;
874
875 case 32: // value: "null"
876#line 346 "dhcp4_parser.yy"
877 { yylhs.value.as < ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
878#line 879 "dhcp4_parser.cc"
879 break;
880
881 case 33: // value: map2
882#line 347 "dhcp4_parser.yy"
883 { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
884#line 885 "dhcp4_parser.cc"
885 break;
886
887 case 34: // value: list_generic
888#line 348 "dhcp4_parser.yy"
889 { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
890#line 891 "dhcp4_parser.cc"
891 break;
892
893 case 35: // sub_json: value
894#line 351 "dhcp4_parser.yy"
895 {
896 // Push back the JSON value on the stack
897 ctx.stack_.push_back(yystack_[0].value.as < ElementPtr > ());
898}
899#line 900 "dhcp4_parser.cc"
900 break;
901
902 case 36: // $@14: %empty
903#line 356 "dhcp4_parser.yy"
904 {
905 // This code is executed when we're about to start parsing
906 // the content of the map
907 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
908 ctx.stack_.push_back(m);
909}
910#line 911 "dhcp4_parser.cc"
911 break;
912
913 case 37: // map2: "{" $@14 map_content "}"
914#line 361 "dhcp4_parser.yy"
915 {
916 // map parsing completed. If we ever want to do any wrap up
917 // (maybe some sanity checking), this would be the best place
918 // for it.
919}
920#line 921 "dhcp4_parser.cc"
921 break;
922
923 case 38: // map_value: map2
924#line 367 "dhcp4_parser.yy"
925 { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
926#line 927 "dhcp4_parser.cc"
927 break;
928
929 case 41: // not_empty_map: "constant string" ":" value
930#line 374 "dhcp4_parser.yy"
931 {
932 // map containing a single entry
933 ctx.unique(yystack_[2].value.as < std::string > (), ctx.loc2pos(yystack_[2].location));
934 ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
935 }
936#line 937 "dhcp4_parser.cc"
937 break;
938
939 case 42: // not_empty_map: not_empty_map "," "constant string" ":" value
940#line 379 "dhcp4_parser.yy"
941 {
942 // map consisting of a shorter map followed by
943 // comma and string:value
944 ctx.unique(yystack_[2].value.as < std::string > (), ctx.loc2pos(yystack_[2].location));
945 ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
946 }
947#line 948 "dhcp4_parser.cc"
948 break;
949
950 case 43: // not_empty_map: not_empty_map ","
951#line 385 "dhcp4_parser.yy"
952 {
953 ctx.warnAboutExtraCommas(yystack_[0].location);
954 }
955#line 956 "dhcp4_parser.cc"
956 break;
957
958 case 44: // $@15: %empty
959#line 390 "dhcp4_parser.yy"
960 {
961 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
962 ctx.stack_.push_back(l);
963}
964#line 965 "dhcp4_parser.cc"
965 break;
966
967 case 45: // list_generic: "[" $@15 list_content "]"
968#line 393 "dhcp4_parser.yy"
969 {
970 // list parsing complete. Put any sanity checking here
971}
972#line 973 "dhcp4_parser.cc"
973 break;
974
975 case 48: // not_empty_list: value
976#line 401 "dhcp4_parser.yy"
977 {
978 // List consisting of a single element.
979 ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
980 }
981#line 982 "dhcp4_parser.cc"
982 break;
983
984 case 49: // not_empty_list: not_empty_list "," value
985#line 405 "dhcp4_parser.yy"
986 {
987 // List ending with , and a value.
988 ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
989 }
990#line 991 "dhcp4_parser.cc"
991 break;
992
993 case 50: // not_empty_list: not_empty_list ","
994#line 409 "dhcp4_parser.yy"
995 {
996 ctx.warnAboutExtraCommas(yystack_[0].location);
997 }
998#line 999 "dhcp4_parser.cc"
999 break;
1000
1001 case 51: // $@16: %empty
1002#line 415 "dhcp4_parser.yy"
1003 {
1004 // List parsing about to start
1005}
1006#line 1007 "dhcp4_parser.cc"
1007 break;
1008
1009 case 52: // list_strings: "[" $@16 list_strings_content "]"
1010#line 417 "dhcp4_parser.yy"
1011 {
1012 // list parsing complete. Put any sanity checking here
1013 //ctx.stack_.pop_back();
1014}
1015#line 1016 "dhcp4_parser.cc"
1016 break;
1017
1018 case 55: // not_empty_list_strings: "constant string"
1019#line 426 "dhcp4_parser.yy"
1020 {
1021 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1022 ctx.stack_.back()->add(s);
1023 }
1024#line 1025 "dhcp4_parser.cc"
1025 break;
1026
1027 case 56: // not_empty_list_strings: not_empty_list_strings "," "constant string"
1028#line 430 "dhcp4_parser.yy"
1029 {
1030 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1031 ctx.stack_.back()->add(s);
1032 }
1033#line 1034 "dhcp4_parser.cc"
1034 break;
1035
1036 case 57: // not_empty_list_strings: not_empty_list_strings ","
1037#line 434 "dhcp4_parser.yy"
1038 {
1039 ctx.warnAboutExtraCommas(yystack_[0].location);
1040 }
1041#line 1042 "dhcp4_parser.cc"
1042 break;
1043
1044 case 58: // unknown_map_entry: "constant string" ":"
1045#line 444 "dhcp4_parser.yy"
1046 {
1047 const std::string& where = ctx.contextName();
1048 const std::string& keyword = yystack_[1].value.as < std::string > ();
1049 error(yystack_[1].location,
1050 "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
1051}
1052#line 1053 "dhcp4_parser.cc"
1053 break;
1054
1055 case 59: // $@17: %empty
1056#line 453 "dhcp4_parser.yy"
1057 {
1058 // This code is executed when we're about to start parsing
1059 // the content of the map
1060 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1061 ctx.stack_.push_back(m);
1062}
1063#line 1064 "dhcp4_parser.cc"
1064 break;
1065
1066 case 60: // syntax_map: "{" $@17 global_object "}"
1067#line 458 "dhcp4_parser.yy"
1068 {
1069 // map parsing completed. If we ever want to do any wrap up
1070 // (maybe some sanity checking), this would be the best place
1071 // for it.
1072
1073 // Dhcp4 is required
1074 ctx.require("Dhcp4", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
1075}
1076#line 1077 "dhcp4_parser.cc"
1077 break;
1078
1079 case 61: // $@18: %empty
1080#line 468 "dhcp4_parser.yy"
1081 {
1082 // This code is executed when we're about to start parsing
1083 // the content of the map
1084 // Prevent against duplicate.
1085 ctx.unique("Dhcp4", ctx.loc2pos(yystack_[0].location));
1086 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1087 ctx.stack_.back()->set("Dhcp4", m);
1088 ctx.stack_.push_back(m);
1089 ctx.enter(ctx.DHCP4);
1090}
1091#line 1092 "dhcp4_parser.cc"
1092 break;
1093
1094 case 62: // global_object: "Dhcp4" $@18 ":" "{" global_params "}"
1095#line 477 "dhcp4_parser.yy"
1096 {
1097 // No global parameter is required
1098 ctx.stack_.pop_back();
1099 ctx.leave();
1100}
1101#line 1102 "dhcp4_parser.cc"
1102 break;
1103
1104 case 64: // global_object_comma: global_object ","
1105#line 485 "dhcp4_parser.yy"
1106 {
1107 ctx.warnAboutExtraCommas(yystack_[0].location);
1108}
1109#line 1110 "dhcp4_parser.cc"
1110 break;
1111
1112 case 65: // $@19: %empty
1113#line 491 "dhcp4_parser.yy"
1114 {
1115 // Parse the Dhcp4 map
1116 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1117 ctx.stack_.push_back(m);
1118}
1119#line 1120 "dhcp4_parser.cc"
1120 break;
1121
1122 case 66: // sub_dhcp4: "{" $@19 global_params "}"
1123#line 495 "dhcp4_parser.yy"
1124 {
1125 // No global parameter is required
1126 // parsing completed
1127}
1128#line 1129 "dhcp4_parser.cc"
1129 break;
1130
1131 case 69: // global_params: global_params ","
1132#line 502 "dhcp4_parser.yy"
1133 {
1134 ctx.warnAboutExtraCommas(yystack_[0].location);
1135 }
1136#line 1137 "dhcp4_parser.cc"
1137 break;
1138
1139 case 139: // valid_lifetime: "valid-lifetime" ":" "integer"
1140#line 580 "dhcp4_parser.yy"
1141 {
1142 ctx.unique("valid-lifetime", ctx.loc2pos(yystack_[2].location));
1143 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1144 ctx.stack_.back()->set("valid-lifetime", prf);
1145}
1146#line 1147 "dhcp4_parser.cc"
1147 break;
1148
1149 case 140: // min_valid_lifetime: "min-valid-lifetime" ":" "integer"
1150#line 586 "dhcp4_parser.yy"
1151 {
1152 ctx.unique("min-valid-lifetime", ctx.loc2pos(yystack_[2].location));
1153 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1154 ctx.stack_.back()->set("min-valid-lifetime", prf);
1155}
1156#line 1157 "dhcp4_parser.cc"
1157 break;
1158
1159 case 141: // max_valid_lifetime: "max-valid-lifetime" ":" "integer"
1160#line 592 "dhcp4_parser.yy"
1161 {
1162 ctx.unique("max-valid-lifetime", ctx.loc2pos(yystack_[2].location));
1163 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1164 ctx.stack_.back()->set("max-valid-lifetime", prf);
1165}
1166#line 1167 "dhcp4_parser.cc"
1167 break;
1168
1169 case 142: // renew_timer: "renew-timer" ":" "integer"
1170#line 598 "dhcp4_parser.yy"
1171 {
1172 ctx.unique("renew-timer", ctx.loc2pos(yystack_[2].location));
1173 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1174 ctx.stack_.back()->set("renew-timer", prf);
1175}
1176#line 1177 "dhcp4_parser.cc"
1177 break;
1178
1179 case 143: // rebind_timer: "rebind-timer" ":" "integer"
1180#line 604 "dhcp4_parser.yy"
1181 {
1182 ctx.unique("rebind-timer", ctx.loc2pos(yystack_[2].location));
1183 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1184 ctx.stack_.back()->set("rebind-timer", prf);
1185}
1186#line 1187 "dhcp4_parser.cc"
1187 break;
1188
1189 case 144: // calculate_tee_times: "calculate-tee-times" ":" "boolean"
1190#line 610 "dhcp4_parser.yy"
1191 {
1192 ctx.unique("calculate-tee-times", ctx.loc2pos(yystack_[2].location));
1193 ElementPtr ctt(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1194 ctx.stack_.back()->set("calculate-tee-times", ctt);
1195}
1196#line 1197 "dhcp4_parser.cc"
1197 break;
1198
1199 case 145: // t1_percent: "t1-percent" ":" "floating point"
1200#line 616 "dhcp4_parser.yy"
1201 {
1202 ctx.unique("t1-percent", ctx.loc2pos(yystack_[2].location));
1203 ElementPtr t1(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location)));
1204 ctx.stack_.back()->set("t1-percent", t1);
1205}
1206#line 1207 "dhcp4_parser.cc"
1207 break;
1208
1209 case 146: // t2_percent: "t2-percent" ":" "floating point"
1210#line 622 "dhcp4_parser.yy"
1211 {
1212 ctx.unique("t2-percent", ctx.loc2pos(yystack_[2].location));
1213 ElementPtr t2(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location)));
1214 ctx.stack_.back()->set("t2-percent", t2);
1215}
1216#line 1217 "dhcp4_parser.cc"
1217 break;
1218
1219 case 147: // cache_threshold: "cache-threshold" ":" "floating point"
1220#line 628 "dhcp4_parser.yy"
1221 {
1222 ctx.unique("cache-threshold", ctx.loc2pos(yystack_[2].location));
1223 ElementPtr ct(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location)));
1224 ctx.stack_.back()->set("cache-threshold", ct);
1225}
1226#line 1227 "dhcp4_parser.cc"
1227 break;
1228
1229 case 148: // cache_max_age: "cache-max-age" ":" "integer"
1230#line 634 "dhcp4_parser.yy"
1231 {
1232 ctx.unique("cache-max-age", ctx.loc2pos(yystack_[2].location));
1233 ElementPtr cm(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1234 ctx.stack_.back()->set("cache-max-age", cm);
1235}
1236#line 1237 "dhcp4_parser.cc"
1237 break;
1238
1239 case 149: // decline_probation_period: "decline-probation-period" ":" "integer"
1240#line 640 "dhcp4_parser.yy"
1241 {
1242 ctx.unique("decline-probation-period", ctx.loc2pos(yystack_[2].location));
1243 ElementPtr dpp(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1244 ctx.stack_.back()->set("decline-probation-period", dpp);
1245}
1246#line 1247 "dhcp4_parser.cc"
1247 break;
1248
1249 case 150: // $@20: %empty
1250#line 646 "dhcp4_parser.yy"
1251 {
1252 ctx.unique("server-tag", ctx.loc2pos(yystack_[0].location));
1253 ctx.enter(ctx.NO_KEYWORD);
1254}
1255#line 1256 "dhcp4_parser.cc"
1256 break;
1257
1258 case 151: // server_tag: "server-tag" $@20 ":" "constant string"
1259#line 649 "dhcp4_parser.yy"
1260 {
1261 ElementPtr stag(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1262 ctx.stack_.back()->set("server-tag", stag);
1263 ctx.leave();
1264}
1265#line 1266 "dhcp4_parser.cc"
1266 break;
1267
1268 case 152: // parked_packet_limit: "parked-packet-limit" ":" "integer"
1269#line 655 "dhcp4_parser.yy"
1270 {
1271 ctx.unique("parked-packet-limit", ctx.loc2pos(yystack_[2].location));
1272 ElementPtr ppl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1273 ctx.stack_.back()->set("parked-packet-limit", ppl);
1274}
1275#line 1276 "dhcp4_parser.cc"
1276 break;
1277
1278 case 153: // $@21: %empty
1279#line 661 "dhcp4_parser.yy"
1280 {
1281 ctx.unique("allocator", ctx.loc2pos(yystack_[0].location));
1282 ctx.enter(ctx.NO_KEYWORD);
1283}
1284#line 1285 "dhcp4_parser.cc"
1285 break;
1286
1287 case 154: // allocator: "allocator" $@21 ":" "constant string"
1288#line 664 "dhcp4_parser.yy"
1289 {
1290 ElementPtr al(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1291 ctx.stack_.back()->set("allocator", al);
1292 ctx.leave();
1293}
1294#line 1295 "dhcp4_parser.cc"
1295 break;
1296
1297 case 155: // echo_client_id: "echo-client-id" ":" "boolean"
1298#line 670 "dhcp4_parser.yy"
1299 {
1300 ctx.unique("echo-client-id", ctx.loc2pos(yystack_[2].location));
1301 ElementPtr echo(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1302 ctx.stack_.back()->set("echo-client-id", echo);
1303}
1304#line 1305 "dhcp4_parser.cc"
1305 break;
1306
1307 case 156: // match_client_id: "match-client-id" ":" "boolean"
1308#line 676 "dhcp4_parser.yy"
1309 {
1310 ctx.unique("match-client-id", ctx.loc2pos(yystack_[2].location));
1311 ElementPtr match(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1312 ctx.stack_.back()->set("match-client-id", match);
1313}
1314#line 1315 "dhcp4_parser.cc"
1315 break;
1316
1317 case 157: // authoritative: "authoritative" ":" "boolean"
1318#line 682 "dhcp4_parser.yy"
1319 {
1320 ctx.unique("authoritative", ctx.loc2pos(yystack_[2].location));
1321 ElementPtr prf(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1322 ctx.stack_.back()->set("authoritative", prf);
1323}
1324#line 1325 "dhcp4_parser.cc"
1325 break;
1326
1327 case 158: // ddns_send_updates: "ddns-send-updates" ":" "boolean"
1328#line 688 "dhcp4_parser.yy"
1329 {
1330 ctx.unique("ddns-send-updates", ctx.loc2pos(yystack_[2].location));
1331 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1332 ctx.stack_.back()->set("ddns-send-updates", b);
1333}
1334#line 1335 "dhcp4_parser.cc"
1335 break;
1336
1337 case 159: // ddns_override_no_update: "ddns-override-no-update" ":" "boolean"
1338#line 694 "dhcp4_parser.yy"
1339 {
1340 ctx.unique("ddns-override-no-update", ctx.loc2pos(yystack_[2].location));
1341 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1342 ctx.stack_.back()->set("ddns-override-no-update", b);
1343}
1344#line 1345 "dhcp4_parser.cc"
1345 break;
1346
1347 case 160: // ddns_override_client_update: "ddns-override-client-update" ":" "boolean"
1348#line 700 "dhcp4_parser.yy"
1349 {
1350 ctx.unique("ddns-override-client-update", ctx.loc2pos(yystack_[2].location));
1351 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1352 ctx.stack_.back()->set("ddns-override-client-update", b);
1353}
1354#line 1355 "dhcp4_parser.cc"
1355 break;
1356
1357 case 161: // $@22: %empty
1358#line 706 "dhcp4_parser.yy"
1359 {
1360 ctx.enter(ctx.REPLACE_CLIENT_NAME);
1361 ctx.unique("ddns-replace-client-name", ctx.loc2pos(yystack_[0].location));
1362}
1363#line 1364 "dhcp4_parser.cc"
1364 break;
1365
1366 case 162: // ddns_replace_client_name: "ddns-replace-client-name" $@22 ":" ddns_replace_client_name_value
1367#line 709 "dhcp4_parser.yy"
1368 {
1369 ctx.stack_.back()->set("ddns-replace-client-name", yystack_[0].value.as < ElementPtr > ());
1370 ctx.leave();
1371}
1372#line 1373 "dhcp4_parser.cc"
1373 break;
1374
1375 case 163: // ddns_replace_client_name_value: "when-present"
1376#line 715 "dhcp4_parser.yy"
1377 {
1378 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location)));
1379 }
1380#line 1381 "dhcp4_parser.cc"
1381 break;
1382
1383 case 164: // ddns_replace_client_name_value: "never"
1384#line 718 "dhcp4_parser.yy"
1385 {
1386 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
1387 }
1388#line 1389 "dhcp4_parser.cc"
1389 break;
1390
1391 case 165: // ddns_replace_client_name_value: "always"
1392#line 721 "dhcp4_parser.yy"
1393 {
1394 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
1395 }
1396#line 1397 "dhcp4_parser.cc"
1397 break;
1398
1399 case 166: // ddns_replace_client_name_value: "when-not-present"
1400#line 724 "dhcp4_parser.yy"
1401 {
1402 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
1403 }
1404#line 1405 "dhcp4_parser.cc"
1405 break;
1406
1407 case 167: // ddns_replace_client_name_value: "boolean"
1408#line 727 "dhcp4_parser.yy"
1409 {
1410 error(yystack_[0].location, "boolean values for the ddns-replace-client-name are "
1411 "no longer supported");
1412 }
1413#line 1414 "dhcp4_parser.cc"
1414 break;
1415
1416 case 168: // $@23: %empty
1417#line 733 "dhcp4_parser.yy"
1418 {
1419 ctx.unique("ddns-generated-prefix", ctx.loc2pos(yystack_[0].location));
1420 ctx.enter(ctx.NO_KEYWORD);
1421}
1422#line 1423 "dhcp4_parser.cc"
1423 break;
1424
1425 case 169: // ddns_generated_prefix: "ddns-generated-prefix" $@23 ":" "constant string"
1426#line 736 "dhcp4_parser.yy"
1427 {
1428 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1429 ctx.stack_.back()->set("ddns-generated-prefix", s);
1430 ctx.leave();
1431}
1432#line 1433 "dhcp4_parser.cc"
1433 break;
1434
1435 case 170: // $@24: %empty
1436#line 742 "dhcp4_parser.yy"
1437 {
1438 ctx.unique("ddns-qualifying-suffix", ctx.loc2pos(yystack_[0].location));
1439 ctx.enter(ctx.NO_KEYWORD);
1440}
1441#line 1442 "dhcp4_parser.cc"
1442 break;
1443
1444 case 171: // ddns_qualifying_suffix: "ddns-qualifying-suffix" $@24 ":" "constant string"
1445#line 745 "dhcp4_parser.yy"
1446 {
1447 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1448 ctx.stack_.back()->set("ddns-qualifying-suffix", s);
1449 ctx.leave();
1450}
1451#line 1452 "dhcp4_parser.cc"
1452 break;
1453
1454 case 172: // ddns_update_on_renew: "ddns-update-on-renew" ":" "boolean"
1455#line 751 "dhcp4_parser.yy"
1456 {
1457 ctx.unique("ddns-update-on-renew", ctx.loc2pos(yystack_[2].location));
1458 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1459 ctx.stack_.back()->set("ddns-update-on-renew", b);
1460}
1461#line 1462 "dhcp4_parser.cc"
1462 break;
1463
1464 case 173: // ddns_use_conflict_resolution: "ddns-use-conflict-resolution" ":" "boolean"
1465#line 760 "dhcp4_parser.yy"
1466 {
1467 ctx.unique("ddns-use-conflict-resolution", ctx.loc2pos(yystack_[2].location));
1468 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1469 ctx.warning(yystack_[1].location, "ddns-use-conflict-resolution is deprecated. "
1470 "Substituting ddns-conflict-resolution-mode");
1471 ElementPtr mode(new StringElement(b->boolValue() ? "check-with-dhcid"
1472 : "no-check-with-dhcid"));
1473 ctx.stack_.back()->set("ddns-conflict-resolution-mode", mode);
1474}
1475#line 1476 "dhcp4_parser.cc"
1476 break;
1477
1478 case 174: // $@25: %empty
1479#line 770 "dhcp4_parser.yy"
1480 {
1481 ctx.unique("ddns-conflict-resolution-mode", ctx.loc2pos(yystack_[0].location));
1483}
1484#line 1485 "dhcp4_parser.cc"
1485 break;
1486
1487 case 175: // ddns_conflict_resolution_mode: "ddns-conflict-resolution-mode" $@25 ":" ddns_conflict_resolution_mode_value
1488#line 773 "dhcp4_parser.yy"
1489 {
1490 ctx.stack_.back()->set("ddns-conflict-resolution-mode", yystack_[0].value.as < ElementPtr > ());
1491 ctx.leave();
1492}
1493#line 1494 "dhcp4_parser.cc"
1494 break;
1495
1496 case 176: // ddns_conflict_resolution_mode_value: "check-with-dhcid"
1497#line 779 "dhcp4_parser.yy"
1498 {
1499 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("check-with-dhcid", ctx.loc2pos(yystack_[0].location)));
1500 }
1501#line 1502 "dhcp4_parser.cc"
1502 break;
1503
1504 case 177: // ddns_conflict_resolution_mode_value: "no-check-with-dhcid"
1505#line 782 "dhcp4_parser.yy"
1506 {
1507 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("no-check-with-dhcid", ctx.loc2pos(yystack_[0].location)));
1508 }
1509#line 1510 "dhcp4_parser.cc"
1510 break;
1511
1512 case 178: // ddns_conflict_resolution_mode_value: "check-exists-with-dhcid"
1513#line 785 "dhcp4_parser.yy"
1514 {
1515 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("check-exists-with-dhcid", ctx.loc2pos(yystack_[0].location)));
1516 }
1517#line 1518 "dhcp4_parser.cc"
1518 break;
1519
1520 case 179: // ddns_conflict_resolution_mode_value: "no-check-without-dhcid"
1521#line 788 "dhcp4_parser.yy"
1522 {
1523 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("no-check-without-dhcid", ctx.loc2pos(yystack_[0].location)));
1524 }
1525#line 1526 "dhcp4_parser.cc"
1526 break;
1527
1528 case 180: // ddns_ttl_percent: "ddns-ttl-percent" ":" "floating point"
1529#line 793 "dhcp4_parser.yy"
1530 {
1531 ctx.unique("ddns-ttl-percent", ctx.loc2pos(yystack_[2].location));
1532 ElementPtr ttl(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location)));
1533 ctx.stack_.back()->set("ddns-ttl-percent", ttl);
1534}
1535#line 1536 "dhcp4_parser.cc"
1536 break;
1537
1538 case 181: // $@26: %empty
1539#line 799 "dhcp4_parser.yy"
1540 {
1541 ctx.unique("hostname-char-set", ctx.loc2pos(yystack_[0].location));
1542 ctx.enter(ctx.NO_KEYWORD);
1543}
1544#line 1545 "dhcp4_parser.cc"
1545 break;
1546
1547 case 182: // hostname_char_set: "hostname-char-set" $@26 ":" "constant string"
1548#line 802 "dhcp4_parser.yy"
1549 {
1550 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1551 ctx.stack_.back()->set("hostname-char-set", s);
1552 ctx.leave();
1553}
1554#line 1555 "dhcp4_parser.cc"
1555 break;
1556
1557 case 183: // $@27: %empty
1558#line 808 "dhcp4_parser.yy"
1559 {
1560 ctx.unique("hostname-char-replacement", ctx.loc2pos(yystack_[0].location));
1561 ctx.enter(ctx.NO_KEYWORD);
1562}
1563#line 1564 "dhcp4_parser.cc"
1564 break;
1565
1566 case 184: // hostname_char_replacement: "hostname-char-replacement" $@27 ":" "constant string"
1567#line 811 "dhcp4_parser.yy"
1568 {
1569 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1570 ctx.stack_.back()->set("hostname-char-replacement", s);
1571 ctx.leave();
1572}
1573#line 1574 "dhcp4_parser.cc"
1574 break;
1575
1576 case 185: // store_extended_info: "store-extended-info" ":" "boolean"
1577#line 817 "dhcp4_parser.yy"
1578 {
1579 ctx.unique("store-extended-info", ctx.loc2pos(yystack_[2].location));
1580 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1581 ctx.stack_.back()->set("store-extended-info", b);
1582}
1583#line 1584 "dhcp4_parser.cc"
1584 break;
1585
1586 case 186: // statistic_default_sample_count: "statistic-default-sample-count" ":" "integer"
1587#line 823 "dhcp4_parser.yy"
1588 {
1589 ctx.unique("statistic-default-sample-count", ctx.loc2pos(yystack_[2].location));
1590 ElementPtr count(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1591 ctx.stack_.back()->set("statistic-default-sample-count", count);
1592}
1593#line 1594 "dhcp4_parser.cc"
1594 break;
1595
1596 case 187: // statistic_default_sample_age: "statistic-default-sample-age" ":" "integer"
1597#line 829 "dhcp4_parser.yy"
1598 {
1599 ctx.unique("statistic-default-sample-age", ctx.loc2pos(yystack_[2].location));
1600 ElementPtr age(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1601 ctx.stack_.back()->set("statistic-default-sample-age", age);
1602}
1603#line 1604 "dhcp4_parser.cc"
1604 break;
1605
1606 case 188: // early_global_reservations_lookup: "early-global-reservations-lookup" ":" "boolean"
1607#line 835 "dhcp4_parser.yy"
1608 {
1609 ctx.unique("early-global-reservations-lookup", ctx.loc2pos(yystack_[2].location));
1610 ElementPtr early(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1611 ctx.stack_.back()->set("early-global-reservations-lookup", early);
1612}
1613#line 1614 "dhcp4_parser.cc"
1614 break;
1615
1616 case 189: // ip_reservations_unique: "ip-reservations-unique" ":" "boolean"
1617#line 841 "dhcp4_parser.yy"
1618 {
1619 ctx.unique("ip-reservations-unique", ctx.loc2pos(yystack_[2].location));
1620 ElementPtr unique(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1621 ctx.stack_.back()->set("ip-reservations-unique", unique);
1622}
1623#line 1624 "dhcp4_parser.cc"
1624 break;
1625
1626 case 190: // reservations_lookup_first: "reservations-lookup-first" ":" "boolean"
1627#line 847 "dhcp4_parser.yy"
1628 {
1629 ctx.unique("reservations-lookup-first", ctx.loc2pos(yystack_[2].location));
1630 ElementPtr first(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1631 ctx.stack_.back()->set("reservations-lookup-first", first);
1632}
1633#line 1634 "dhcp4_parser.cc"
1634 break;
1635
1636 case 191: // offer_lifetime: "offer-lifetime" ":" "integer"
1637#line 853 "dhcp4_parser.yy"
1638 {
1639 ctx.unique("offer-lifetime", ctx.loc2pos(yystack_[2].location));
1640 ElementPtr offer_lifetime(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1641 ctx.stack_.back()->set("offer-lifetime", offer_lifetime);
1642}
1643#line 1644 "dhcp4_parser.cc"
1644 break;
1645
1646 case 192: // stash_agent_options: "stash-agent-options" ":" "boolean"
1647#line 859 "dhcp4_parser.yy"
1648 {
1649 ctx.unique("stash-agent-options", ctx.loc2pos(yystack_[2].location));
1650 ElementPtr stash(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1651 ctx.stack_.back()->set("stash-agent-options", stash);
1652}
1653#line 1654 "dhcp4_parser.cc"
1654 break;
1655
1656 case 193: // $@28: %empty
1657#line 865 "dhcp4_parser.yy"
1658 {
1659 ctx.unique("interfaces-config", ctx.loc2pos(yystack_[0].location));
1660 ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
1661 ctx.stack_.back()->set("interfaces-config", i);
1662 ctx.stack_.push_back(i);
1663 ctx.enter(ctx.INTERFACES_CONFIG);
1664}
1665#line 1666 "dhcp4_parser.cc"
1666 break;
1667
1668 case 194: // interfaces_config: "interfaces-config" $@28 ":" "{" interfaces_config_params "}"
1669#line 871 "dhcp4_parser.yy"
1670 {
1671 // No interfaces config param is required
1672 ctx.stack_.pop_back();
1673 ctx.leave();
1674}
1675#line 1676 "dhcp4_parser.cc"
1676 break;
1677
1678 case 197: // interfaces_config_params: interfaces_config_params ","
1679#line 879 "dhcp4_parser.yy"
1680 {
1681 ctx.warnAboutExtraCommas(yystack_[0].location);
1682 }
1683#line 1684 "dhcp4_parser.cc"
1684 break;
1685
1686 case 208: // $@29: %empty
1687#line 896 "dhcp4_parser.yy"
1688 {
1689 // Parse the interfaces-config map
1690 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1691 ctx.stack_.push_back(m);
1692}
1693#line 1694 "dhcp4_parser.cc"
1694 break;
1695
1696 case 209: // sub_interfaces4: "{" $@29 interfaces_config_params "}"
1697#line 900 "dhcp4_parser.yy"
1698 {
1699 // No interfaces config param is required
1700 // parsing completed
1701}
1702#line 1703 "dhcp4_parser.cc"
1703 break;
1704
1705 case 210: // $@30: %empty
1706#line 905 "dhcp4_parser.yy"
1707 {
1708 ctx.unique("interfaces", ctx.loc2pos(yystack_[0].location));
1709 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
1710 ctx.stack_.back()->set("interfaces", l);
1711 ctx.stack_.push_back(l);
1712 ctx.enter(ctx.NO_KEYWORD);
1713}
1714#line 1715 "dhcp4_parser.cc"
1715 break;
1716
1717 case 211: // interfaces_list: "interfaces" $@30 ":" list_strings
1718#line 911 "dhcp4_parser.yy"
1719 {
1720 ctx.stack_.pop_back();
1721 ctx.leave();
1722}
1723#line 1724 "dhcp4_parser.cc"
1724 break;
1725
1726 case 212: // $@31: %empty
1727#line 916 "dhcp4_parser.yy"
1728 {
1729 ctx.unique("dhcp-socket-type", ctx.loc2pos(yystack_[0].location));
1730 ctx.enter(ctx.DHCP_SOCKET_TYPE);
1731}
1732#line 1733 "dhcp4_parser.cc"
1733 break;
1734
1735 case 213: // dhcp_socket_type: "dhcp-socket-type" $@31 ":" socket_type
1736#line 919 "dhcp4_parser.yy"
1737 {
1738 ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as < ElementPtr > ());
1739 ctx.leave();
1740}
1741#line 1742 "dhcp4_parser.cc"
1742 break;
1743
1744 case 214: // socket_type: "raw"
1745#line 924 "dhcp4_parser.yy"
1746 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); }
1747#line 1748 "dhcp4_parser.cc"
1748 break;
1749
1750 case 215: // socket_type: "udp"
1751#line 925 "dhcp4_parser.yy"
1752 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); }
1753#line 1754 "dhcp4_parser.cc"
1754 break;
1755
1756 case 216: // $@32: %empty
1757#line 928 "dhcp4_parser.yy"
1758 {
1759 ctx.unique("outbound-interface", ctx.loc2pos(yystack_[0].location));
1760 ctx.enter(ctx.OUTBOUND_INTERFACE);
1761}
1762#line 1763 "dhcp4_parser.cc"
1763 break;
1764
1765 case 217: // outbound_interface: "outbound-interface" $@32 ":" outbound_interface_value
1766#line 931 "dhcp4_parser.yy"
1767 {
1768 ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as < ElementPtr > ());
1769 ctx.leave();
1770}
1771#line 1772 "dhcp4_parser.cc"
1772 break;
1773
1774 case 218: // outbound_interface_value: "same-as-inbound"
1775#line 936 "dhcp4_parser.yy"
1776 {
1777 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location)));
1778}
1779#line 1780 "dhcp4_parser.cc"
1780 break;
1781
1782 case 219: // outbound_interface_value: "use-routing"
1783#line 938 "dhcp4_parser.yy"
1784 {
1785 yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location)));
1786 }
1787#line 1788 "dhcp4_parser.cc"
1788 break;
1789
1790 case 220: // re_detect: "re-detect" ":" "boolean"
1791#line 942 "dhcp4_parser.yy"
1792 {
1793 ctx.unique("re-detect", ctx.loc2pos(yystack_[2].location));
1794 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1795 ctx.stack_.back()->set("re-detect", b);
1796}
1797#line 1798 "dhcp4_parser.cc"
1798 break;
1799
1800 case 221: // service_sockets_require_all: "service-sockets-require-all" ":" "boolean"
1801#line 948 "dhcp4_parser.yy"
1802 {
1803 ctx.unique("service-sockets-require-all", ctx.loc2pos(yystack_[2].location));
1804 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
1805 ctx.stack_.back()->set("service-sockets-require-all", b);
1806}
1807#line 1808 "dhcp4_parser.cc"
1808 break;
1809
1810 case 222: // service_sockets_retry_wait_time: "service-sockets-retry-wait-time" ":" "integer"
1811#line 954 "dhcp4_parser.yy"
1812 {
1813 ctx.unique("service-sockets-retry-wait-time", ctx.loc2pos(yystack_[2].location));
1814 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1815 ctx.stack_.back()->set("service-sockets-retry-wait-time", n);
1816}
1817#line 1818 "dhcp4_parser.cc"
1818 break;
1819
1820 case 223: // service_sockets_max_retries: "service-sockets-max-retries" ":" "integer"
1821#line 960 "dhcp4_parser.yy"
1822 {
1823 ctx.unique("service-sockets-max-retries", ctx.loc2pos(yystack_[2].location));
1824 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
1825 ctx.stack_.back()->set("service-sockets-max-retries", n);
1826}
1827#line 1828 "dhcp4_parser.cc"
1828 break;
1829
1830 case 224: // $@33: %empty
1831#line 966 "dhcp4_parser.yy"
1832 {
1833 ctx.unique("lease-database", ctx.loc2pos(yystack_[0].location));
1834 ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
1835 ctx.stack_.back()->set("lease-database", i);
1836 ctx.stack_.push_back(i);
1837 ctx.enter(ctx.LEASE_DATABASE);
1838}
1839#line 1840 "dhcp4_parser.cc"
1840 break;
1841
1842 case 225: // lease_database: "lease-database" $@33 ":" "{" database_map_params "}"
1843#line 972 "dhcp4_parser.yy"
1844 {
1845 // The type parameter is required
1846 ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
1847 ctx.stack_.pop_back();
1848 ctx.leave();
1849}
1850#line 1851 "dhcp4_parser.cc"
1851 break;
1852
1853 case 226: // $@34: %empty
1854#line 979 "dhcp4_parser.yy"
1855 {
1856 ctx.unique("sanity-checks", ctx.loc2pos(yystack_[0].location));
1857 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1858 ctx.stack_.back()->set("sanity-checks", m);
1859 ctx.stack_.push_back(m);
1860 ctx.enter(ctx.SANITY_CHECKS);
1861}
1862#line 1863 "dhcp4_parser.cc"
1863 break;
1864
1865 case 227: // sanity_checks: "sanity-checks" $@34 ":" "{" sanity_checks_params "}"
1866#line 985 "dhcp4_parser.yy"
1867 {
1868 ctx.stack_.pop_back();
1869 ctx.leave();
1870}
1871#line 1872 "dhcp4_parser.cc"
1872 break;
1873
1874 case 230: // sanity_checks_params: sanity_checks_params ","
1875#line 992 "dhcp4_parser.yy"
1876 {
1877 ctx.warnAboutExtraCommas(yystack_[0].location);
1878 }
1879#line 1880 "dhcp4_parser.cc"
1880 break;
1881
1882 case 233: // $@35: %empty
1883#line 1001 "dhcp4_parser.yy"
1884 {
1885 ctx.unique("lease-checks", ctx.loc2pos(yystack_[0].location));
1886 ctx.enter(ctx.NO_KEYWORD);
1887}
1888#line 1889 "dhcp4_parser.cc"
1889 break;
1890
1891 case 234: // lease_checks: "lease-checks" $@35 ":" "constant string"
1892#line 1004 "dhcp4_parser.yy"
1893 {
1894
1895 if ( (string(yystack_[0].value.as < std::string > ()) == "none") ||
1896 (string(yystack_[0].value.as < std::string > ()) == "warn") ||
1897 (string(yystack_[0].value.as < std::string > ()) == "fix") ||
1898 (string(yystack_[0].value.as < std::string > ()) == "fix-del") ||
1899 (string(yystack_[0].value.as < std::string > ()) == "del")) {
1900 ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1901 ctx.stack_.back()->set("lease-checks", user);
1902 ctx.leave();
1903 } else {
1904 error(yystack_[0].location, "Unsupported 'lease-checks value: " + string(yystack_[0].value.as < std::string > ()) +
1905 ", supported values are: none, warn, fix, fix-del, del");
1906 }
1907}
1908#line 1909 "dhcp4_parser.cc"
1909 break;
1910
1911 case 235: // $@36: %empty
1912#line 1020 "dhcp4_parser.yy"
1913 {
1914 ctx.unique("extended-info-checks", ctx.loc2pos(yystack_[0].location));
1915 ctx.enter(ctx.NO_KEYWORD);
1916}
1917#line 1918 "dhcp4_parser.cc"
1918 break;
1919
1920 case 236: // extended_info_checks: "extended-info-checks" $@36 ":" "constant string"
1921#line 1023 "dhcp4_parser.yy"
1922 {
1923
1924 if ( (string(yystack_[0].value.as < std::string > ()) == "none") ||
1925 (string(yystack_[0].value.as < std::string > ()) == "fix") ||
1926 (string(yystack_[0].value.as < std::string > ()) == "strict") ||
1927 (string(yystack_[0].value.as < std::string > ()) == "pedantic")) {
1928 ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
1929 ctx.stack_.back()->set("extended-info-checks", user);
1930 ctx.leave();
1931 } else {
1932 error(yystack_[0].location, "Unsupported 'extended-info-checks value: " + string(yystack_[0].value.as < std::string > ()) +
1933 ", supported values are: none, fix, strict, pedantic");
1934 }
1935}
1936#line 1937 "dhcp4_parser.cc"
1937 break;
1938
1939 case 237: // $@37: %empty
1940#line 1038 "dhcp4_parser.yy"
1941 {
1942 ctx.unique("hosts-database", ctx.loc2pos(yystack_[0].location));
1943 ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
1944 ctx.stack_.back()->set("hosts-database", i);
1945 ctx.stack_.push_back(i);
1946 ctx.enter(ctx.HOSTS_DATABASE);
1947}
1948#line 1949 "dhcp4_parser.cc"
1949 break;
1950
1951 case 238: // hosts_database: "hosts-database" $@37 ":" "{" database_map_params "}"
1952#line 1044 "dhcp4_parser.yy"
1953 {
1954 // The type parameter is required
1955 ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
1956 ctx.stack_.pop_back();
1957 ctx.leave();
1958}
1959#line 1960 "dhcp4_parser.cc"
1960 break;
1961
1962 case 239: // $@38: %empty
1963#line 1051 "dhcp4_parser.yy"
1964 {
1965 ctx.unique("hosts-databases", ctx.loc2pos(yystack_[0].location));
1966 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
1967 ctx.stack_.back()->set("hosts-databases", l);
1968 ctx.stack_.push_back(l);
1969 ctx.enter(ctx.HOSTS_DATABASE);
1970}
1971#line 1972 "dhcp4_parser.cc"
1972 break;
1973
1974 case 240: // hosts_databases: "hosts-databases" $@38 ":" "[" database_list "]"
1975#line 1057 "dhcp4_parser.yy"
1976 {
1977 ctx.stack_.pop_back();
1978 ctx.leave();
1979}
1980#line 1981 "dhcp4_parser.cc"
1981 break;
1982
1983 case 245: // not_empty_database_list: not_empty_database_list ","
1984#line 1068 "dhcp4_parser.yy"
1985 {
1986 ctx.warnAboutExtraCommas(yystack_[0].location);
1987 }
1988#line 1989 "dhcp4_parser.cc"
1989 break;
1990
1991 case 246: // $@39: %empty
1992#line 1073 "dhcp4_parser.yy"
1993 {
1994 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
1995 ctx.stack_.back()->add(m);
1996 ctx.stack_.push_back(m);
1997}
1998#line 1999 "dhcp4_parser.cc"
1999 break;
2000
2001 case 247: // database: "{" $@39 database_map_params "}"
2002#line 1077 "dhcp4_parser.yy"
2003 {
2004 // The type parameter is required
2005 ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
2006 ctx.stack_.pop_back();
2007}
2008#line 2009 "dhcp4_parser.cc"
2009 break;
2010
2011 case 250: // database_map_params: database_map_params ","
2012#line 1085 "dhcp4_parser.yy"
2013 {
2014 ctx.warnAboutExtraCommas(yystack_[0].location);
2015 }
2016#line 2017 "dhcp4_parser.cc"
2017 break;
2018
2019 case 274: // $@40: %empty
2020#line 1115 "dhcp4_parser.yy"
2021 {
2022 ctx.unique("type", ctx.loc2pos(yystack_[0].location));
2023 ctx.enter(ctx.NO_KEYWORD);
2024}
2025#line 2026 "dhcp4_parser.cc"
2026 break;
2027
2028 case 275: // database_type: "type" $@40 ":" "constant string"
2029#line 1118 "dhcp4_parser.yy"
2030 {
2031 ElementPtr db_type(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2032 ctx.stack_.back()->set("type", db_type);
2033 ctx.leave();
2034}
2035#line 2036 "dhcp4_parser.cc"
2036 break;
2037
2038 case 276: // $@41: %empty
2039#line 1124 "dhcp4_parser.yy"
2040 {
2041 ctx.unique("user", ctx.loc2pos(yystack_[0].location));
2042 ctx.enter(ctx.NO_KEYWORD);
2043}
2044#line 2045 "dhcp4_parser.cc"
2045 break;
2046
2047 case 277: // user: "user" $@41 ":" "constant string"
2048#line 1127 "dhcp4_parser.yy"
2049 {
2050 ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2051 ctx.stack_.back()->set("user", user);
2052 ctx.leave();
2053}
2054#line 2055 "dhcp4_parser.cc"
2055 break;
2056
2057 case 278: // $@42: %empty
2058#line 1133 "dhcp4_parser.yy"
2059 {
2060 ctx.unique("password", ctx.loc2pos(yystack_[0].location));
2061 ctx.enter(ctx.NO_KEYWORD);
2062}
2063#line 2064 "dhcp4_parser.cc"
2064 break;
2065
2066 case 279: // password: "password" $@42 ":" "constant string"
2067#line 1136 "dhcp4_parser.yy"
2068 {
2069 ElementPtr pwd(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2070 ctx.stack_.back()->set("password", pwd);
2071 ctx.leave();
2072}
2073#line 2074 "dhcp4_parser.cc"
2074 break;
2075
2076 case 280: // $@43: %empty
2077#line 1142 "dhcp4_parser.yy"
2078 {
2079 ctx.unique("host", ctx.loc2pos(yystack_[0].location));
2080 ctx.enter(ctx.NO_KEYWORD);
2081}
2082#line 2083 "dhcp4_parser.cc"
2083 break;
2084
2085 case 281: // host: "host" $@43 ":" "constant string"
2086#line 1145 "dhcp4_parser.yy"
2087 {
2088 ElementPtr h(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2089 ctx.stack_.back()->set("host", h);
2090 ctx.leave();
2091}
2092#line 2093 "dhcp4_parser.cc"
2093 break;
2094
2095 case 282: // port: "port" ":" "integer"
2096#line 1151 "dhcp4_parser.yy"
2097 {
2098 ctx.unique("port", ctx.loc2pos(yystack_[2].location));
2099 ElementPtr p(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2100 ctx.stack_.back()->set("port", p);
2101}
2102#line 2103 "dhcp4_parser.cc"
2103 break;
2104
2105 case 283: // $@44: %empty
2106#line 1157 "dhcp4_parser.yy"
2107 {
2108 ctx.unique("name", ctx.loc2pos(yystack_[0].location));
2109 ctx.enter(ctx.NO_KEYWORD);
2110}
2111#line 2112 "dhcp4_parser.cc"
2112 break;
2113
2114 case 284: // name: "name" $@44 ":" "constant string"
2115#line 1160 "dhcp4_parser.yy"
2116 {
2117 ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2118 ctx.stack_.back()->set("name", name);
2119 ctx.leave();
2120}
2121#line 2122 "dhcp4_parser.cc"
2122 break;
2123
2124 case 285: // persist: "persist" ":" "boolean"
2125#line 1166 "dhcp4_parser.yy"
2126 {
2127 ctx.unique("persist", ctx.loc2pos(yystack_[2].location));
2128 ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2129 ctx.stack_.back()->set("persist", n);
2130}
2131#line 2132 "dhcp4_parser.cc"
2132 break;
2133
2134 case 286: // lfc_interval: "lfc-interval" ":" "integer"
2135#line 1172 "dhcp4_parser.yy"
2136 {
2137 ctx.unique("lfc-interval", ctx.loc2pos(yystack_[2].location));
2138 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2139 ctx.stack_.back()->set("lfc-interval", n);
2140}
2141#line 2142 "dhcp4_parser.cc"
2142 break;
2143
2144 case 287: // readonly: "readonly" ":" "boolean"
2145#line 1178 "dhcp4_parser.yy"
2146 {
2147 ctx.unique("readonly", ctx.loc2pos(yystack_[2].location));
2148 ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2149 ctx.stack_.back()->set("readonly", n);
2150}
2151#line 2152 "dhcp4_parser.cc"
2152 break;
2153
2154 case 288: // connect_timeout: "connect-timeout" ":" "integer"
2155#line 1184 "dhcp4_parser.yy"
2156 {
2157 ctx.unique("connect-timeout", ctx.loc2pos(yystack_[2].location));
2158 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2159 ctx.stack_.back()->set("connect-timeout", n);
2160}
2161#line 2162 "dhcp4_parser.cc"
2162 break;
2163
2164 case 289: // read_timeout: "read-timeout" ":" "integer"
2165#line 1190 "dhcp4_parser.yy"
2166 {
2167 ctx.unique("read-timeout", ctx.loc2pos(yystack_[2].location));
2168 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2169 ctx.stack_.back()->set("read-timeout", n);
2170}
2171#line 2172 "dhcp4_parser.cc"
2172 break;
2173
2174 case 290: // write_timeout: "write-timeout" ":" "integer"
2175#line 1196 "dhcp4_parser.yy"
2176 {
2177 ctx.unique("write-timeout", ctx.loc2pos(yystack_[2].location));
2178 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2179 ctx.stack_.back()->set("write-timeout", n);
2180}
2181#line 2182 "dhcp4_parser.cc"
2182 break;
2183
2184 case 291: // tcp_user_timeout: "tcp-user-timeout" ":" "integer"
2185#line 1202 "dhcp4_parser.yy"
2186 {
2187 ctx.unique("tcp-user-timeout", ctx.loc2pos(yystack_[2].location));
2188 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2189 ctx.stack_.back()->set("tcp-user-timeout", n);
2190}
2191#line 2192 "dhcp4_parser.cc"
2192 break;
2193
2194 case 292: // max_reconnect_tries: "max-reconnect-tries" ":" "integer"
2195#line 1208 "dhcp4_parser.yy"
2196 {
2197 ctx.unique("max-reconnect-tries", ctx.loc2pos(yystack_[2].location));
2198 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2199 ctx.stack_.back()->set("max-reconnect-tries", n);
2200}
2201#line 2202 "dhcp4_parser.cc"
2202 break;
2203
2204 case 293: // reconnect_wait_time: "reconnect-wait-time" ":" "integer"
2205#line 1214 "dhcp4_parser.yy"
2206 {
2207 ctx.unique("reconnect-wait-time", ctx.loc2pos(yystack_[2].location));
2208 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2209 ctx.stack_.back()->set("reconnect-wait-time", n);
2210}
2211#line 2212 "dhcp4_parser.cc"
2212 break;
2213
2214 case 294: // $@45: %empty
2215#line 1220 "dhcp4_parser.yy"
2216 {
2217 ctx.unique("on-fail", ctx.loc2pos(yystack_[0].location));
2218 ctx.enter(ctx.DATABASE_ON_FAIL);
2219}
2220#line 2221 "dhcp4_parser.cc"
2221 break;
2222
2223 case 295: // on_fail: "on-fail" $@45 ":" on_fail_mode
2224#line 1223 "dhcp4_parser.yy"
2225 {
2226 ctx.stack_.back()->set("on-fail", yystack_[0].value.as < ElementPtr > ());
2227 ctx.leave();
2228}
2229#line 2230 "dhcp4_parser.cc"
2230 break;
2231
2232 case 296: // on_fail_mode: "stop-retry-exit"
2233#line 1228 "dhcp4_parser.yy"
2234 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("stop-retry-exit", ctx.loc2pos(yystack_[0].location))); }
2235#line 2236 "dhcp4_parser.cc"
2236 break;
2237
2238 case 297: // on_fail_mode: "serve-retry-exit"
2239#line 1229 "dhcp4_parser.yy"
2240 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("serve-retry-exit", ctx.loc2pos(yystack_[0].location))); }
2241#line 2242 "dhcp4_parser.cc"
2242 break;
2243
2244 case 298: // on_fail_mode: "serve-retry-continue"
2245#line 1230 "dhcp4_parser.yy"
2246 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("serve-retry-continue", ctx.loc2pos(yystack_[0].location))); }
2247#line 2248 "dhcp4_parser.cc"
2248 break;
2249
2250 case 299: // retry_on_startup: "retry-on-startup" ":" "boolean"
2251#line 1233 "dhcp4_parser.yy"
2252 {
2253 ctx.unique("retry-on-startup", ctx.loc2pos(yystack_[2].location));
2254 ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2255 ctx.stack_.back()->set("retry-on-startup", n);
2256}
2257#line 2258 "dhcp4_parser.cc"
2258 break;
2259
2260 case 300: // max_row_errors: "max-row-errors" ":" "integer"
2261#line 1239 "dhcp4_parser.yy"
2262 {
2263 ctx.unique("max-row-errors", ctx.loc2pos(yystack_[2].location));
2264 ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2265 ctx.stack_.back()->set("max-row-errors", n);
2266}
2267#line 2268 "dhcp4_parser.cc"
2268 break;
2269
2270 case 301: // $@46: %empty
2271#line 1245 "dhcp4_parser.yy"
2272 {
2273 ctx.unique("trust-anchor", ctx.loc2pos(yystack_[0].location));
2274 ctx.enter(ctx.NO_KEYWORD);
2275}
2276#line 2277 "dhcp4_parser.cc"
2277 break;
2278
2279 case 302: // trust_anchor: "trust-anchor" $@46 ":" "constant string"
2280#line 1248 "dhcp4_parser.yy"
2281 {
2282 ElementPtr ca(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2283 ctx.stack_.back()->set("trust-anchor", ca);
2284 ctx.leave();
2285}
2286#line 2287 "dhcp4_parser.cc"
2287 break;
2288
2289 case 303: // $@47: %empty
2290#line 1254 "dhcp4_parser.yy"
2291 {
2292 ctx.unique("cert-file", ctx.loc2pos(yystack_[0].location));
2293 ctx.enter(ctx.NO_KEYWORD);
2294}
2295#line 2296 "dhcp4_parser.cc"
2296 break;
2297
2298 case 304: // cert_file: "cert-file" $@47 ":" "constant string"
2299#line 1257 "dhcp4_parser.yy"
2300 {
2301 ElementPtr cert(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2302 ctx.stack_.back()->set("cert-file", cert);
2303 ctx.leave();
2304}
2305#line 2306 "dhcp4_parser.cc"
2306 break;
2307
2308 case 305: // $@48: %empty
2309#line 1263 "dhcp4_parser.yy"
2310 {
2311 ctx.unique("key-file", ctx.loc2pos(yystack_[0].location));
2312 ctx.enter(ctx.NO_KEYWORD);
2313}
2314#line 2315 "dhcp4_parser.cc"
2315 break;
2316
2317 case 306: // key_file: "key-file" $@48 ":" "constant string"
2318#line 1266 "dhcp4_parser.yy"
2319 {
2320 ElementPtr key(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2321 ctx.stack_.back()->set("key-file", key);
2322 ctx.leave();
2323}
2324#line 2325 "dhcp4_parser.cc"
2325 break;
2326
2327 case 307: // $@49: %empty
2328#line 1272 "dhcp4_parser.yy"
2329 {
2330 ctx.unique("cipher-list", ctx.loc2pos(yystack_[0].location));
2331 ctx.enter(ctx.NO_KEYWORD);
2332}
2333#line 2334 "dhcp4_parser.cc"
2334 break;
2335
2336 case 308: // cipher_list: "cipher-list" $@49 ":" "constant string"
2337#line 1275 "dhcp4_parser.yy"
2338 {
2339 ElementPtr cl(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2340 ctx.stack_.back()->set("cipher-list", cl);
2341 ctx.leave();
2342}
2343#line 2344 "dhcp4_parser.cc"
2344 break;
2345
2346 case 309: // $@50: %empty
2347#line 1281 "dhcp4_parser.yy"
2348 {
2349 ctx.unique("host-reservation-identifiers", ctx.loc2pos(yystack_[0].location));
2350 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
2351 ctx.stack_.back()->set("host-reservation-identifiers", l);
2352 ctx.stack_.push_back(l);
2354}
2355#line 2356 "dhcp4_parser.cc"
2356 break;
2357
2358 case 310: // host_reservation_identifiers: "host-reservation-identifiers" $@50 ":" "[" host_reservation_identifiers_list "]"
2359#line 1287 "dhcp4_parser.yy"
2360 {
2361 ctx.stack_.pop_back();
2362 ctx.leave();
2363}
2364#line 2365 "dhcp4_parser.cc"
2365 break;
2366
2367 case 313: // host_reservation_identifiers_list: host_reservation_identifiers_list ","
2368#line 1294 "dhcp4_parser.yy"
2369 {
2370 ctx.warnAboutExtraCommas(yystack_[0].location);
2371 }
2372#line 2373 "dhcp4_parser.cc"
2373 break;
2374
2375 case 319: // duid_id: "duid"
2376#line 1306 "dhcp4_parser.yy"
2377 {
2378 ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
2379 ctx.stack_.back()->add(duid);
2380}
2381#line 2382 "dhcp4_parser.cc"
2382 break;
2383
2384 case 320: // hw_address_id: "hw-address"
2385#line 1311 "dhcp4_parser.yy"
2386 {
2387 ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
2388 ctx.stack_.back()->add(hwaddr);
2389}
2390#line 2391 "dhcp4_parser.cc"
2391 break;
2392
2393 case 321: // circuit_id: "circuit-id"
2394#line 1316 "dhcp4_parser.yy"
2395 {
2396 ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location)));
2397 ctx.stack_.back()->add(circuit);
2398}
2399#line 2400 "dhcp4_parser.cc"
2400 break;
2401
2402 case 322: // client_id: "client-id"
2403#line 1321 "dhcp4_parser.yy"
2404 {
2405 ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location)));
2406 ctx.stack_.back()->add(client);
2407}
2408#line 2409 "dhcp4_parser.cc"
2409 break;
2410
2411 case 323: // flex_id: "flex-id"
2412#line 1326 "dhcp4_parser.yy"
2413 {
2414 ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location)));
2415 ctx.stack_.back()->add(flex_id);
2416}
2417#line 2418 "dhcp4_parser.cc"
2418 break;
2419
2420 case 324: // $@51: %empty
2421#line 1333 "dhcp4_parser.yy"
2422 {
2423 ctx.unique("multi-threading", ctx.loc2pos(yystack_[0].location));
2424 ElementPtr mt(new MapElement(ctx.loc2pos(yystack_[0].location)));
2425 ctx.stack_.back()->set("multi-threading", mt);
2426 ctx.stack_.push_back(mt);
2427 ctx.enter(ctx.DHCP_MULTI_THREADING);
2428}
2429#line 2430 "dhcp4_parser.cc"
2430 break;
2431
2432 case 325: // dhcp_multi_threading: "multi-threading" $@51 ":" "{" multi_threading_params "}"
2433#line 1339 "dhcp4_parser.yy"
2434 {
2435 // The enable parameter is required.
2436 ctx.require("enable-multi-threading", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
2437 ctx.stack_.pop_back();
2438 ctx.leave();
2439}
2440#line 2441 "dhcp4_parser.cc"
2441 break;
2442
2443 case 328: // multi_threading_params: multi_threading_params ","
2444#line 1348 "dhcp4_parser.yy"
2445 {
2446 ctx.warnAboutExtraCommas(yystack_[0].location);
2447 }
2448#line 2449 "dhcp4_parser.cc"
2449 break;
2450
2451 case 335: // enable_multi_threading: "enable-multi-threading" ":" "boolean"
2452#line 1361 "dhcp4_parser.yy"
2453 {
2454 ctx.unique("enable-multi-threading", ctx.loc2pos(yystack_[2].location));
2455 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2456 ctx.stack_.back()->set("enable-multi-threading", b);
2457}
2458#line 2459 "dhcp4_parser.cc"
2459 break;
2460
2461 case 336: // thread_pool_size: "thread-pool-size" ":" "integer"
2462#line 1367 "dhcp4_parser.yy"
2463 {
2464 ctx.unique("thread-pool-size", ctx.loc2pos(yystack_[2].location));
2465 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2466 ctx.stack_.back()->set("thread-pool-size", prf);
2467}
2468#line 2469 "dhcp4_parser.cc"
2469 break;
2470
2471 case 337: // packet_queue_size: "packet-queue-size" ":" "integer"
2472#line 1373 "dhcp4_parser.yy"
2473 {
2474 ctx.unique("packet-queue-size", ctx.loc2pos(yystack_[2].location));
2475 ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2476 ctx.stack_.back()->set("packet-queue-size", prf);
2477}
2478#line 2479 "dhcp4_parser.cc"
2479 break;
2480
2481 case 338: // $@52: %empty
2482#line 1379 "dhcp4_parser.yy"
2483 {
2484 ctx.unique("hooks-libraries", ctx.loc2pos(yystack_[0].location));
2485 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
2486 ctx.stack_.back()->set("hooks-libraries", l);
2487 ctx.stack_.push_back(l);
2488 ctx.enter(ctx.HOOKS_LIBRARIES);
2489}
2490#line 2491 "dhcp4_parser.cc"
2491 break;
2492
2493 case 339: // hooks_libraries: "hooks-libraries" $@52 ":" "[" hooks_libraries_list "]"
2494#line 1385 "dhcp4_parser.yy"
2495 {
2496 ctx.stack_.pop_back();
2497 ctx.leave();
2498}
2499#line 2500 "dhcp4_parser.cc"
2500 break;
2501
2502 case 344: // not_empty_hooks_libraries_list: not_empty_hooks_libraries_list ","
2503#line 1396 "dhcp4_parser.yy"
2504 {
2505 ctx.warnAboutExtraCommas(yystack_[0].location);
2506 }
2507#line 2508 "dhcp4_parser.cc"
2508 break;
2509
2510 case 345: // $@53: %empty
2511#line 1401 "dhcp4_parser.yy"
2512 {
2513 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2514 ctx.stack_.back()->add(m);
2515 ctx.stack_.push_back(m);
2516}
2517#line 2518 "dhcp4_parser.cc"
2518 break;
2519
2520 case 346: // hooks_library: "{" $@53 hooks_params "}"
2521#line 1405 "dhcp4_parser.yy"
2522 {
2523 // The library hooks parameter is required
2524 ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
2525 ctx.stack_.pop_back();
2526}
2527#line 2528 "dhcp4_parser.cc"
2528 break;
2529
2530 case 347: // $@54: %empty
2531#line 1411 "dhcp4_parser.yy"
2532 {
2533 // Parse the hooks-libraries list entry map
2534 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2535 ctx.stack_.push_back(m);
2536}
2537#line 2538 "dhcp4_parser.cc"
2538 break;
2539
2540 case 348: // sub_hooks_library: "{" $@54 hooks_params "}"
2541#line 1415 "dhcp4_parser.yy"
2542 {
2543 // The library hooks parameter is required
2544 ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
2545 // parsing completed
2546}
2547#line 2548 "dhcp4_parser.cc"
2548 break;
2549
2550 case 351: // hooks_params: hooks_params ","
2551#line 1423 "dhcp4_parser.yy"
2552 {
2553 ctx.warnAboutExtraCommas(yystack_[0].location);
2554 }
2555#line 2556 "dhcp4_parser.cc"
2556 break;
2557
2558 case 355: // $@55: %empty
2559#line 1433 "dhcp4_parser.yy"
2560 {
2561 ctx.unique("library", ctx.loc2pos(yystack_[0].location));
2562 ctx.enter(ctx.NO_KEYWORD);
2563}
2564#line 2565 "dhcp4_parser.cc"
2565 break;
2566
2567 case 356: // library: "library" $@55 ":" "constant string"
2568#line 1436 "dhcp4_parser.yy"
2569 {
2570 ElementPtr lib(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2571 ctx.stack_.back()->set("library", lib);
2572 ctx.leave();
2573}
2574#line 2575 "dhcp4_parser.cc"
2575 break;
2576
2577 case 357: // $@56: %empty
2578#line 1442 "dhcp4_parser.yy"
2579 {
2580 ctx.unique("parameters", ctx.loc2pos(yystack_[0].location));
2581 ctx.enter(ctx.NO_KEYWORD);
2582}
2583#line 2584 "dhcp4_parser.cc"
2584 break;
2585
2586 case 358: // parameters: "parameters" $@56 ":" map_value
2587#line 1445 "dhcp4_parser.yy"
2588 {
2589 ctx.stack_.back()->set("parameters", yystack_[0].value.as < ElementPtr > ());
2590 ctx.leave();
2591}
2592#line 2593 "dhcp4_parser.cc"
2593 break;
2594
2595 case 359: // $@57: %empty
2596#line 1451 "dhcp4_parser.yy"
2597 {
2598 ctx.unique("expired-leases-processing", ctx.loc2pos(yystack_[0].location));
2599 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2600 ctx.stack_.back()->set("expired-leases-processing", m);
2601 ctx.stack_.push_back(m);
2603}
2604#line 2605 "dhcp4_parser.cc"
2605 break;
2606
2607 case 360: // expired_leases_processing: "expired-leases-processing" $@57 ":" "{" expired_leases_params "}"
2608#line 1457 "dhcp4_parser.yy"
2609 {
2610 // No expired lease parameter is required
2611 ctx.stack_.pop_back();
2612 ctx.leave();
2613}
2614#line 2615 "dhcp4_parser.cc"
2615 break;
2616
2617 case 363: // expired_leases_params: expired_leases_params ","
2618#line 1465 "dhcp4_parser.yy"
2619 {
2620 ctx.warnAboutExtraCommas(yystack_[0].location);
2621 }
2622#line 2623 "dhcp4_parser.cc"
2623 break;
2624
2625 case 370: // reclaim_timer_wait_time: "reclaim-timer-wait-time" ":" "integer"
2626#line 1478 "dhcp4_parser.yy"
2627 {
2628 ctx.unique("reclaim-timer-wait-time", ctx.loc2pos(yystack_[2].location));
2629 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2630 ctx.stack_.back()->set("reclaim-timer-wait-time", value);
2631}
2632#line 2633 "dhcp4_parser.cc"
2633 break;
2634
2635 case 371: // flush_reclaimed_timer_wait_time: "flush-reclaimed-timer-wait-time" ":" "integer"
2636#line 1484 "dhcp4_parser.yy"
2637 {
2638 ctx.unique("flush-reclaimed-timer-wait-time", ctx.loc2pos(yystack_[2].location));
2639 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2640 ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value);
2641}
2642#line 2643 "dhcp4_parser.cc"
2643 break;
2644
2645 case 372: // hold_reclaimed_time: "hold-reclaimed-time" ":" "integer"
2646#line 1490 "dhcp4_parser.yy"
2647 {
2648 ctx.unique("hold-reclaimed-time", ctx.loc2pos(yystack_[2].location));
2649 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2650 ctx.stack_.back()->set("hold-reclaimed-time", value);
2651}
2652#line 2653 "dhcp4_parser.cc"
2653 break;
2654
2655 case 373: // max_reclaim_leases: "max-reclaim-leases" ":" "integer"
2656#line 1496 "dhcp4_parser.yy"
2657 {
2658 ctx.unique("max-reclaim-leases", ctx.loc2pos(yystack_[2].location));
2659 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2660 ctx.stack_.back()->set("max-reclaim-leases", value);
2661}
2662#line 2663 "dhcp4_parser.cc"
2663 break;
2664
2665 case 374: // max_reclaim_time: "max-reclaim-time" ":" "integer"
2666#line 1502 "dhcp4_parser.yy"
2667 {
2668 ctx.unique("max-reclaim-time", ctx.loc2pos(yystack_[2].location));
2669 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2670 ctx.stack_.back()->set("max-reclaim-time", value);
2671}
2672#line 2673 "dhcp4_parser.cc"
2673 break;
2674
2675 case 375: // unwarned_reclaim_cycles: "unwarned-reclaim-cycles" ":" "integer"
2676#line 1508 "dhcp4_parser.yy"
2677 {
2678 ctx.unique("unwarned-reclaim-cycles", ctx.loc2pos(yystack_[2].location));
2679 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2680 ctx.stack_.back()->set("unwarned-reclaim-cycles", value);
2681}
2682#line 2683 "dhcp4_parser.cc"
2683 break;
2684
2685 case 376: // $@58: %empty
2686#line 1517 "dhcp4_parser.yy"
2687 {
2688 ctx.unique("subnet4", ctx.loc2pos(yystack_[0].location));
2689 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
2690 ctx.stack_.back()->set("subnet4", l);
2691 ctx.stack_.push_back(l);
2692 ctx.enter(ctx.SUBNET4);
2693}
2694#line 2695 "dhcp4_parser.cc"
2695 break;
2696
2697 case 377: // subnet4_list: "subnet4" $@58 ":" "[" subnet4_list_content "]"
2698#line 1523 "dhcp4_parser.yy"
2699 {
2700 ctx.stack_.pop_back();
2701 ctx.leave();
2702}
2703#line 2704 "dhcp4_parser.cc"
2704 break;
2705
2706 case 382: // not_empty_subnet4_list: not_empty_subnet4_list ","
2707#line 1537 "dhcp4_parser.yy"
2708 {
2709 ctx.warnAboutExtraCommas(yystack_[0].location);
2710 }
2711#line 2712 "dhcp4_parser.cc"
2712 break;
2713
2714 case 383: // $@59: %empty
2715#line 1546 "dhcp4_parser.yy"
2716 {
2717 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2718 ctx.stack_.back()->add(m);
2719 ctx.stack_.push_back(m);
2720}
2721#line 2722 "dhcp4_parser.cc"
2722 break;
2723
2724 case 384: // subnet4: "{" $@59 subnet4_params "}"
2725#line 1550 "dhcp4_parser.yy"
2726 {
2727 // Once we reached this place, the subnet parsing is now complete.
2728 // If we want to, we can implement default values here.
2729 // In particular we can do things like this:
2730 // if (!ctx.stack_.back()->get("interface")) {
2731 // ctx.stack_.back()->set("interface", StringElement("loopback"));
2732 // }
2733 //
2734 // We can also stack up one level (Dhcp4) and copy over whatever
2735 // global parameters we want to:
2736 // if (!ctx.stack_.back()->get("renew-timer")) {
2737 // ElementPtr renew = ctx_stack_[...].get("renew-timer");
2738 // if (renew) {
2739 // ctx.stack_.back()->set("renew-timer", renew);
2740 // }
2741 // }
2742
2743 // The subnet subnet4 parameter is required
2744 ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
2745 ctx.stack_.pop_back();
2746}
2747#line 2748 "dhcp4_parser.cc"
2748 break;
2749
2750 case 385: // $@60: %empty
2751#line 1572 "dhcp4_parser.yy"
2752 {
2753 // Parse the subnet4 list entry map
2754 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2755 ctx.stack_.push_back(m);
2756}
2757#line 2758 "dhcp4_parser.cc"
2758 break;
2759
2760 case 386: // sub_subnet4: "{" $@60 subnet4_params "}"
2761#line 1576 "dhcp4_parser.yy"
2762 {
2763 // The subnet subnet4 parameter is required
2764 ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
2765 // parsing completed
2766}
2767#line 2768 "dhcp4_parser.cc"
2768 break;
2769
2770 case 389: // subnet4_params: subnet4_params ","
2771#line 1585 "dhcp4_parser.yy"
2772 {
2773 ctx.warnAboutExtraCommas(yystack_[0].location);
2774 }
2775#line 2776 "dhcp4_parser.cc"
2776 break;
2777
2778 case 438: // $@61: %empty
2779#line 1641 "dhcp4_parser.yy"
2780 {
2781 ctx.unique("subnet", ctx.loc2pos(yystack_[0].location));
2782 ctx.enter(ctx.NO_KEYWORD);
2783}
2784#line 2785 "dhcp4_parser.cc"
2785 break;
2786
2787 case 439: // subnet: "subnet" $@61 ":" "constant string"
2788#line 1644 "dhcp4_parser.yy"
2789 {
2790 ElementPtr subnet(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2791 ctx.stack_.back()->set("subnet", subnet);
2792 ctx.leave();
2793}
2794#line 2795 "dhcp4_parser.cc"
2795 break;
2796
2797 case 440: // $@62: %empty
2798#line 1650 "dhcp4_parser.yy"
2799 {
2800 ctx.unique("4o6-interface", ctx.loc2pos(yystack_[0].location));
2801 ctx.enter(ctx.NO_KEYWORD);
2802}
2803#line 2804 "dhcp4_parser.cc"
2804 break;
2805
2806 case 441: // subnet_4o6_interface: "4o6-interface" $@62 ":" "constant string"
2807#line 1653 "dhcp4_parser.yy"
2808 {
2809 ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2810 ctx.stack_.back()->set("4o6-interface", iface);
2811 ctx.leave();
2812}
2813#line 2814 "dhcp4_parser.cc"
2814 break;
2815
2816 case 442: // $@63: %empty
2817#line 1659 "dhcp4_parser.yy"
2818 {
2819 ctx.unique("4o6-interface-id", ctx.loc2pos(yystack_[0].location));
2820 ctx.enter(ctx.NO_KEYWORD);
2821}
2822#line 2823 "dhcp4_parser.cc"
2823 break;
2824
2825 case 443: // subnet_4o6_interface_id: "4o6-interface-id" $@63 ":" "constant string"
2826#line 1662 "dhcp4_parser.yy"
2827 {
2828 ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2829 ctx.stack_.back()->set("4o6-interface-id", iface);
2830 ctx.leave();
2831}
2832#line 2833 "dhcp4_parser.cc"
2833 break;
2834
2835 case 444: // $@64: %empty
2836#line 1668 "dhcp4_parser.yy"
2837 {
2838 ctx.unique("4o6-subnet", ctx.loc2pos(yystack_[0].location));
2839 ctx.enter(ctx.NO_KEYWORD);
2840}
2841#line 2842 "dhcp4_parser.cc"
2842 break;
2843
2844 case 445: // subnet_4o6_subnet: "4o6-subnet" $@64 ":" "constant string"
2845#line 1671 "dhcp4_parser.yy"
2846 {
2847 ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2848 ctx.stack_.back()->set("4o6-subnet", iface);
2849 ctx.leave();
2850}
2851#line 2852 "dhcp4_parser.cc"
2852 break;
2853
2854 case 446: // $@65: %empty
2855#line 1677 "dhcp4_parser.yy"
2856 {
2857 ctx.unique("interface", ctx.loc2pos(yystack_[0].location));
2858 ctx.enter(ctx.NO_KEYWORD);
2859}
2860#line 2861 "dhcp4_parser.cc"
2861 break;
2862
2863 case 447: // interface: "interface" $@65 ":" "constant string"
2864#line 1680 "dhcp4_parser.yy"
2865 {
2866 ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2867 ctx.stack_.back()->set("interface", iface);
2868 ctx.leave();
2869}
2870#line 2871 "dhcp4_parser.cc"
2871 break;
2872
2873 case 448: // $@66: %empty
2874#line 1686 "dhcp4_parser.yy"
2875 {
2876 ctx.unique("client-class", ctx.loc2pos(yystack_[0].location));
2877 ctx.enter(ctx.NO_KEYWORD);
2878}
2879#line 2880 "dhcp4_parser.cc"
2880 break;
2881
2882 case 449: // client_class: "client-class" $@66 ":" "constant string"
2883#line 1689 "dhcp4_parser.yy"
2884 {
2885 ElementPtr cls(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
2886 ctx.stack_.back()->set("client-class", cls);
2887 ctx.leave();
2888}
2889#line 2890 "dhcp4_parser.cc"
2890 break;
2891
2892 case 450: // $@67: %empty
2893#line 1695 "dhcp4_parser.yy"
2894 {
2895 ctx.unique("require-client-classes", ctx.loc2pos(yystack_[0].location));
2896 ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
2897 ctx.stack_.back()->set("require-client-classes", c);
2898 ctx.stack_.push_back(c);
2899 ctx.enter(ctx.NO_KEYWORD);
2900}
2901#line 2902 "dhcp4_parser.cc"
2902 break;
2903
2904 case 451: // require_client_classes: "require-client-classes" $@67 ":" list_strings
2905#line 1701 "dhcp4_parser.yy"
2906 {
2907 ctx.stack_.pop_back();
2908 ctx.leave();
2909}
2910#line 2911 "dhcp4_parser.cc"
2911 break;
2912
2913 case 452: // reservations_global: "reservations-global" ":" "boolean"
2914#line 1706 "dhcp4_parser.yy"
2915 {
2916 ctx.unique("reservations-global", ctx.loc2pos(yystack_[2].location));
2917 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2918 ctx.stack_.back()->set("reservations-global", b);
2919}
2920#line 2921 "dhcp4_parser.cc"
2921 break;
2922
2923 case 453: // reservations_in_subnet: "reservations-in-subnet" ":" "boolean"
2924#line 1712 "dhcp4_parser.yy"
2925 {
2926 ctx.unique("reservations-in-subnet", ctx.loc2pos(yystack_[2].location));
2927 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2928 ctx.stack_.back()->set("reservations-in-subnet", b);
2929}
2930#line 2931 "dhcp4_parser.cc"
2931 break;
2932
2933 case 454: // reservations_out_of_pool: "reservations-out-of-pool" ":" "boolean"
2934#line 1718 "dhcp4_parser.yy"
2935 {
2936 ctx.unique("reservations-out-of-pool", ctx.loc2pos(yystack_[2].location));
2937 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
2938 ctx.stack_.back()->set("reservations-out-of-pool", b);
2939}
2940#line 2941 "dhcp4_parser.cc"
2941 break;
2942
2943 case 455: // id: "id" ":" "integer"
2944#line 1724 "dhcp4_parser.yy"
2945 {
2946 ctx.unique("id", ctx.loc2pos(yystack_[2].location));
2947 ElementPtr id(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
2948 ctx.stack_.back()->set("id", id);
2949}
2950#line 2951 "dhcp4_parser.cc"
2951 break;
2952
2953 case 456: // $@68: %empty
2954#line 1732 "dhcp4_parser.yy"
2955 {
2956 ctx.unique("shared-networks", ctx.loc2pos(yystack_[0].location));
2957 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
2958 ctx.stack_.back()->set("shared-networks", l);
2959 ctx.stack_.push_back(l);
2960 ctx.enter(ctx.SHARED_NETWORK);
2961}
2962#line 2963 "dhcp4_parser.cc"
2963 break;
2964
2965 case 457: // shared_networks: "shared-networks" $@68 ":" "[" shared_networks_content "]"
2966#line 1738 "dhcp4_parser.yy"
2967 {
2968 ctx.stack_.pop_back();
2969 ctx.leave();
2970}
2971#line 2972 "dhcp4_parser.cc"
2972 break;
2973
2974 case 462: // shared_networks_list: shared_networks_list ","
2975#line 1751 "dhcp4_parser.yy"
2976 {
2977 ctx.warnAboutExtraCommas(yystack_[0].location);
2978 }
2979#line 2980 "dhcp4_parser.cc"
2980 break;
2981
2982 case 463: // $@69: %empty
2983#line 1756 "dhcp4_parser.yy"
2984 {
2985 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
2986 ctx.stack_.back()->add(m);
2987 ctx.stack_.push_back(m);
2988}
2989#line 2990 "dhcp4_parser.cc"
2990 break;
2991
2992 case 464: // shared_network: "{" $@69 shared_network_params "}"
2993#line 1760 "dhcp4_parser.yy"
2994 {
2995 ctx.stack_.pop_back();
2996}
2997#line 2998 "dhcp4_parser.cc"
2998 break;
2999
3000 case 467: // shared_network_params: shared_network_params ","
3001#line 1766 "dhcp4_parser.yy"
3002 {
3003 ctx.warnAboutExtraCommas(yystack_[0].location);
3004 }
3005#line 3006 "dhcp4_parser.cc"
3006 break;
3007
3008 case 511: // $@70: %empty
3009#line 1820 "dhcp4_parser.yy"
3010 {
3011 ctx.unique("option-def", ctx.loc2pos(yystack_[0].location));
3012 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3013 ctx.stack_.back()->set("option-def", l);
3014 ctx.stack_.push_back(l);
3015 ctx.enter(ctx.OPTION_DEF);
3016}
3017#line 3018 "dhcp4_parser.cc"
3018 break;
3019
3020 case 512: // option_def_list: "option-def" $@70 ":" "[" option_def_list_content "]"
3021#line 1826 "dhcp4_parser.yy"
3022 {
3023 ctx.stack_.pop_back();
3024 ctx.leave();
3025}
3026#line 3027 "dhcp4_parser.cc"
3027 break;
3028
3029 case 513: // $@71: %empty
3030#line 1834 "dhcp4_parser.yy"
3031 {
3032 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3033 ctx.stack_.push_back(m);
3034}
3035#line 3036 "dhcp4_parser.cc"
3036 break;
3037
3038 case 514: // sub_option_def_list: "{" $@71 option_def_list "}"
3039#line 1837 "dhcp4_parser.yy"
3040 {
3041 // parsing completed
3042}
3043#line 3044 "dhcp4_parser.cc"
3044 break;
3045
3046 case 519: // not_empty_option_def_list: not_empty_option_def_list ","
3047#line 1849 "dhcp4_parser.yy"
3048 {
3049 ctx.warnAboutExtraCommas(yystack_[0].location);
3050 }
3051#line 3052 "dhcp4_parser.cc"
3052 break;
3053
3054 case 520: // $@72: %empty
3055#line 1856 "dhcp4_parser.yy"
3056 {
3057 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3058 ctx.stack_.back()->add(m);
3059 ctx.stack_.push_back(m);
3060}
3061#line 3062 "dhcp4_parser.cc"
3062 break;
3063
3064 case 521: // option_def_entry: "{" $@72 option_def_params "}"
3065#line 1860 "dhcp4_parser.yy"
3066 {
3067 // The name, code and type option def parameters are required.
3068 ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3069 ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3070 ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3071 ctx.stack_.pop_back();
3072}
3073#line 3074 "dhcp4_parser.cc"
3074 break;
3075
3076 case 522: // $@73: %empty
3077#line 1871 "dhcp4_parser.yy"
3078 {
3079 // Parse the option-def list entry map
3080 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3081 ctx.stack_.push_back(m);
3082}
3083#line 3084 "dhcp4_parser.cc"
3084 break;
3085
3086 case 523: // sub_option_def: "{" $@73 option_def_params "}"
3087#line 1875 "dhcp4_parser.yy"
3088 {
3089 // The name, code and type option def parameters are required.
3090 ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3091 ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3092 ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3093 // parsing completed
3094}
3095#line 3096 "dhcp4_parser.cc"
3096 break;
3097
3098 case 528: // not_empty_option_def_params: not_empty_option_def_params ","
3099#line 1891 "dhcp4_parser.yy"
3100 {
3101 ctx.warnAboutExtraCommas(yystack_[0].location);
3102 }
3103#line 3104 "dhcp4_parser.cc"
3104 break;
3105
3106 case 540: // code: "code" ":" "integer"
3107#line 1910 "dhcp4_parser.yy"
3108 {
3109 ctx.unique("code", ctx.loc2pos(yystack_[2].location));
3110 ElementPtr code(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
3111 ctx.stack_.back()->set("code", code);
3112}
3113#line 3114 "dhcp4_parser.cc"
3114 break;
3115
3116 case 542: // $@74: %empty
3117#line 1918 "dhcp4_parser.yy"
3118 {
3119 ctx.unique("type", ctx.loc2pos(yystack_[0].location));
3120 ctx.enter(ctx.NO_KEYWORD);
3121}
3122#line 3123 "dhcp4_parser.cc"
3123 break;
3124
3125 case 543: // option_def_type: "type" $@74 ":" "constant string"
3126#line 1921 "dhcp4_parser.yy"
3127 {
3128 ElementPtr prf(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3129 ctx.stack_.back()->set("type", prf);
3130 ctx.leave();
3131}
3132#line 3133 "dhcp4_parser.cc"
3133 break;
3134
3135 case 544: // $@75: %empty
3136#line 1927 "dhcp4_parser.yy"
3137 {
3138 ctx.unique("record-types", ctx.loc2pos(yystack_[0].location));
3139 ctx.enter(ctx.NO_KEYWORD);
3140}
3141#line 3142 "dhcp4_parser.cc"
3142 break;
3143
3144 case 545: // option_def_record_types: "record-types" $@75 ":" "constant string"
3145#line 1930 "dhcp4_parser.yy"
3146 {
3147 ElementPtr rtypes(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3148 ctx.stack_.back()->set("record-types", rtypes);
3149 ctx.leave();
3150}
3151#line 3152 "dhcp4_parser.cc"
3152 break;
3153
3154 case 546: // $@76: %empty
3155#line 1936 "dhcp4_parser.yy"
3156 {
3157 ctx.unique("space", ctx.loc2pos(yystack_[0].location));
3158 ctx.enter(ctx.NO_KEYWORD);
3159}
3160#line 3161 "dhcp4_parser.cc"
3161 break;
3162
3163 case 547: // space: "space" $@76 ":" "constant string"
3164#line 1939 "dhcp4_parser.yy"
3165 {
3166 ElementPtr space(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3167 ctx.stack_.back()->set("space", space);
3168 ctx.leave();
3169}
3170#line 3171 "dhcp4_parser.cc"
3171 break;
3172
3173 case 549: // $@77: %empty
3174#line 1947 "dhcp4_parser.yy"
3175 {
3176 ctx.unique("encapsulate", ctx.loc2pos(yystack_[0].location));
3177 ctx.enter(ctx.NO_KEYWORD);
3178}
3179#line 3180 "dhcp4_parser.cc"
3180 break;
3181
3182 case 550: // option_def_encapsulate: "encapsulate" $@77 ":" "constant string"
3183#line 1950 "dhcp4_parser.yy"
3184 {
3185 ElementPtr encap(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3186 ctx.stack_.back()->set("encapsulate", encap);
3187 ctx.leave();
3188}
3189#line 3190 "dhcp4_parser.cc"
3190 break;
3191
3192 case 551: // option_def_array: "array" ":" "boolean"
3193#line 1956 "dhcp4_parser.yy"
3194 {
3195 ctx.unique("array", ctx.loc2pos(yystack_[2].location));
3196 ElementPtr array(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
3197 ctx.stack_.back()->set("array", array);
3198}
3199#line 3200 "dhcp4_parser.cc"
3200 break;
3201
3202 case 552: // $@78: %empty
3203#line 1966 "dhcp4_parser.yy"
3204 {
3205 ctx.unique("option-data", ctx.loc2pos(yystack_[0].location));
3206 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3207 ctx.stack_.back()->set("option-data", l);
3208 ctx.stack_.push_back(l);
3209 ctx.enter(ctx.OPTION_DATA);
3210}
3211#line 3212 "dhcp4_parser.cc"
3212 break;
3213
3214 case 553: // option_data_list: "option-data" $@78 ":" "[" option_data_list_content "]"
3215#line 1972 "dhcp4_parser.yy"
3216 {
3217 ctx.stack_.pop_back();
3218 ctx.leave();
3219}
3220#line 3221 "dhcp4_parser.cc"
3221 break;
3222
3223 case 558: // not_empty_option_data_list: not_empty_option_data_list ","
3224#line 1987 "dhcp4_parser.yy"
3225 {
3226 ctx.warnAboutExtraCommas(yystack_[0].location);
3227 }
3228#line 3229 "dhcp4_parser.cc"
3229 break;
3230
3231 case 559: // $@79: %empty
3232#line 1994 "dhcp4_parser.yy"
3233 {
3234 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3235 ctx.stack_.back()->add(m);
3236 ctx.stack_.push_back(m);
3237}
3238#line 3239 "dhcp4_parser.cc"
3239 break;
3240
3241 case 560: // option_data_entry: "{" $@79 option_data_params "}"
3242#line 1998 "dhcp4_parser.yy"
3243 {
3245 ctx.stack_.pop_back();
3246}
3247#line 3248 "dhcp4_parser.cc"
3248 break;
3249
3250 case 561: // $@80: %empty
3251#line 2006 "dhcp4_parser.yy"
3252 {
3253 // Parse the option-data list entry map
3254 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3255 ctx.stack_.push_back(m);
3256}
3257#line 3258 "dhcp4_parser.cc"
3258 break;
3259
3260 case 562: // sub_option_data: "{" $@80 option_data_params "}"
3261#line 2010 "dhcp4_parser.yy"
3262 {
3264 // parsing completed
3265}
3266#line 3267 "dhcp4_parser.cc"
3267 break;
3268
3269 case 567: // not_empty_option_data_params: not_empty_option_data_params ","
3270#line 2026 "dhcp4_parser.yy"
3271 {
3272 ctx.warnAboutExtraCommas(yystack_[0].location);
3273 }
3274#line 3275 "dhcp4_parser.cc"
3275 break;
3276
3277 case 580: // $@81: %empty
3278#line 2048 "dhcp4_parser.yy"
3279 {
3280 ctx.unique("data", ctx.loc2pos(yystack_[0].location));
3281 ctx.enter(ctx.NO_KEYWORD);
3282}
3283#line 3284 "dhcp4_parser.cc"
3284 break;
3285
3286 case 581: // option_data_data: "data" $@81 ":" "constant string"
3287#line 2051 "dhcp4_parser.yy"
3288 {
3289 ElementPtr data(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3290 ctx.stack_.back()->set("data", data);
3291 ctx.leave();
3292}
3293#line 3294 "dhcp4_parser.cc"
3294 break;
3295
3296 case 584: // option_data_csv_format: "csv-format" ":" "boolean"
3297#line 2061 "dhcp4_parser.yy"
3298 {
3299 ctx.unique("csv-format", ctx.loc2pos(yystack_[2].location));
3300 ElementPtr csv(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
3301 ctx.stack_.back()->set("csv-format", csv);
3302}
3303#line 3304 "dhcp4_parser.cc"
3304 break;
3305
3306 case 585: // option_data_always_send: "always-send" ":" "boolean"
3307#line 2067 "dhcp4_parser.yy"
3308 {
3309 ctx.unique("always-send", ctx.loc2pos(yystack_[2].location));
3310 ElementPtr persist(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
3311 ctx.stack_.back()->set("always-send", persist);
3312}
3313#line 3314 "dhcp4_parser.cc"
3314 break;
3315
3316 case 586: // option_data_never_send: "never-send" ":" "boolean"
3317#line 2073 "dhcp4_parser.yy"
3318 {
3319 ctx.unique("never-send", ctx.loc2pos(yystack_[2].location));
3320 ElementPtr cancel(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
3321 ctx.stack_.back()->set("never-send", cancel);
3322}
3323#line 3324 "dhcp4_parser.cc"
3324 break;
3325
3326 case 587: // $@82: %empty
3327#line 2079 "dhcp4_parser.yy"
3328 {
3329 ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location));
3330 ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
3331 ctx.stack_.back()->set("client-classes", c);
3332 ctx.stack_.push_back(c);
3333 ctx.enter(ctx.NO_KEYWORD);
3334}
3335#line 3336 "dhcp4_parser.cc"
3336 break;
3337
3338 case 588: // option_data_client_classes: "client-classes" $@82 ":" list_strings
3339#line 2085 "dhcp4_parser.yy"
3340 {
3341 ctx.stack_.pop_back();
3342 ctx.leave();
3343}
3344#line 3345 "dhcp4_parser.cc"
3345 break;
3346
3347 case 589: // $@83: %empty
3348#line 2093 "dhcp4_parser.yy"
3349 {
3350 ctx.unique("pools", ctx.loc2pos(yystack_[0].location));
3351 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3352 ctx.stack_.back()->set("pools", l);
3353 ctx.stack_.push_back(l);
3354 ctx.enter(ctx.POOLS);
3355}
3356#line 3357 "dhcp4_parser.cc"
3357 break;
3358
3359 case 590: // pools_list: "pools" $@83 ":" "[" pools_list_content "]"
3360#line 2099 "dhcp4_parser.yy"
3361 {
3362 ctx.stack_.pop_back();
3363 ctx.leave();
3364}
3365#line 3366 "dhcp4_parser.cc"
3366 break;
3367
3368 case 595: // not_empty_pools_list: not_empty_pools_list ","
3369#line 2112 "dhcp4_parser.yy"
3370 {
3371 ctx.warnAboutExtraCommas(yystack_[0].location);
3372 }
3373#line 3374 "dhcp4_parser.cc"
3374 break;
3375
3376 case 596: // $@84: %empty
3377#line 2117 "dhcp4_parser.yy"
3378 {
3379 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3380 ctx.stack_.back()->add(m);
3381 ctx.stack_.push_back(m);
3382}
3383#line 3384 "dhcp4_parser.cc"
3384 break;
3385
3386 case 597: // pool_list_entry: "{" $@84 pool_params "}"
3387#line 2121 "dhcp4_parser.yy"
3388 {
3389 // The pool parameter is required.
3390 ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3391 ctx.stack_.pop_back();
3392}
3393#line 3394 "dhcp4_parser.cc"
3394 break;
3395
3396 case 598: // $@85: %empty
3397#line 2127 "dhcp4_parser.yy"
3398 {
3399 // Parse the pool list entry map
3400 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3401 ctx.stack_.push_back(m);
3402}
3403#line 3404 "dhcp4_parser.cc"
3404 break;
3405
3406 case 599: // sub_pool4: "{" $@85 pool_params "}"
3407#line 2131 "dhcp4_parser.yy"
3408 {
3409 // The pool parameter is required.
3410 ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3411 // parsing completed
3412}
3413#line 3414 "dhcp4_parser.cc"
3414 break;
3415
3416 case 602: // pool_params: pool_params ","
3417#line 2139 "dhcp4_parser.yy"
3418 {
3419 ctx.warnAboutExtraCommas(yystack_[0].location);
3420 }
3421#line 3422 "dhcp4_parser.cc"
3422 break;
3423
3424 case 611: // $@86: %empty
3425#line 2154 "dhcp4_parser.yy"
3426 {
3427 ctx.unique("pool", ctx.loc2pos(yystack_[0].location));
3428 ctx.enter(ctx.NO_KEYWORD);
3429}
3430#line 3431 "dhcp4_parser.cc"
3431 break;
3432
3433 case 612: // pool_entry: "pool" $@86 ":" "constant string"
3434#line 2157 "dhcp4_parser.yy"
3435 {
3436 ElementPtr pool(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3437 ctx.stack_.back()->set("pool", pool);
3438 ctx.leave();
3439}
3440#line 3441 "dhcp4_parser.cc"
3441 break;
3442
3443 case 613: // pool_id: "pool-id" ":" "integer"
3444#line 2163 "dhcp4_parser.yy"
3445 {
3446 ctx.unique("pool-id", ctx.loc2pos(yystack_[2].location));
3447 ElementPtr id(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
3448 ctx.stack_.back()->set("pool-id", id);
3449}
3450#line 3451 "dhcp4_parser.cc"
3451 break;
3452
3453 case 614: // $@87: %empty
3454#line 2169 "dhcp4_parser.yy"
3455 {
3456 ctx.enter(ctx.NO_KEYWORD);
3457}
3458#line 3459 "dhcp4_parser.cc"
3459 break;
3460
3461 case 615: // user_context: "user-context" $@87 ":" map_value
3462#line 2171 "dhcp4_parser.yy"
3463 {
3464 ElementPtr parent = ctx.stack_.back();
3465 ElementPtr user_context = yystack_[0].value.as < ElementPtr > ();
3466 ConstElementPtr old = parent->get("user-context");
3467
3468 // Handle already existing user context
3469 if (old) {
3470 // Check if it was a comment or a duplicate
3471 if ((old->size() != 1) || !old->contains("comment")) {
3472 std::stringstream msg;
3473 msg << "duplicate user-context entries (previous at "
3474 << old->getPosition().str() << ")";
3475 error(yystack_[3].location, msg.str());
3476 }
3477 // Merge the comment
3478 user_context->set("comment", old->get("comment"));
3479 }
3480
3481 // Set the user context
3482 parent->set("user-context", user_context);
3483 ctx.leave();
3484}
3485#line 3486 "dhcp4_parser.cc"
3486 break;
3487
3488 case 616: // $@88: %empty
3489#line 2194 "dhcp4_parser.yy"
3490 {
3491 ctx.enter(ctx.NO_KEYWORD);
3492}
3493#line 3494 "dhcp4_parser.cc"
3494 break;
3495
3496 case 617: // comment: "comment" $@88 ":" "constant string"
3497#line 2196 "dhcp4_parser.yy"
3498 {
3499 ElementPtr parent = ctx.stack_.back();
3500 ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
3501 ElementPtr comment(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3502 user_context->set("comment", comment);
3503
3504 // Handle already existing user context
3505 ConstElementPtr old = parent->get("user-context");
3506 if (old) {
3507 // Check for duplicate comment
3508 if (old->contains("comment")) {
3509 std::stringstream msg;
3510 msg << "duplicate user-context/comment entries (previous at "
3511 << old->getPosition().str() << ")";
3512 error(yystack_[3].location, msg.str());
3513 }
3514 // Merge the user context in the comment
3515 merge(user_context, old);
3516 }
3517
3518 // Set the user context
3519 parent->set("user-context", user_context);
3520 ctx.leave();
3521}
3522#line 3523 "dhcp4_parser.cc"
3523 break;
3524
3525 case 618: // $@89: %empty
3526#line 2224 "dhcp4_parser.yy"
3527 {
3528 ctx.unique("reservations", ctx.loc2pos(yystack_[0].location));
3529 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3530 ctx.stack_.back()->set("reservations", l);
3531 ctx.stack_.push_back(l);
3532 ctx.enter(ctx.RESERVATIONS);
3533}
3534#line 3535 "dhcp4_parser.cc"
3535 break;
3536
3537 case 619: // reservations: "reservations" $@89 ":" "[" reservations_list "]"
3538#line 2230 "dhcp4_parser.yy"
3539 {
3540 ctx.stack_.pop_back();
3541 ctx.leave();
3542}
3543#line 3544 "dhcp4_parser.cc"
3544 break;
3545
3546 case 624: // not_empty_reservations_list: not_empty_reservations_list ","
3547#line 2241 "dhcp4_parser.yy"
3548 {
3549 ctx.warnAboutExtraCommas(yystack_[0].location);
3550 }
3551#line 3552 "dhcp4_parser.cc"
3552 break;
3553
3554 case 625: // $@90: %empty
3555#line 2246 "dhcp4_parser.yy"
3556 {
3557 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3558 ctx.stack_.back()->add(m);
3559 ctx.stack_.push_back(m);
3560}
3561#line 3562 "dhcp4_parser.cc"
3562 break;
3563
3564 case 626: // reservation: "{" $@90 reservation_params "}"
3565#line 2250 "dhcp4_parser.yy"
3566 {
3568 ctx.stack_.pop_back();
3569}
3570#line 3571 "dhcp4_parser.cc"
3571 break;
3572
3573 case 627: // $@91: %empty
3574#line 2255 "dhcp4_parser.yy"
3575 {
3576 // Parse the reservations list entry map
3577 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3578 ctx.stack_.push_back(m);
3579}
3580#line 3581 "dhcp4_parser.cc"
3581 break;
3582
3583 case 628: // sub_reservation: "{" $@91 reservation_params "}"
3584#line 2259 "dhcp4_parser.yy"
3585 {
3587 // parsing completed
3588}
3589#line 3590 "dhcp4_parser.cc"
3590 break;
3591
3592 case 633: // not_empty_reservation_params: not_empty_reservation_params ","
3593#line 2270 "dhcp4_parser.yy"
3594 {
3595 ctx.warnAboutExtraCommas(yystack_[0].location);
3596 }
3597#line 3598 "dhcp4_parser.cc"
3598 break;
3599
3600 case 649: // $@92: %empty
3601#line 2293 "dhcp4_parser.yy"
3602 {
3603 ctx.unique("next-server", ctx.loc2pos(yystack_[0].location));
3604 ctx.enter(ctx.NO_KEYWORD);
3605}
3606#line 3607 "dhcp4_parser.cc"
3607 break;
3608
3609 case 650: // next_server: "next-server" $@92 ":" "constant string"
3610#line 2296 "dhcp4_parser.yy"
3611 {
3612 ElementPtr next_server(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3613 ctx.stack_.back()->set("next-server", next_server);
3614 ctx.leave();
3615}
3616#line 3617 "dhcp4_parser.cc"
3617 break;
3618
3619 case 651: // $@93: %empty
3620#line 2302 "dhcp4_parser.yy"
3621 {
3622 ctx.unique("server-hostname", ctx.loc2pos(yystack_[0].location));
3623 ctx.enter(ctx.NO_KEYWORD);
3624}
3625#line 3626 "dhcp4_parser.cc"
3626 break;
3627
3628 case 652: // server_hostname: "server-hostname" $@93 ":" "constant string"
3629#line 2305 "dhcp4_parser.yy"
3630 {
3631 ElementPtr srv(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3632 ctx.stack_.back()->set("server-hostname", srv);
3633 ctx.leave();
3634}
3635#line 3636 "dhcp4_parser.cc"
3636 break;
3637
3638 case 653: // $@94: %empty
3639#line 2311 "dhcp4_parser.yy"
3640 {
3641 ctx.unique("boot-file-name", ctx.loc2pos(yystack_[0].location));
3642 ctx.enter(ctx.NO_KEYWORD);
3643}
3644#line 3645 "dhcp4_parser.cc"
3645 break;
3646
3647 case 654: // boot_file_name: "boot-file-name" $@94 ":" "constant string"
3648#line 2314 "dhcp4_parser.yy"
3649 {
3650 ElementPtr bootfile(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3651 ctx.stack_.back()->set("boot-file-name", bootfile);
3652 ctx.leave();
3653}
3654#line 3655 "dhcp4_parser.cc"
3655 break;
3656
3657 case 655: // $@95: %empty
3658#line 2320 "dhcp4_parser.yy"
3659 {
3660 ctx.unique("ip-address", ctx.loc2pos(yystack_[0].location));
3661 ctx.enter(ctx.NO_KEYWORD);
3662}
3663#line 3664 "dhcp4_parser.cc"
3664 break;
3665
3666 case 656: // ip_address: "ip-address" $@95 ":" "constant string"
3667#line 2323 "dhcp4_parser.yy"
3668 {
3669 ElementPtr addr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3670 ctx.stack_.back()->set("ip-address", addr);
3671 ctx.leave();
3672}
3673#line 3674 "dhcp4_parser.cc"
3674 break;
3675
3676 case 657: // $@96: %empty
3677#line 2329 "dhcp4_parser.yy"
3678 {
3679 ctx.unique("duid", ctx.loc2pos(yystack_[0].location));
3680 ctx.enter(ctx.NO_KEYWORD);
3681}
3682#line 3683 "dhcp4_parser.cc"
3683 break;
3684
3685 case 658: // duid: "duid" $@96 ":" "constant string"
3686#line 2332 "dhcp4_parser.yy"
3687 {
3688 ElementPtr d(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3689 ctx.stack_.back()->set("duid", d);
3690 ctx.leave();
3691}
3692#line 3693 "dhcp4_parser.cc"
3693 break;
3694
3695 case 659: // $@97: %empty
3696#line 2338 "dhcp4_parser.yy"
3697 {
3698 ctx.unique("hw-address", ctx.loc2pos(yystack_[0].location));
3699 ctx.enter(ctx.NO_KEYWORD);
3700}
3701#line 3702 "dhcp4_parser.cc"
3702 break;
3703
3704 case 660: // hw_address: "hw-address" $@97 ":" "constant string"
3705#line 2341 "dhcp4_parser.yy"
3706 {
3707 ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3708 ctx.stack_.back()->set("hw-address", hw);
3709 ctx.leave();
3710}
3711#line 3712 "dhcp4_parser.cc"
3712 break;
3713
3714 case 661: // $@98: %empty
3715#line 2347 "dhcp4_parser.yy"
3716 {
3717 ctx.unique("client-id", ctx.loc2pos(yystack_[0].location));
3718 ctx.enter(ctx.NO_KEYWORD);
3719}
3720#line 3721 "dhcp4_parser.cc"
3721 break;
3722
3723 case 662: // client_id_value: "client-id" $@98 ":" "constant string"
3724#line 2350 "dhcp4_parser.yy"
3725 {
3726 ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3727 ctx.stack_.back()->set("client-id", hw);
3728 ctx.leave();
3729}
3730#line 3731 "dhcp4_parser.cc"
3731 break;
3732
3733 case 663: // $@99: %empty
3734#line 2356 "dhcp4_parser.yy"
3735 {
3736 ctx.unique("circuit-id", ctx.loc2pos(yystack_[0].location));
3737 ctx.enter(ctx.NO_KEYWORD);
3738}
3739#line 3740 "dhcp4_parser.cc"
3740 break;
3741
3742 case 664: // circuit_id_value: "circuit-id" $@99 ":" "constant string"
3743#line 2359 "dhcp4_parser.yy"
3744 {
3745 ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3746 ctx.stack_.back()->set("circuit-id", hw);
3747 ctx.leave();
3748}
3749#line 3750 "dhcp4_parser.cc"
3750 break;
3751
3752 case 665: // $@100: %empty
3753#line 2365 "dhcp4_parser.yy"
3754 {
3755 ctx.unique("flex-id", ctx.loc2pos(yystack_[0].location));
3756 ctx.enter(ctx.NO_KEYWORD);
3757}
3758#line 3759 "dhcp4_parser.cc"
3759 break;
3760
3761 case 666: // flex_id_value: "flex-id" $@100 ":" "constant string"
3762#line 2368 "dhcp4_parser.yy"
3763 {
3764 ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3765 ctx.stack_.back()->set("flex-id", hw);
3766 ctx.leave();
3767}
3768#line 3769 "dhcp4_parser.cc"
3769 break;
3770
3771 case 667: // $@101: %empty
3772#line 2374 "dhcp4_parser.yy"
3773 {
3774 ctx.unique("hostname", ctx.loc2pos(yystack_[0].location));
3775 ctx.enter(ctx.NO_KEYWORD);
3776}
3777#line 3778 "dhcp4_parser.cc"
3778 break;
3779
3780 case 668: // hostname: "hostname" $@101 ":" "constant string"
3781#line 2377 "dhcp4_parser.yy"
3782 {
3783 ElementPtr host(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3784 ctx.stack_.back()->set("hostname", host);
3785 ctx.leave();
3786}
3787#line 3788 "dhcp4_parser.cc"
3788 break;
3789
3790 case 669: // $@102: %empty
3791#line 2383 "dhcp4_parser.yy"
3792 {
3793 ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location));
3794 ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
3795 ctx.stack_.back()->set("client-classes", c);
3796 ctx.stack_.push_back(c);
3797 ctx.enter(ctx.NO_KEYWORD);
3798}
3799#line 3800 "dhcp4_parser.cc"
3800 break;
3801
3802 case 670: // reservation_client_classes: "client-classes" $@102 ":" list_strings
3803#line 2389 "dhcp4_parser.yy"
3804 {
3805 ctx.stack_.pop_back();
3806 ctx.leave();
3807}
3808#line 3809 "dhcp4_parser.cc"
3809 break;
3810
3811 case 671: // $@103: %empty
3812#line 2397 "dhcp4_parser.yy"
3813 {
3814 ctx.unique("relay", ctx.loc2pos(yystack_[0].location));
3815 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3816 ctx.stack_.back()->set("relay", m);
3817 ctx.stack_.push_back(m);
3818 ctx.enter(ctx.RELAY);
3819}
3820#line 3821 "dhcp4_parser.cc"
3821 break;
3822
3823 case 672: // relay: "relay" $@103 ":" "{" relay_map "}"
3824#line 2403 "dhcp4_parser.yy"
3825 {
3826 ctx.stack_.pop_back();
3827 ctx.leave();
3828}
3829#line 3830 "dhcp4_parser.cc"
3830 break;
3831
3832 case 674: // $@104: %empty
3833#line 2411 "dhcp4_parser.yy"
3834 {
3835 ctx.unique("ip-addresses", ctx.loc2pos(yystack_[0].location));
3836 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3837 ctx.stack_.back()->set("ip-addresses", l);
3838 ctx.stack_.push_back(l);
3839 ctx.enter(ctx.NO_KEYWORD);
3840}
3841#line 3842 "dhcp4_parser.cc"
3842 break;
3843
3844 case 675: // ip_addresses: "ip-addresses" $@104 ":" list_strings
3845#line 2417 "dhcp4_parser.yy"
3846 {
3847 ctx.stack_.pop_back();
3848 ctx.leave();
3849}
3850#line 3851 "dhcp4_parser.cc"
3851 break;
3852
3853 case 676: // $@105: %empty
3854#line 2425 "dhcp4_parser.yy"
3855 {
3856 ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location));
3857 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3858 ctx.stack_.back()->set("client-classes", l);
3859 ctx.stack_.push_back(l);
3860 ctx.enter(ctx.CLIENT_CLASSES);
3861}
3862#line 3863 "dhcp4_parser.cc"
3863 break;
3864
3865 case 677: // client_classes: "client-classes" $@105 ":" "[" client_classes_list "]"
3866#line 2431 "dhcp4_parser.yy"
3867 {
3868 ctx.stack_.pop_back();
3869 ctx.leave();
3870}
3871#line 3872 "dhcp4_parser.cc"
3872 break;
3873
3874 case 680: // client_classes_list: client_classes_list ","
3875#line 2438 "dhcp4_parser.yy"
3876 {
3877 ctx.warnAboutExtraCommas(yystack_[0].location);
3878 }
3879#line 3880 "dhcp4_parser.cc"
3880 break;
3881
3882 case 681: // $@106: %empty
3883#line 2443 "dhcp4_parser.yy"
3884 {
3885 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3886 ctx.stack_.back()->add(m);
3887 ctx.stack_.push_back(m);
3888}
3889#line 3890 "dhcp4_parser.cc"
3890 break;
3891
3892 case 682: // client_class_entry: "{" $@106 client_class_params "}"
3893#line 2447 "dhcp4_parser.yy"
3894 {
3895 // The name client class parameter is required.
3896 ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
3897 ctx.stack_.pop_back();
3898}
3899#line 3900 "dhcp4_parser.cc"
3900 break;
3901
3902 case 687: // not_empty_client_class_params: not_empty_client_class_params ","
3903#line 2459 "dhcp4_parser.yy"
3904 {
3905 ctx.warnAboutExtraCommas(yystack_[0].location);
3906 }
3907#line 3908 "dhcp4_parser.cc"
3908 break;
3909
3910 case 705: // $@107: %empty
3911#line 2484 "dhcp4_parser.yy"
3912 {
3913 ctx.unique("test", ctx.loc2pos(yystack_[0].location));
3914 ctx.enter(ctx.NO_KEYWORD);
3915}
3916#line 3917 "dhcp4_parser.cc"
3917 break;
3918
3919 case 706: // client_class_test: "test" $@107 ":" "constant string"
3920#line 2487 "dhcp4_parser.yy"
3921 {
3922 ElementPtr test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3923 ctx.stack_.back()->set("test", test);
3924 ctx.leave();
3925}
3926#line 3927 "dhcp4_parser.cc"
3927 break;
3928
3929 case 707: // $@108: %empty
3930#line 2493 "dhcp4_parser.yy"
3931 {
3932 ctx.unique("template-test", ctx.loc2pos(yystack_[0].location));
3933 ctx.enter(ctx.NO_KEYWORD);
3934}
3935#line 3936 "dhcp4_parser.cc"
3936 break;
3937
3938 case 708: // client_class_template_test: "template-test" $@108 ":" "constant string"
3939#line 2496 "dhcp4_parser.yy"
3940 {
3941 ElementPtr template_test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
3942 ctx.stack_.back()->set("template-test", template_test);
3943 ctx.leave();
3944}
3945#line 3946 "dhcp4_parser.cc"
3946 break;
3947
3948 case 709: // only_if_required: "only-if-required" ":" "boolean"
3949#line 2502 "dhcp4_parser.yy"
3950 {
3951 ctx.unique("only-if-required", ctx.loc2pos(yystack_[2].location));
3952 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
3953 ctx.stack_.back()->set("only-if-required", b);
3954}
3955#line 3956 "dhcp4_parser.cc"
3956 break;
3957
3958 case 710: // dhcp4o6_port: "dhcp4o6-port" ":" "integer"
3959#line 2510 "dhcp4_parser.yy"
3960 {
3961 ctx.unique("dhcp4o6-port", ctx.loc2pos(yystack_[2].location));
3962 ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
3963 ctx.stack_.back()->set("dhcp4o6-port", time);
3964}
3965#line 3966 "dhcp4_parser.cc"
3966 break;
3967
3968 case 711: // $@109: %empty
3969#line 2518 "dhcp4_parser.yy"
3970 {
3971 ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
3972 ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location));
3973 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
3974 ctx.stack_.back()->set("control-socket", m);
3975 ctx.stack_.push_back(m);
3976 ctx.enter(ctx.CONTROL_SOCKET);
3977}
3978#line 3979 "dhcp4_parser.cc"
3979 break;
3980
3981 case 712: // control_socket: "control-socket" $@109 ":" "{" control_socket_params "}"
3982#line 2525 "dhcp4_parser.yy"
3983 {
3984 ctx.stack_.pop_back();
3985 ctx.leave();
3986}
3987#line 3988 "dhcp4_parser.cc"
3988 break;
3989
3990 case 713: // $@110: %empty
3991#line 2530 "dhcp4_parser.yy"
3992 {
3993 ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location));
3994 ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
3995 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
3996 ctx.stack_.back()->set("control-sockets", l);
3997 ctx.stack_.push_back(l);
3998 ctx.enter(ctx.CONTROL_SOCKET);
3999}
4000#line 4001 "dhcp4_parser.cc"
4001 break;
4002
4003 case 714: // control_sockets: "control-sockets" $@110 ":" "[" control_socket_list "]"
4004#line 2537 "dhcp4_parser.yy"
4005 {
4006 ctx.stack_.pop_back();
4007 ctx.leave();
4008}
4009#line 4010 "dhcp4_parser.cc"
4010 break;
4011
4012 case 719: // not_empty_control_socket_list: not_empty_control_socket_list ","
4013#line 2548 "dhcp4_parser.yy"
4014 {
4015 ctx.warnAboutExtraCommas(yystack_[0].location);
4016 }
4017#line 4018 "dhcp4_parser.cc"
4018 break;
4019
4020 case 720: // $@111: %empty
4021#line 2553 "dhcp4_parser.yy"
4022 {
4023 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4024 ctx.stack_.back()->add(m);
4025 ctx.stack_.push_back(m);
4026}
4027#line 4028 "dhcp4_parser.cc"
4028 break;
4029
4030 case 721: // control_socket_entry: "{" $@111 control_socket_params "}"
4031#line 2557 "dhcp4_parser.yy"
4032 {
4033 ctx.stack_.pop_back();
4034}
4035#line 4036 "dhcp4_parser.cc"
4036 break;
4037
4038 case 724: // control_socket_params: control_socket_params ","
4039#line 2563 "dhcp4_parser.yy"
4040 {
4041 ctx.warnAboutExtraCommas(yystack_[0].location);
4042 }
4043#line 4044 "dhcp4_parser.cc"
4044 break;
4045
4046 case 737: // $@112: %empty
4047#line 2582 "dhcp4_parser.yy"
4048 {
4049 ctx.unique("socket-type", ctx.loc2pos(yystack_[0].location));
4050 ctx.enter(ctx.CONTROL_SOCKET_TYPE);
4051}
4052#line 4053 "dhcp4_parser.cc"
4053 break;
4054
4055 case 738: // control_socket_type: "socket-type" $@112 ":" control_socket_type_value
4056#line 2585 "dhcp4_parser.yy"
4057 {
4058 ctx.stack_.back()->set("socket-type", yystack_[0].value.as < ElementPtr > ());
4059 ctx.leave();
4060}
4061#line 4062 "dhcp4_parser.cc"
4062 break;
4063
4064 case 739: // control_socket_type_value: "unix"
4065#line 2591 "dhcp4_parser.yy"
4066 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
4067#line 4068 "dhcp4_parser.cc"
4068 break;
4069
4070 case 740: // control_socket_type_value: "http"
4071#line 2592 "dhcp4_parser.yy"
4072 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("http", ctx.loc2pos(yystack_[0].location))); }
4073#line 4074 "dhcp4_parser.cc"
4074 break;
4075
4076 case 741: // control_socket_type_value: "https"
4077#line 2593 "dhcp4_parser.yy"
4078 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("https", ctx.loc2pos(yystack_[0].location))); }
4079#line 4080 "dhcp4_parser.cc"
4080 break;
4081
4082 case 742: // $@113: %empty
4083#line 2596 "dhcp4_parser.yy"
4084 {
4085 ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
4086 ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location));
4087 ctx.enter(ctx.NO_KEYWORD);
4088}
4089#line 4090 "dhcp4_parser.cc"
4090 break;
4091
4092 case 743: // control_socket_name: "socket-name" $@113 ":" "constant string"
4093#line 2600 "dhcp4_parser.yy"
4094 {
4095 ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4096 ctx.stack_.back()->set("socket-name", name);
4097 ctx.leave();
4098}
4099#line 4100 "dhcp4_parser.cc"
4100 break;
4101
4102 case 744: // $@114: %empty
4103#line 2606 "dhcp4_parser.yy"
4104 {
4105 ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location));
4106 ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
4107 ctx.enter(ctx.NO_KEYWORD);
4108}
4109#line 4110 "dhcp4_parser.cc"
4110 break;
4111
4112 case 745: // control_socket_address: "socket-address" $@114 ":" "constant string"
4113#line 2610 "dhcp4_parser.yy"
4114 {
4115 ElementPtr address(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4116 ctx.stack_.back()->set("socket-address", address);
4117 ctx.leave();
4118}
4119#line 4120 "dhcp4_parser.cc"
4120 break;
4121
4122 case 746: // control_socket_port: "socket-port" ":" "integer"
4123#line 2616 "dhcp4_parser.yy"
4124 {
4125 ctx.unique("socket-port", ctx.loc2pos(yystack_[2].location));
4126 ElementPtr port(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4127 ctx.stack_.back()->set("socket-port", port);
4128}
4129#line 4130 "dhcp4_parser.cc"
4130 break;
4131
4132 case 747: // cert_required: "cert-required" ":" "boolean"
4133#line 2622 "dhcp4_parser.yy"
4134 {
4135 ctx.unique("cert-required", ctx.loc2pos(yystack_[2].location));
4136 ElementPtr req(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4137 ctx.stack_.back()->set("cert-required", req);
4138}
4139#line 4140 "dhcp4_parser.cc"
4140 break;
4141
4142 case 748: // $@115: %empty
4143#line 2630 "dhcp4_parser.yy"
4144 {
4145 ctx.unique("authentication", ctx.loc2pos(yystack_[0].location));
4146 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4147 ctx.stack_.back()->set("authentication", m);
4148 ctx.stack_.push_back(m);
4149 ctx.enter(ctx.AUTHENTICATION);
4150}
4151#line 4152 "dhcp4_parser.cc"
4152 break;
4153
4154 case 749: // authentication: "authentication" $@115 ":" "{" auth_params "}"
4155#line 2636 "dhcp4_parser.yy"
4156 {
4157 // The type parameter is required
4158 ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
4159 ctx.stack_.pop_back();
4160 ctx.leave();
4161}
4162#line 4163 "dhcp4_parser.cc"
4163 break;
4164
4165 case 752: // auth_params: auth_params ","
4166#line 2645 "dhcp4_parser.yy"
4167 {
4168 ctx.warnAboutExtraCommas(yystack_[0].location);
4169 }
4170#line 4171 "dhcp4_parser.cc"
4171 break;
4172
4173 case 760: // $@116: %empty
4174#line 2659 "dhcp4_parser.yy"
4175 {
4176 ctx.unique("type", ctx.loc2pos(yystack_[0].location));
4177 ctx.enter(ctx.AUTH_TYPE);
4178}
4179#line 4180 "dhcp4_parser.cc"
4180 break;
4181
4182 case 761: // auth_type: "type" $@116 ":" auth_type_value
4183#line 2662 "dhcp4_parser.yy"
4184 {
4185 ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ());
4186 ctx.leave();
4187}
4188#line 4189 "dhcp4_parser.cc"
4189 break;
4190
4191 case 762: // auth_type_value: "basic"
4192#line 2667 "dhcp4_parser.yy"
4193 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("basic", ctx.loc2pos(yystack_[0].location))); }
4194#line 4195 "dhcp4_parser.cc"
4195 break;
4196
4197 case 763: // $@117: %empty
4198#line 2670 "dhcp4_parser.yy"
4199 {
4200 ctx.unique("realm", ctx.loc2pos(yystack_[0].location));
4201 ctx.enter(ctx.NO_KEYWORD);
4202}
4203#line 4204 "dhcp4_parser.cc"
4204 break;
4205
4206 case 764: // realm: "realm" $@117 ":" "constant string"
4207#line 2673 "dhcp4_parser.yy"
4208 {
4209 ElementPtr realm(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4210 ctx.stack_.back()->set("realm", realm);
4211 ctx.leave();
4212}
4213#line 4214 "dhcp4_parser.cc"
4214 break;
4215
4216 case 765: // $@118: %empty
4217#line 2679 "dhcp4_parser.yy"
4218 {
4219 ctx.unique("directory", ctx.loc2pos(yystack_[0].location));
4220 ctx.enter(ctx.NO_KEYWORD);
4221}
4222#line 4223 "dhcp4_parser.cc"
4223 break;
4224
4225 case 766: // directory: "directory" $@118 ":" "constant string"
4226#line 2682 "dhcp4_parser.yy"
4227 {
4228 ElementPtr directory(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4229 ctx.stack_.back()->set("directory", directory);
4230 ctx.leave();
4231}
4232#line 4233 "dhcp4_parser.cc"
4233 break;
4234
4235 case 767: // $@119: %empty
4236#line 2688 "dhcp4_parser.yy"
4237 {
4238 ctx.unique("clients", ctx.loc2pos(yystack_[0].location));
4239 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
4240 ctx.stack_.back()->set("clients", l);
4241 ctx.stack_.push_back(l);
4242 ctx.enter(ctx.CLIENTS);
4243}
4244#line 4245 "dhcp4_parser.cc"
4245 break;
4246
4247 case 768: // clients: "clients" $@119 ":" "[" clients_list "]"
4248#line 2694 "dhcp4_parser.yy"
4249 {
4250 ctx.stack_.pop_back();
4251 ctx.leave();
4252}
4253#line 4254 "dhcp4_parser.cc"
4254 break;
4255
4256 case 773: // not_empty_clients_list: not_empty_clients_list ","
4257#line 2705 "dhcp4_parser.yy"
4258 {
4259 ctx.warnAboutExtraCommas(yystack_[0].location);
4260 }
4261#line 4262 "dhcp4_parser.cc"
4262 break;
4263
4264 case 774: // $@120: %empty
4265#line 2710 "dhcp4_parser.yy"
4266 {
4267 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4268 ctx.stack_.back()->add(m);
4269 ctx.stack_.push_back(m);
4270}
4271#line 4272 "dhcp4_parser.cc"
4272 break;
4273
4274 case 775: // basic_auth: "{" $@120 clients_params "}"
4275#line 2714 "dhcp4_parser.yy"
4276 {
4277 ctx.stack_.pop_back();
4278}
4279#line 4280 "dhcp4_parser.cc"
4280 break;
4281
4282 case 778: // clients_params: clients_params ","
4283#line 2720 "dhcp4_parser.yy"
4284 {
4285 ctx.warnAboutExtraCommas(yystack_[0].location);
4286 }
4287#line 4288 "dhcp4_parser.cc"
4288 break;
4289
4290 case 786: // $@121: %empty
4291#line 2734 "dhcp4_parser.yy"
4292 {
4293 ctx.unique("user-file", ctx.loc2pos(yystack_[0].location));
4294 ctx.enter(ctx.NO_KEYWORD);
4295}
4296#line 4297 "dhcp4_parser.cc"
4297 break;
4298
4299 case 787: // user_file: "user-file" $@121 ":" "constant string"
4300#line 2737 "dhcp4_parser.yy"
4301 {
4302 ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4303 ctx.stack_.back()->set("user-file", user);
4304 ctx.leave();
4305}
4306#line 4307 "dhcp4_parser.cc"
4307 break;
4308
4309 case 788: // $@122: %empty
4310#line 2743 "dhcp4_parser.yy"
4311 {
4312 ctx.unique("password-file", ctx.loc2pos(yystack_[0].location));
4313 ctx.enter(ctx.NO_KEYWORD);
4314}
4315#line 4316 "dhcp4_parser.cc"
4316 break;
4317
4318 case 789: // password_file: "password-file" $@122 ":" "constant string"
4319#line 2746 "dhcp4_parser.yy"
4320 {
4321 ElementPtr password(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4322 ctx.stack_.back()->set("password-file", password);
4323 ctx.leave();
4324}
4325#line 4326 "dhcp4_parser.cc"
4326 break;
4327
4328 case 790: // $@123: %empty
4329#line 2754 "dhcp4_parser.yy"
4330 {
4331 ctx.unique("dhcp-queue-control", ctx.loc2pos(yystack_[0].location));
4332 ElementPtr qc(new MapElement(ctx.loc2pos(yystack_[0].location)));
4333 ctx.stack_.back()->set("dhcp-queue-control", qc);
4334 ctx.stack_.push_back(qc);
4335 ctx.enter(ctx.DHCP_QUEUE_CONTROL);
4336}
4337#line 4338 "dhcp4_parser.cc"
4338 break;
4339
4340 case 791: // dhcp_queue_control: "dhcp-queue-control" $@123 ":" "{" queue_control_params "}"
4341#line 2760 "dhcp4_parser.yy"
4342 {
4343 // The enable queue parameter is required.
4344 ctx.require("enable-queue", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
4345 ctx.stack_.pop_back();
4346 ctx.leave();
4347}
4348#line 4349 "dhcp4_parser.cc"
4349 break;
4350
4351 case 794: // queue_control_params: queue_control_params ","
4352#line 2769 "dhcp4_parser.yy"
4353 {
4354 ctx.warnAboutExtraCommas(yystack_[0].location);
4355 }
4356#line 4357 "dhcp4_parser.cc"
4357 break;
4358
4359 case 801: // enable_queue: "enable-queue" ":" "boolean"
4360#line 2782 "dhcp4_parser.yy"
4361 {
4362 ctx.unique("enable-queue", ctx.loc2pos(yystack_[2].location));
4363 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4364 ctx.stack_.back()->set("enable-queue", b);
4365}
4366#line 4367 "dhcp4_parser.cc"
4367 break;
4368
4369 case 802: // $@124: %empty
4370#line 2788 "dhcp4_parser.yy"
4371 {
4372 ctx.unique("queue-type", ctx.loc2pos(yystack_[0].location));
4373 ctx.enter(ctx.NO_KEYWORD);
4374}
4375#line 4376 "dhcp4_parser.cc"
4376 break;
4377
4378 case 803: // queue_type: "queue-type" $@124 ":" "constant string"
4379#line 2791 "dhcp4_parser.yy"
4380 {
4381 ElementPtr qt(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4382 ctx.stack_.back()->set("queue-type", qt);
4383 ctx.leave();
4384}
4385#line 4386 "dhcp4_parser.cc"
4386 break;
4387
4388 case 804: // capacity: "capacity" ":" "integer"
4389#line 2797 "dhcp4_parser.yy"
4390 {
4391 ctx.unique("capacity", ctx.loc2pos(yystack_[2].location));
4392 ElementPtr c(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4393 ctx.stack_.back()->set("capacity", c);
4394}
4395#line 4396 "dhcp4_parser.cc"
4396 break;
4397
4398 case 805: // $@125: %empty
4399#line 2803 "dhcp4_parser.yy"
4400 {
4401 ctx.unique(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location));
4402 ctx.enter(ctx.NO_KEYWORD);
4403}
4404#line 4405 "dhcp4_parser.cc"
4405 break;
4406
4407 case 806: // arbitrary_map_entry: "constant string" $@125 ":" value
4408#line 2806 "dhcp4_parser.yy"
4409 {
4410 ctx.stack_.back()->set(yystack_[3].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
4411 ctx.leave();
4412}
4413#line 4414 "dhcp4_parser.cc"
4414 break;
4415
4416 case 807: // $@126: %empty
4417#line 2813 "dhcp4_parser.yy"
4418 {
4419 ctx.unique("dhcp-ddns", ctx.loc2pos(yystack_[0].location));
4420 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4421 ctx.stack_.back()->set("dhcp-ddns", m);
4422 ctx.stack_.push_back(m);
4423 ctx.enter(ctx.DHCP_DDNS);
4424}
4425#line 4426 "dhcp4_parser.cc"
4426 break;
4427
4428 case 808: // dhcp_ddns: "dhcp-ddns" $@126 ":" "{" dhcp_ddns_params "}"
4429#line 2819 "dhcp4_parser.yy"
4430 {
4431 // The enable updates DHCP DDNS parameter is required.
4432 ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
4433 ctx.stack_.pop_back();
4434 ctx.leave();
4435}
4436#line 4437 "dhcp4_parser.cc"
4437 break;
4438
4439 case 809: // $@127: %empty
4440#line 2826 "dhcp4_parser.yy"
4441 {
4442 // Parse the dhcp-ddns map
4443 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4444 ctx.stack_.push_back(m);
4445}
4446#line 4447 "dhcp4_parser.cc"
4447 break;
4448
4449 case 810: // sub_dhcp_ddns: "{" $@127 dhcp_ddns_params "}"
4450#line 2830 "dhcp4_parser.yy"
4451 {
4452 // The enable updates DHCP DDNS parameter is required.
4453 ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
4454 // parsing completed
4455}
4456#line 4457 "dhcp4_parser.cc"
4457 break;
4458
4459 case 813: // dhcp_ddns_params: dhcp_ddns_params ","
4460#line 2838 "dhcp4_parser.yy"
4461 {
4462 ctx.warnAboutExtraCommas(yystack_[0].location);
4463 }
4464#line 4465 "dhcp4_parser.cc"
4465 break;
4466
4467 case 825: // enable_updates: "enable-updates" ":" "boolean"
4468#line 2856 "dhcp4_parser.yy"
4469 {
4470 ctx.unique("enable-updates", ctx.loc2pos(yystack_[2].location));
4471 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4472 ctx.stack_.back()->set("enable-updates", b);
4473}
4474#line 4475 "dhcp4_parser.cc"
4475 break;
4476
4477 case 826: // $@128: %empty
4478#line 2862 "dhcp4_parser.yy"
4479 {
4480 ctx.unique("server-ip", ctx.loc2pos(yystack_[0].location));
4481 ctx.enter(ctx.NO_KEYWORD);
4482}
4483#line 4484 "dhcp4_parser.cc"
4484 break;
4485
4486 case 827: // server_ip: "server-ip" $@128 ":" "constant string"
4487#line 2865 "dhcp4_parser.yy"
4488 {
4489 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4490 ctx.stack_.back()->set("server-ip", s);
4491 ctx.leave();
4492}
4493#line 4494 "dhcp4_parser.cc"
4494 break;
4495
4496 case 828: // server_port: "server-port" ":" "integer"
4497#line 2871 "dhcp4_parser.yy"
4498 {
4499 ctx.unique("server-port", ctx.loc2pos(yystack_[2].location));
4500 ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4501 ctx.stack_.back()->set("server-port", i);
4502}
4503#line 4504 "dhcp4_parser.cc"
4504 break;
4505
4506 case 829: // $@129: %empty
4507#line 2877 "dhcp4_parser.yy"
4508 {
4509 ctx.unique("sender-ip", ctx.loc2pos(yystack_[0].location));
4510 ctx.enter(ctx.NO_KEYWORD);
4511}
4512#line 4513 "dhcp4_parser.cc"
4513 break;
4514
4515 case 830: // sender_ip: "sender-ip" $@129 ":" "constant string"
4516#line 2880 "dhcp4_parser.yy"
4517 {
4518 ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4519 ctx.stack_.back()->set("sender-ip", s);
4520 ctx.leave();
4521}
4522#line 4523 "dhcp4_parser.cc"
4523 break;
4524
4525 case 831: // sender_port: "sender-port" ":" "integer"
4526#line 2886 "dhcp4_parser.yy"
4527 {
4528 ctx.unique("sender-port", ctx.loc2pos(yystack_[2].location));
4529 ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4530 ctx.stack_.back()->set("sender-port", i);
4531}
4532#line 4533 "dhcp4_parser.cc"
4533 break;
4534
4535 case 832: // max_queue_size: "max-queue-size" ":" "integer"
4536#line 2892 "dhcp4_parser.yy"
4537 {
4538 ctx.unique("max-queue-size", ctx.loc2pos(yystack_[2].location));
4539 ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4540 ctx.stack_.back()->set("max-queue-size", i);
4541}
4542#line 4543 "dhcp4_parser.cc"
4543 break;
4544
4545 case 833: // $@130: %empty
4546#line 2898 "dhcp4_parser.yy"
4547 {
4548 ctx.unique("ncr-protocol", ctx.loc2pos(yystack_[0].location));
4549 ctx.enter(ctx.NCR_PROTOCOL);
4550}
4551#line 4552 "dhcp4_parser.cc"
4552 break;
4553
4554 case 834: // ncr_protocol: "ncr-protocol" $@130 ":" ncr_protocol_value
4555#line 2901 "dhcp4_parser.yy"
4556 {
4557 ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ());
4558 ctx.leave();
4559}
4560#line 4561 "dhcp4_parser.cc"
4561 break;
4562
4563 case 835: // ncr_protocol_value: "udp"
4564#line 2907 "dhcp4_parser.yy"
4565 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
4566#line 4567 "dhcp4_parser.cc"
4567 break;
4568
4569 case 836: // ncr_protocol_value: "tcp"
4570#line 2908 "dhcp4_parser.yy"
4571 { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
4572#line 4573 "dhcp4_parser.cc"
4573 break;
4574
4575 case 837: // $@131: %empty
4576#line 2911 "dhcp4_parser.yy"
4577 {
4578 ctx.unique("ncr-format", ctx.loc2pos(yystack_[0].location));
4579 ctx.enter(ctx.NCR_FORMAT);
4580}
4581#line 4582 "dhcp4_parser.cc"
4582 break;
4583
4584 case 838: // ncr_format: "ncr-format" $@131 ":" "JSON"
4585#line 2914 "dhcp4_parser.yy"
4586 {
4587 ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
4588 ctx.stack_.back()->set("ncr-format", json);
4589 ctx.leave();
4590}
4591#line 4592 "dhcp4_parser.cc"
4592 break;
4593
4594 case 839: // $@132: %empty
4595#line 2922 "dhcp4_parser.yy"
4596 {
4597 ctx.unique("config-control", ctx.loc2pos(yystack_[0].location));
4598 ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
4599 ctx.stack_.back()->set("config-control", i);
4600 ctx.stack_.push_back(i);
4601 ctx.enter(ctx.CONFIG_CONTROL);
4602}
4603#line 4604 "dhcp4_parser.cc"
4604 break;
4605
4606 case 840: // config_control: "config-control" $@132 ":" "{" config_control_params "}"
4607#line 2928 "dhcp4_parser.yy"
4608 {
4609 // No config control params are required
4610 ctx.stack_.pop_back();
4611 ctx.leave();
4612}
4613#line 4614 "dhcp4_parser.cc"
4614 break;
4615
4616 case 841: // $@133: %empty
4617#line 2934 "dhcp4_parser.yy"
4618 {
4619 // Parse the config-control map
4620 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4621 ctx.stack_.push_back(m);
4622}
4623#line 4624 "dhcp4_parser.cc"
4624 break;
4625
4626 case 842: // sub_config_control: "{" $@133 config_control_params "}"
4627#line 2938 "dhcp4_parser.yy"
4628 {
4629 // No config_control params are required
4630 // parsing completed
4631}
4632#line 4633 "dhcp4_parser.cc"
4633 break;
4634
4635 case 845: // config_control_params: config_control_params ","
4636#line 2946 "dhcp4_parser.yy"
4637 {
4638 ctx.warnAboutExtraCommas(yystack_[0].location);
4639 }
4640#line 4641 "dhcp4_parser.cc"
4641 break;
4642
4643 case 848: // $@134: %empty
4644#line 2956 "dhcp4_parser.yy"
4645 {
4646 ctx.unique("config-databases", ctx.loc2pos(yystack_[0].location));
4647 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
4648 ctx.stack_.back()->set("config-databases", l);
4649 ctx.stack_.push_back(l);
4650 ctx.enter(ctx.CONFIG_DATABASE);
4651}
4652#line 4653 "dhcp4_parser.cc"
4653 break;
4654
4655 case 849: // config_databases: "config-databases" $@134 ":" "[" database_list "]"
4656#line 2962 "dhcp4_parser.yy"
4657 {
4658 ctx.stack_.pop_back();
4659 ctx.leave();
4660}
4661#line 4662 "dhcp4_parser.cc"
4662 break;
4663
4664 case 850: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer"
4665#line 2967 "dhcp4_parser.yy"
4666 {
4667 ctx.unique("config-fetch-wait-time", ctx.loc2pos(yystack_[2].location));
4668 ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4669 ctx.stack_.back()->set("config-fetch-wait-time", value);
4670}
4671#line 4672 "dhcp4_parser.cc"
4672 break;
4673
4674 case 851: // $@135: %empty
4675#line 2975 "dhcp4_parser.yy"
4676 {
4677 ctx.unique("loggers", ctx.loc2pos(yystack_[0].location));
4678 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
4679 ctx.stack_.back()->set("loggers", l);
4680 ctx.stack_.push_back(l);
4681 ctx.enter(ctx.LOGGERS);
4682}
4683#line 4684 "dhcp4_parser.cc"
4684 break;
4685
4686 case 852: // loggers: "loggers" $@135 ":" "[" loggers_entries "]"
4687#line 2981 "dhcp4_parser.yy"
4688 {
4689 ctx.stack_.pop_back();
4690 ctx.leave();
4691}
4692#line 4693 "dhcp4_parser.cc"
4693 break;
4694
4695 case 855: // loggers_entries: loggers_entries ","
4696#line 2990 "dhcp4_parser.yy"
4697 {
4698 ctx.warnAboutExtraCommas(yystack_[0].location);
4699 }
4700#line 4701 "dhcp4_parser.cc"
4701 break;
4702
4703 case 856: // $@136: %empty
4704#line 2996 "dhcp4_parser.yy"
4705 {
4706 ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
4707 ctx.stack_.back()->add(l);
4708 ctx.stack_.push_back(l);
4709}
4710#line 4711 "dhcp4_parser.cc"
4711 break;
4712
4713 case 857: // logger_entry: "{" $@136 logger_params "}"
4714#line 3000 "dhcp4_parser.yy"
4715 {
4716 ctx.stack_.pop_back();
4717}
4718#line 4719 "dhcp4_parser.cc"
4719 break;
4720
4721 case 860: // logger_params: logger_params ","
4722#line 3006 "dhcp4_parser.yy"
4723 {
4724 ctx.warnAboutExtraCommas(yystack_[0].location);
4725 }
4726#line 4727 "dhcp4_parser.cc"
4727 break;
4728
4729 case 868: // debuglevel: "debuglevel" ":" "integer"
4730#line 3020 "dhcp4_parser.yy"
4731 {
4732 ctx.unique("debuglevel", ctx.loc2pos(yystack_[2].location));
4733 ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4734 ctx.stack_.back()->set("debuglevel", dl);
4735}
4736#line 4737 "dhcp4_parser.cc"
4737 break;
4738
4739 case 869: // $@137: %empty
4740#line 3026 "dhcp4_parser.yy"
4741 {
4742 ctx.unique("severity", ctx.loc2pos(yystack_[0].location));
4743 ctx.enter(ctx.NO_KEYWORD);
4744}
4745#line 4746 "dhcp4_parser.cc"
4746 break;
4747
4748 case 870: // severity: "severity" $@137 ":" "constant string"
4749#line 3029 "dhcp4_parser.yy"
4750 {
4751 ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4752 ctx.stack_.back()->set("severity", sev);
4753 ctx.leave();
4754}
4755#line 4756 "dhcp4_parser.cc"
4756 break;
4757
4758 case 871: // $@138: %empty
4759#line 3035 "dhcp4_parser.yy"
4760 {
4761 ctx.unique("output-options", ctx.loc2pos(yystack_[0].location));
4762 ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
4763 ctx.stack_.back()->set("output-options", l);
4764 ctx.stack_.push_back(l);
4765 ctx.enter(ctx.OUTPUT_OPTIONS);
4766}
4767#line 4768 "dhcp4_parser.cc"
4768 break;
4769
4770 case 872: // output_options_list: "output-options" $@138 ":" "[" output_options_list_content "]"
4771#line 3041 "dhcp4_parser.yy"
4772 {
4773 ctx.stack_.pop_back();
4774 ctx.leave();
4775}
4776#line 4777 "dhcp4_parser.cc"
4777 break;
4778
4779 case 875: // output_options_list_content: output_options_list_content ","
4780#line 3048 "dhcp4_parser.yy"
4781 {
4782 ctx.warnAboutExtraCommas(yystack_[0].location);
4783 }
4784#line 4785 "dhcp4_parser.cc"
4785 break;
4786
4787 case 876: // $@139: %empty
4788#line 3053 "dhcp4_parser.yy"
4789 {
4790 ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
4791 ctx.stack_.back()->add(m);
4792 ctx.stack_.push_back(m);
4793}
4794#line 4795 "dhcp4_parser.cc"
4795 break;
4796
4797 case 877: // output_entry: "{" $@139 output_params_list "}"
4798#line 3057 "dhcp4_parser.yy"
4799 {
4800 ctx.stack_.pop_back();
4801}
4802#line 4803 "dhcp4_parser.cc"
4803 break;
4804
4805 case 880: // output_params_list: output_params_list ","
4806#line 3063 "dhcp4_parser.yy"
4807 {
4808 ctx.warnAboutExtraCommas(yystack_[0].location);
4809 }
4810#line 4811 "dhcp4_parser.cc"
4811 break;
4812
4813 case 886: // $@140: %empty
4814#line 3075 "dhcp4_parser.yy"
4815 {
4816 ctx.unique("output", ctx.loc2pos(yystack_[0].location));
4817 ctx.enter(ctx.NO_KEYWORD);
4818}
4819#line 4820 "dhcp4_parser.cc"
4820 break;
4821
4822 case 887: // output: "output" $@140 ":" "constant string"
4823#line 3078 "dhcp4_parser.yy"
4824 {
4825 ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4826 ctx.stack_.back()->set("output", sev);
4827 ctx.leave();
4828}
4829#line 4830 "dhcp4_parser.cc"
4830 break;
4831
4832 case 888: // flush: "flush" ":" "boolean"
4833#line 3084 "dhcp4_parser.yy"
4834 {
4835 ctx.unique("flush", ctx.loc2pos(yystack_[2].location));
4836 ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4837 ctx.stack_.back()->set("flush", flush);
4838}
4839#line 4840 "dhcp4_parser.cc"
4840 break;
4841
4842 case 889: // maxsize: "maxsize" ":" "integer"
4843#line 3090 "dhcp4_parser.yy"
4844 {
4845 ctx.unique("maxsize", ctx.loc2pos(yystack_[2].location));
4846 ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4847 ctx.stack_.back()->set("maxsize", maxsize);
4848}
4849#line 4850 "dhcp4_parser.cc"
4850 break;
4851
4852 case 890: // maxver: "maxver" ":" "integer"
4853#line 3096 "dhcp4_parser.yy"
4854 {
4855 ctx.unique("maxver", ctx.loc2pos(yystack_[2].location));
4856 ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
4857 ctx.stack_.back()->set("maxver", maxver);
4858}
4859#line 4860 "dhcp4_parser.cc"
4860 break;
4861
4862 case 891: // $@141: %empty
4863#line 3102 "dhcp4_parser.yy"
4864 {
4865 ctx.unique("pattern", ctx.loc2pos(yystack_[0].location));
4866 ctx.enter(ctx.NO_KEYWORD);
4867}
4868#line 4869 "dhcp4_parser.cc"
4869 break;
4870
4871 case 892: // pattern: "pattern" $@141 ":" "constant string"
4872#line 3105 "dhcp4_parser.yy"
4873 {
4874 ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
4875 ctx.stack_.back()->set("pattern", sev);
4876 ctx.leave();
4877}
4878#line 4879 "dhcp4_parser.cc"
4879 break;
4880
4881 case 893: // $@142: %empty
4882#line 3111 "dhcp4_parser.yy"
4883 {
4884 ctx.unique("compatibility", ctx.loc2pos(yystack_[0].location));
4885 ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
4886 ctx.stack_.back()->set("compatibility", i);
4887 ctx.stack_.push_back(i);
4888 ctx.enter(ctx.COMPATIBILITY);
4889}
4890#line 4891 "dhcp4_parser.cc"
4891 break;
4892
4893 case 894: // compatibility: "compatibility" $@142 ":" "{" compatibility_params "}"
4894#line 3117 "dhcp4_parser.yy"
4895 {
4896 ctx.stack_.pop_back();
4897 ctx.leave();
4898}
4899#line 4900 "dhcp4_parser.cc"
4900 break;
4901
4902 case 897: // compatibility_params: compatibility_params ","
4903#line 3124 "dhcp4_parser.yy"
4904 {
4905 ctx.warnAboutExtraCommas(yystack_[0].location);
4906 }
4907#line 4908 "dhcp4_parser.cc"
4908 break;
4909
4910 case 903: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean"
4911#line 3136 "dhcp4_parser.yy"
4912 {
4913 ctx.unique("lenient-option-parsing", ctx.loc2pos(yystack_[2].location));
4914 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4915 ctx.stack_.back()->set("lenient-option-parsing", b);
4916}
4917#line 4918 "dhcp4_parser.cc"
4918 break;
4919
4920 case 904: // ignore_dhcp_server_identifier: "ignore-dhcp-server-identifier" ":" "boolean"
4921#line 3142 "dhcp4_parser.yy"
4922 {
4923 ctx.unique("ignore-dhcp-server-identifier", ctx.loc2pos(yystack_[2].location));
4924 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4925 ctx.stack_.back()->set("ignore-dhcp-server-identifier", b);
4926}
4927#line 4928 "dhcp4_parser.cc"
4928 break;
4929
4930 case 905: // ignore_rai_link_selection: "ignore-rai-link-selection" ":" "boolean"
4931#line 3148 "dhcp4_parser.yy"
4932 {
4933 ctx.unique("ignore-rai-link-selection", ctx.loc2pos(yystack_[2].location));
4934 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4935 ctx.stack_.back()->set("ignore-rai-link-selection", b);
4936}
4937#line 4938 "dhcp4_parser.cc"
4938 break;
4939
4940 case 906: // exclude_first_last_24: "exclude-first-last-24" ":" "boolean"
4941#line 3154 "dhcp4_parser.yy"
4942 {
4943 ctx.unique("exclude-first-last-24", ctx.loc2pos(yystack_[2].location));
4944 ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
4945 ctx.stack_.back()->set("exclude-first-last-24", b);
4946}
4947#line 4948 "dhcp4_parser.cc"
4948 break;
4949
4950
4951#line 4952 "dhcp4_parser.cc"
4952
4953 default:
4954 break;
4955 }
4956 }
4957#if YY_EXCEPTIONS
4958 catch (const syntax_error& yyexc)
4959 {
4960 YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
4961 error (yyexc);
4962 YYERROR;
4963 }
4964#endif // YY_EXCEPTIONS
4965 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
4966 yypop_ (yylen);
4967 yylen = 0;
4968
4969 // Shift the result of the reduction.
4970 yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
4971 }
4972 goto yynewstate;
4973
4974
4975 /*--------------------------------------.
4976 | yyerrlab -- here on detecting error. |
4977 `--------------------------------------*/
4978 yyerrlab:
4979 // If not already recovering from an error, report this error.
4980 if (!yyerrstatus_)
4981 {
4982 ++yynerrs_;
4983 context yyctx (*this, yyla);
4984 std::string msg = yysyntax_error_ (yyctx);
4985 error (yyla.location, YY_MOVE (msg));
4986 }
4987
4988
4989 yyerror_range[1].location = yyla.location;
4990 if (yyerrstatus_ == 3)
4991 {
4992 /* If just tried and failed to reuse lookahead token after an
4993 error, discard it. */
4994
4995 // Return failure if at end of input.
4996 if (yyla.kind () == symbol_kind::S_YYEOF)
4997 YYABORT;
4998 else if (!yyla.empty ())
4999 {
5000 yy_destroy_ ("Error: discarding", yyla);
5001 yyla.clear ();
5002 }
5003 }
5004
5005 // Else will try to reuse lookahead token after shifting the error token.
5006 goto yyerrlab1;
5007
5008
5009 /*---------------------------------------------------.
5010 | yyerrorlab -- error raised explicitly by YYERROR. |
5011 `---------------------------------------------------*/
5012 yyerrorlab:
5013 /* Pacify compilers when the user code never invokes YYERROR and
5014 the label yyerrorlab therefore never appears in user code. */
5015 if (false)
5016 YYERROR;
5017
5018 /* Do not reclaim the symbols of the rule whose action triggered
5019 this YYERROR. */
5020 yypop_ (yylen);
5021 yylen = 0;
5022 YY_STACK_PRINT ();
5023 goto yyerrlab1;
5024
5025
5026 /*-------------------------------------------------------------.
5027 | yyerrlab1 -- common code for both syntax error and YYERROR. |
5028 `-------------------------------------------------------------*/
5029 yyerrlab1:
5030 yyerrstatus_ = 3; // Each real token shifted decrements this.
5031 // Pop stack until we find a state that shifts the error token.
5032 for (;;)
5033 {
5034 yyn = yypact_[+yystack_[0].state];
5035 if (!yy_pact_value_is_default_ (yyn))
5036 {
5038 if (0 <= yyn && yyn <= yylast_
5039 && yycheck_[yyn] == symbol_kind::S_YYerror)
5040 {
5041 yyn = yytable_[yyn];
5042 if (0 < yyn)
5043 break;
5044 }
5045 }
5046
5047 // Pop the current state because it cannot handle the error token.
5048 if (yystack_.size () == 1)
5049 YYABORT;
5050
5051 yyerror_range[1].location = yystack_[0].location;
5052 yy_destroy_ ("Error: popping", yystack_[0]);
5053 yypop_ ();
5054 YY_STACK_PRINT ();
5055 }
5056 {
5057 stack_symbol_type error_token;
5058
5059 yyerror_range[2].location = yyla.location;
5060 YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);
5061
5062 // Shift the error token.
5063 error_token.state = state_type (yyn);
5064 yypush_ ("Shifting", YY_MOVE (error_token));
5065 }
5066 goto yynewstate;
5067
5068
5069 /*-------------------------------------.
5070 | yyacceptlab -- YYACCEPT comes here. |
5071 `-------------------------------------*/
5072 yyacceptlab:
5073 yyresult = 0;
5074 goto yyreturn;
5075
5076
5077 /*-----------------------------------.
5078 | yyabortlab -- YYABORT comes here. |
5079 `-----------------------------------*/
5080 yyabortlab:
5081 yyresult = 1;
5082 goto yyreturn;
5083
5084
5085 /*-----------------------------------------------------.
5086 | yyreturn -- parsing is finished, return the result. |
5087 `-----------------------------------------------------*/
5088 yyreturn:
5089 if (!yyla.empty ())
5090 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
5091
5092 /* Do not reclaim the symbols of the rule whose action triggered
5093 this YYABORT or YYACCEPT. */
5094 yypop_ (yylen);
5095 YY_STACK_PRINT ();
5096 while (1 < yystack_.size ())
5097 {
5098 yy_destroy_ ("Cleanup: popping", yystack_[0]);
5099 yypop_ ();
5100 }
5101
5102 return yyresult;
5103 }
5104#if YY_EXCEPTIONS
5105 catch (...)
5106 {
5107 YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
5108 // Do not try to display the values of the reclaimed symbols,
5109 // as their printers might throw an exception.
5110 if (!yyla.empty ())
5111 yy_destroy_ (YY_NULLPTR, yyla);
5112
5113 while (1 < yystack_.size ())
5114 {
5115 yy_destroy_ (YY_NULLPTR, yystack_[0]);
5116 yypop_ ();
5117 }
5118 throw;
5119 }
5120#endif // YY_EXCEPTIONS
5121 }
5122
5123 void
5125 {
5126 error (yyexc.location, yyexc.what ());
5127 }
5128
5129 /* Return YYSTR after stripping away unnecessary quotes and
5130 backslashes, so that it's suitable for yyerror. The heuristic is
5131 that double-quoting is unnecessary unless the string contains an
5132 apostrophe, a comma, or backslash (other than backslash-backslash).
5133 YYSTR is taken from yytname. */
5134 std::string
5135 Dhcp4Parser::yytnamerr_ (const char *yystr)
5136 {
5137 if (*yystr == '"')
5138 {
5139 std::string yyr;
5140 char const *yyp = yystr;
5141
5142 for (;;)
5143 switch (*++yyp)
5144 {
5145 case '\'':
5146 case ',':
5147 goto do_not_strip_quotes;
5148
5149 case '\\':
5150 if (*++yyp != '\\')
5151 goto do_not_strip_quotes;
5152 else
5153 goto append;
5154
5155 append:
5156 default:
5157 yyr += *yyp;
5158 break;
5159
5160 case '"':
5161 return yyr;
5162 }
5163 do_not_strip_quotes: ;
5164 }
5165
5166 return yystr;
5167 }
5168
5169 std::string
5171 {
5172 return yytnamerr_ (yytname_[yysymbol]);
5173 }
5174
5175
5176
5177 // Dhcp4Parser::context.
5179 : yyparser_ (yyparser)
5180 , yyla_ (yyla)
5181 {}
5182
5183 int
5185 {
5186 // Actual number of expected tokens
5187 int yycount = 0;
5188
5189 const int yyn = yypact_[+yyparser_.yystack_[0].state];
5190 if (!yy_pact_value_is_default_ (yyn))
5191 {
5192 /* Start YYX at -YYN if negative to avoid negative indexes in
5193 YYCHECK. In other words, skip the first -YYN actions for
5194 this state because they are default actions. */
5195 const int yyxbegin = yyn < 0 ? -yyn : 0;
5196 // Stay within bounds of both yycheck and yytname.
5197 const int yychecklim = yylast_ - yyn + 1;
5198 const int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
5199 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
5200 if (yycheck_[yyx + yyn] == yyx && yyx != symbol_kind::S_YYerror
5201 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
5202 {
5203 if (!yyarg)
5204 ++yycount;
5205 else if (yycount == yyargn)
5206 return 0;
5207 else
5208 yyarg[yycount++] = YY_CAST (symbol_kind_type, yyx);
5209 }
5210 }
5211
5212 if (yyarg && yycount == 0 && 0 < yyargn)
5213 yyarg[0] = symbol_kind::S_YYEMPTY;
5214 return yycount;
5215 }
5216
5217
5218
5219
5220
5221
5222 int
5223 Dhcp4Parser::yy_syntax_error_arguments_ (const context& yyctx,
5224 symbol_kind_type yyarg[], int yyargn) const
5225 {
5226 /* There are many possibilities here to consider:
5227 - If this state is a consistent state with a default action, then
5228 the only way this function was invoked is if the default action
5229 is an error action. In that case, don't check for expected
5230 tokens because there are none.
5231 - The only way there can be no lookahead present (in yyla) is
5232 if this state is a consistent state with a default action.
5233 Thus, detecting the absence of a lookahead is sufficient to
5234 determine that there is no unexpected or expected token to
5235 report. In that case, just report a simple "syntax error".
5236 - Don't assume there isn't a lookahead just because this state is
5237 a consistent state with a default action. There might have
5238 been a previous inconsistent state, consistent state with a
5239 non-default action, or user semantic action that manipulated
5240 yyla. (However, yyla is currently not documented for users.)
5241 - Of course, the expected token list depends on states to have
5242 correct lookahead information, and it depends on the parser not
5243 to perform extra reductions after fetching a lookahead from the
5244 scanner and before detecting a syntax error. Thus, state merging
5245 (from LALR or IELR) and default reductions corrupt the expected
5246 token list. However, the list is correct for canonical LR with
5247 one exception: it will still contain any token that will not be
5248 accepted due to an error action in a later state.
5249 */
5250
5251 if (!yyctx.lookahead ().empty ())
5252 {
5253 if (yyarg)
5254 yyarg[0] = yyctx.token ();
5255 int yyn = yyctx.expected_tokens (yyarg ? yyarg + 1 : yyarg, yyargn - 1);
5256 return yyn + 1;
5257 }
5258 return 0;
5259 }
5260
5261 // Generate an error message.
5262 std::string
5263 Dhcp4Parser::yysyntax_error_ (const context& yyctx) const
5264 {
5265 // Its maximum.
5266 enum { YYARGS_MAX = 5 };
5267 // Arguments of yyformat.
5268 symbol_kind_type yyarg[YYARGS_MAX];
5269 int yycount = yy_syntax_error_arguments_ (yyctx, yyarg, YYARGS_MAX);
5270
5271 char const* yyformat = YY_NULLPTR;
5272 switch (yycount)
5273 {
5274#define YYCASE_(N, S) \
5275 case N: \
5276 yyformat = S; \
5277 break
5278 default: // Avoid compiler warnings.
5279 YYCASE_ (0, YY_("syntax error"));
5280 YYCASE_ (1, YY_("syntax error, unexpected %s"));
5281 YYCASE_ (2, YY_("syntax error, unexpected %s, expecting %s"));
5282 YYCASE_ (3, YY_("syntax error, unexpected %s, expecting %s or %s"));
5283 YYCASE_ (4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
5284 YYCASE_ (5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
5285#undef YYCASE_
5286 }
5287
5288 std::string yyres;
5289 // Argument number.
5290 std::ptrdiff_t yyi = 0;
5291 for (char const* yyp = yyformat; *yyp; ++yyp)
5292 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
5293 {
5294 yyres += symbol_name (yyarg[yyi++]);
5295 ++yyp;
5296 }
5297 else
5298 yyres += *yyp;
5299 return yyres;
5300 }
5301
5302
5303 const short Dhcp4Parser::yypact_ninf_ = -1300;
5304
5305 const signed char Dhcp4Parser::yytable_ninf_ = -1;
5306
5307 const short
5308 Dhcp4Parser::yypact_[] =
5309 {
5310 415, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5311 -1300, -1300, -1300, -1300, 35, 51, 30, 41, 48, 50,
5312 62, 65, 77, 81, 83, 99, 101, 116, -1300, -1300,
5313 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5314 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5315 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5316 -1300, -1300, -1300, -1300, 51, -142, 84, 683, 95, 167,
5317 91, 278, -6, 1, 322, -96, 440, 87, -1300, 126,
5318 135, 138, 142, 153, -1300, 44, -1300, -1300, -1300, -1300,
5319 154, 207, 237, -1300, -1300, -1300, 239, 251, -1300, -1300,
5320 -1300, 255, 257, 259, 274, 276, 288, 294, 296, 311,
5321 319, 325, -1300, 332, 334, 335, 342, 344, -1300, -1300,
5322 -1300, 353, 364, 374, 375, -1300, -1300, -1300, 378, -1300,
5323 -1300, -1300, -1300, -1300, 393, 395, 402, -1300, -1300, -1300,
5324 -1300, -1300, 403, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5325 404, 434, 437, -1300, -1300, 444, -1300, 93, -1300, -1300,
5326 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5327 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5328 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5329 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5330 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5331 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5332 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5333 450, 452, 462, 474, -1300, 131, -1300, -1300, -1300, -1300,
5334 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5335 -1300, -1300, 478, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5336 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5337 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5338 -1300, -1300, -1300, -1300, 149, -1300, -1300, -1300, -1300, -1300,
5339 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5340 -1300, -1300, -1300, -1300, -1300, -1300, -1300, 482, -1300, -1300,
5341 -1300, -1300, 182, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5342 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5343 178, 306, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5344 -1300, -1300, -1300, -1300, 309, -1300, -1300, 485, -1300, -1300,
5345 -1300, 486, -1300, -1300, 348, 428, -1300, -1300, -1300, -1300,
5346 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 490,
5347 493, 495, -1300, -1300, -1300, -1300, -1300, 373, 472, -1300,
5348 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5349 -1300, -1300, -1300, 204, -1300, -1300, -1300, 509, -1300, 510,
5350 -1300, 512, 516, -1300, -1300, -1300, -1300, -1300, 205, -1300,
5351 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 517,
5352 215, -1300, -1300, -1300, -1300, 51, 51, -1300, 217, 518,
5353 -1300, -1300, 521, 522, 523, 302, 303, 304, 529, 532,
5354 533, 315, 314, 537, 539, 543, 324, 326, 328, 337,
5355 341, 330, 338, 343, 345, 347, 349, 555, 350, 356,
5356 340, 346, 351, 563, 565, 572, 355, 358, 360, 363,
5357 583, 584, 587, 368, 591, 595, 598, 599, 601, 381,
5358 383, 384, 607, 609, 610, 611, 612, 414, 635, 637,
5359 639, 640, 641, 642, 644, 423, 426, 429, 646, 647,
5360 -1300, 683, -1300, 649, 650, 652, 431, 432, 435, 438,
5361 95, -1300, 657, 660, 661, 662, 663, 664, 445, 666,
5362 667, 668, 167, -1300, 669, 451, 91, -1300, 670, 672,
5363 675, 676, 678, 679, 680, 682, -1300, 278, -1300, 684,
5364 685, 463, 686, 687, 688, 467, -1300, 1, 696, 475,
5365 476, 477, 700, -1300, 322, 701, 703, -78, -1300, 484,
5366 704, 487, 719, 500, 501, 722, 723, 440, -1300, 724,
5367 505, 87, -1300, -1300, -1300, 726, 725, 727, 728, 729,
5368 -1300, -1300, -1300, 508, 514, 515, -1300, -1300, 732, 733,
5369 738, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5370 -1300, -1300, 549, -1300, -1300, -1300, -1300, -1300, -113, 550,
5371 551, -1300, -1300, -1300, -1300, 741, 772, 773, -1300, 556,
5372 401, 775, 774, 559, -1300, -1300, -1300, 778, 779, 780,
5373 781, 783, -1300, 784, 785, 788, 789, 792, 577, 578,
5374 -1300, -1300, -1300, 790, 800, -1300, 803, 212, 201, -1300,
5375 -1300, -1300, -1300, -1300, 586, 588, 589, 805, 592, 593,
5376 -1300, 803, 594, 807, -1300, 596, -1300, -1300, 803, 597,
5377 602, 604, 605, 606, 608, 613, -1300, 614, 617, -1300,
5378 618, 619, 620, -1300, -1300, 621, -1300, -1300, -1300, 803,
5379 -1300, 622, 774, -1300, -1300, 623, -1300, 624, -1300, -1300,
5380 18, 547, -1300, 813, -1300, -1300, 51, 683, 87, 95,
5381 279, -1300, -1300, -1300, 120, 120, 814, -1300, -1300, -1300,
5382 -1300, -1300, -1300, -1300, -1300, -1300, 815, 817, 823, -1300,
5383 -1300, -1300, -1300, -1300, -1300, 825, -1300, -1300, -1300, 254,
5384 828, 841, 842, 228, 39, 289, 843, 179, 440, -1300,
5385 -1300, 844, 19, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5386 -1300, -1300, -1300, -1300, 845, -1300, -1300, -1300, -1300, 714,
5387 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5388 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5389 -1300, -1300, -1300, -1300, 814, -1300, 305, 313, 323, -1300,
5390 -1300, 329, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 850,
5391 852, 853, 854, 856, 857, 858, 859, 860, 861, -1300,
5392 862, 863, -1300, -1300, -1300, -1300, -1300, 339, -1300, -1300,
5393 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5394 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5395 -1300, 352, -1300, 864, 865, -1300, -1300, 866, 868, -1300,
5396 -1300, 867, 877, -1300, -1300, 875, 879, -1300, -1300, 878,
5397 880, -1300, -1300, -1300, -1300, -1300, -1300, 118, -1300, -1300,
5398 -1300, -1300, -1300, -1300, -1300, 125, -1300, -1300, 881, 882,
5399 -1300, -1300, 883, 887, -1300, 888, 889, 890, 891, 892,
5400 893, 361, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 894,
5401 895, 896, -1300, 362, -1300, -1300, -1300, -1300, -1300, -1300,
5402 -1300, -1300, -1300, 897, -1300, 898, -1300, -1300, -1300, -1300,
5403 -1300, -1300, 377, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5404 -1300, 885, 900, -1300, 901, -1300, 903, -1300, -1300, -1300,
5405 397, -1300, -1300, -1300, -1300, -1300, 421, -1300, 143, -1300,
5406 904, 905, 906, 907, -1300, 424, -1300, -1300, -1300, -1300,
5407 -1300, 681, -1300, 908, 909, -1300, -1300, 910, -1300, 911,
5408 -1300, -1300, -1300, 912, 915, 279, -1300, 916, 917, 918,
5409 919, 645, 689, 702, 698, 705, 706, 707, 708, 709,
5410 710, 921, 711, 712, 923, 924, 931, 934, 120, -1300,
5411 -1300, 120, -1300, 814, 167, -1300, 815, 1, -1300, 817,
5412 322, -1300, 823, 1321, -1300, 825, 254, -1300, 269, 828,
5413 -1300, 278, -1300, 841, -96, -1300, 842, 715, 716, 717,
5414 718, 720, 721, 228, -1300, 744, 730, 731, 39, -1300,
5415 939, 942, 944, 734, 945, 747, 289, -1300, 289, -1300,
5416 843, 752, 947, 756, 948, 179, -1300, -1300, 226, 844,
5417 -1300, 762, 776, 795, 796, 19, -1300, -1300, 1000, 1007,
5418 91, -1300, 845, 1011, -1300, -1300, 690, 806, -1300, 812,
5419 818, 819, 833, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5420 -1300, -1300, -1300, 139, -1300, -1300, 834, 835, 837, 849,
5421 -1300, 425, -1300, 427, -1300, 1010, -1300, 1018, -1300, -1300,
5422 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5423 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5424 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5425 -1300, -1300, -1300, -1300, -1300, 436, -1300, -1300, -1300, -1300,
5426 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 1069, -1300,
5427 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5428 -1300, -1300, 1098, 1104, -1300, -1300, -1300, -1300, -1300, -1300,
5429 1100, -1300, 439, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5430 -1300, -1300, -1300, -1300, -1300, 17, 899, 902, -1300, 1103,
5431 -1300, -1300, 454, -1300, -1300, 913, -1300, 51, -1300, -1300,
5432 1107, -1300, -1300, -1300, -1300, -1300, 455, -1300, -1300, -1300,
5433 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 914, 461,
5434 -1300, 803, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5435 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5436 1321, -1300, 1108, 1110, 920, -1300, 269, -1300, -1300, -1300,
5437 -1300, -1300, -1300, -1300, -1300, 21, -1300, -1300, -1300, 1111,
5438 925, 1112, 226, -1300, -1300, -1300, -1300, -1300, 922, 927,
5439 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 464,
5440 -1300, -1300, -1300, -1300, -1300, 1113, -1300, 928, -1300, -1300,
5441 -1300, 1115, 1116, 1117, 1119, 21, -1300, 1120, -1300, 952,
5442 929, 930, 1121, -1300, -1300, 293, -1300, -1300, -1300, -1300,
5443 -1300, 1122, 66, 1120, -1300, -1300, 1118, 1125, -1300, -1300,
5444 1126, 1127, 1128, -1300, 471, -1300, -1300, -1300, -1300, -1300,
5445 -1300, -1300, 175, -1300, 1122, 1129, 933, 932, 936, 1130,
5446 66, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 473,
5447 -1300, -1300, -1300, -1300, 938, -1300, -1300, -1300, 940, -1300,
5448 1131, 1134, 175, -1300, -1300, -1300, 941, 943, -1300, -1300,
5449 -1300
5450 };
5451
5452 const short
5453 Dhcp4Parser::yydefact_[] =
5454 {
5455 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
5456 20, 22, 24, 26, 0, 0, 0, 0, 0, 0,
5457 0, 0, 0, 0, 0, 0, 0, 0, 1, 44,
5458 36, 32, 31, 28, 29, 30, 35, 3, 33, 34,
5459 59, 5, 65, 7, 208, 9, 385, 11, 598, 13,
5460 627, 15, 513, 17, 522, 19, 561, 21, 347, 23,
5461 809, 25, 841, 27, 46, 39, 0, 0, 0, 0,
5462 0, 629, 0, 524, 563, 0, 0, 0, 48, 0,
5463 47, 0, 0, 40, 61, 0, 63, 839, 193, 226,
5464 0, 0, 0, 649, 651, 653, 0, 0, 224, 237,
5465 239, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5466 0, 0, 150, 0, 0, 0, 0, 0, 161, 168,
5467 170, 0, 0, 0, 0, 376, 511, 552, 0, 153,
5468 174, 456, 614, 616, 0, 0, 0, 309, 676, 618,
5469 338, 359, 0, 324, 711, 713, 790, 807, 181, 183,
5470 0, 0, 0, 851, 893, 0, 138, 0, 67, 70,
5471 71, 72, 73, 74, 108, 109, 110, 111, 112, 75,
5472 104, 134, 135, 93, 94, 95, 116, 117, 118, 119,
5473 120, 121, 122, 123, 124, 125, 114, 115, 126, 127,
5474 128, 130, 131, 132, 136, 137, 78, 79, 101, 80,
5475 81, 82, 129, 86, 87, 76, 105, 106, 107, 77,
5476 84, 85, 99, 100, 102, 96, 97, 98, 83, 88,
5477 89, 90, 91, 92, 103, 113, 133, 210, 212, 216,
5478 0, 0, 0, 0, 207, 0, 195, 198, 199, 200,
5479 201, 202, 203, 204, 205, 206, 440, 442, 444, 589,
5480 438, 446, 0, 450, 448, 671, 437, 390, 391, 392,
5481 393, 394, 417, 418, 419, 420, 421, 435, 407, 408,
5482 422, 423, 424, 425, 426, 427, 428, 429, 430, 431,
5483 432, 433, 434, 436, 0, 387, 397, 412, 413, 414,
5484 398, 400, 401, 403, 404, 405, 399, 395, 396, 415,
5485 416, 402, 409, 410, 411, 406, 611, 0, 610, 606,
5486 607, 605, 0, 600, 603, 604, 608, 609, 669, 655,
5487 657, 659, 663, 661, 667, 665, 648, 642, 646, 647,
5488 0, 630, 631, 643, 644, 645, 639, 634, 640, 636,
5489 637, 638, 641, 635, 0, 542, 283, 0, 546, 544,
5490 549, 0, 538, 539, 0, 525, 526, 529, 541, 530,
5491 531, 532, 548, 533, 534, 535, 536, 537, 580, 0,
5492 0, 0, 587, 578, 579, 582, 583, 0, 564, 565,
5493 568, 569, 570, 571, 572, 573, 574, 577, 575, 576,
5494 355, 357, 352, 0, 349, 353, 354, 0, 826, 0,
5495 829, 0, 0, 833, 837, 824, 822, 823, 0, 811,
5496 814, 815, 816, 817, 818, 819, 820, 821, 848, 0,
5497 0, 843, 846, 847, 45, 50, 0, 37, 43, 0,
5498 64, 60, 0, 0, 0, 0, 0, 0, 0, 0,
5499 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5500 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5501 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5503 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5505 58, 69, 66, 0, 0, 0, 0, 0, 0, 0,
5506 197, 209, 0, 0, 0, 0, 0, 0, 0, 0,
5507 0, 0, 389, 386, 0, 0, 602, 599, 0, 0,
5508 0, 0, 0, 0, 0, 0, 628, 633, 514, 0,
5509 0, 0, 0, 0, 0, 0, 523, 528, 0, 0,
5510 0, 0, 0, 562, 567, 0, 0, 351, 348, 0,
5511 0, 0, 0, 0, 0, 0, 0, 813, 810, 0,
5512 0, 845, 842, 49, 41, 0, 0, 0, 0, 0,
5513 155, 156, 157, 0, 0, 0, 191, 192, 0, 0,
5514 0, 139, 140, 141, 142, 143, 144, 145, 146, 147,
5515 148, 149, 0, 186, 187, 158, 159, 160, 0, 0,
5516 0, 172, 173, 180, 185, 0, 0, 0, 152, 0,
5517 0, 0, 0, 0, 452, 453, 454, 0, 0, 0,
5518 0, 0, 710, 0, 0, 0, 0, 0, 0, 0,
5519 188, 189, 190, 0, 0, 68, 0, 0, 0, 220,
5520 221, 222, 223, 196, 0, 0, 0, 0, 0, 0,
5521 455, 0, 0, 0, 388, 0, 613, 601, 0, 0,
5522 0, 0, 0, 0, 0, 0, 632, 0, 0, 540,
5523 0, 0, 0, 551, 527, 0, 584, 585, 586, 0,
5524 566, 0, 0, 350, 825, 0, 828, 0, 831, 832,
5525 0, 0, 812, 0, 850, 844, 0, 0, 0, 0,
5526 0, 650, 652, 654, 0, 0, 241, 151, 163, 164,
5527 165, 166, 167, 162, 169, 171, 378, 515, 554, 154,
5528 176, 177, 178, 179, 175, 458, 38, 615, 617, 0,
5529 0, 620, 340, 0, 0, 0, 715, 0, 0, 182,
5530 184, 0, 0, 51, 211, 214, 215, 213, 218, 219,
5531 217, 441, 443, 445, 591, 439, 447, 451, 449, 0,
5532 612, 670, 656, 658, 660, 664, 662, 668, 666, 543,
5533 284, 547, 545, 550, 581, 588, 356, 358, 827, 830,
5534 835, 836, 834, 838, 241, 42, 0, 0, 0, 233,
5535 235, 0, 228, 231, 232, 274, 276, 278, 280, 0,
5536 0, 0, 0, 0, 0, 0, 0, 0, 0, 294,
5537 0, 0, 301, 303, 305, 307, 273, 0, 248, 251,
5538 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
5539 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
5540 272, 0, 246, 0, 242, 243, 383, 0, 379, 380,
5541 520, 0, 516, 517, 559, 0, 555, 556, 463, 0,
5542 459, 460, 319, 320, 321, 322, 323, 0, 311, 314,
5543 315, 316, 317, 318, 681, 0, 678, 625, 0, 621,
5544 622, 345, 0, 341, 342, 0, 0, 0, 0, 0,
5545 0, 0, 361, 364, 365, 366, 367, 368, 369, 0,
5546 0, 0, 334, 0, 326, 329, 330, 331, 332, 333,
5547 737, 742, 744, 0, 748, 0, 736, 730, 731, 732,
5548 734, 735, 0, 722, 725, 726, 727, 728, 733, 729,
5549 720, 0, 716, 717, 0, 802, 0, 805, 798, 799,
5550 0, 792, 795, 796, 797, 800, 0, 856, 0, 853,
5551 0, 0, 0, 0, 902, 0, 895, 898, 899, 900,
5552 901, 53, 596, 0, 592, 593, 674, 0, 673, 0,
5553 62, 840, 194, 0, 0, 230, 227, 0, 0, 0,
5554 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5555 0, 0, 0, 0, 0, 0, 0, 0, 250, 225,
5556 238, 0, 240, 245, 0, 377, 382, 524, 512, 519,
5557 563, 553, 558, 0, 457, 462, 313, 310, 683, 680,
5558 677, 629, 619, 624, 0, 339, 344, 0, 0, 0,
5559 0, 0, 0, 363, 360, 0, 0, 0, 328, 325,
5560 0, 0, 0, 0, 0, 0, 724, 712, 0, 714,
5561 719, 0, 0, 0, 0, 794, 791, 808, 0, 855,
5562 852, 0, 0, 0, 0, 897, 894, 55, 0, 54,
5563 0, 590, 595, 0, 672, 849, 0, 0, 229, 0,
5564 0, 0, 0, 282, 285, 286, 287, 288, 289, 290,
5565 291, 292, 293, 0, 299, 300, 0, 0, 0, 0,
5566 249, 0, 244, 0, 381, 0, 518, 0, 557, 510,
5567 485, 486, 487, 471, 472, 490, 491, 492, 493, 494,
5568 508, 474, 475, 495, 496, 497, 498, 499, 500, 501,
5569 502, 503, 504, 505, 506, 507, 509, 468, 469, 470,
5570 483, 484, 480, 481, 482, 0, 465, 473, 488, 489,
5571 476, 477, 478, 479, 461, 312, 705, 707, 0, 699,
5572 700, 701, 702, 703, 704, 692, 693, 697, 698, 694,
5573 695, 696, 0, 684, 685, 688, 689, 690, 691, 679,
5574 0, 623, 0, 343, 370, 371, 372, 373, 374, 375,
5575 362, 335, 336, 337, 327, 0, 0, 0, 746, 0,
5576 747, 723, 0, 718, 801, 0, 804, 0, 793, 871,
5577 0, 869, 867, 861, 865, 866, 0, 858, 863, 864,
5578 862, 854, 903, 904, 905, 906, 896, 52, 57, 0,
5579 594, 0, 234, 236, 275, 277, 279, 281, 296, 297,
5580 298, 295, 302, 304, 306, 308, 247, 384, 521, 560,
5581 467, 464, 0, 0, 0, 682, 687, 626, 346, 739,
5582 740, 741, 738, 743, 745, 0, 721, 803, 806, 0,
5583 0, 0, 860, 857, 56, 597, 675, 466, 0, 0,
5584 709, 686, 760, 763, 765, 767, 759, 758, 757, 0,
5585 750, 753, 754, 755, 756, 0, 868, 0, 859, 706,
5586 708, 0, 0, 0, 0, 752, 749, 0, 870, 0,
5587 0, 0, 0, 751, 876, 0, 873, 762, 761, 764,
5588 766, 769, 0, 875, 872, 774, 0, 770, 771, 886,
5589 0, 0, 0, 891, 0, 878, 881, 882, 883, 884,
5590 885, 874, 0, 768, 773, 0, 0, 0, 0, 0,
5591 880, 877, 786, 788, 785, 779, 781, 783, 784, 0,
5592 776, 780, 782, 772, 0, 888, 889, 890, 0, 879,
5593 0, 0, 778, 775, 887, 892, 0, 0, 777, 787,
5594 789
5595 };
5596
5597 const short
5598 Dhcp4Parser::yypgoto_[] =
5599 {
5600 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5601 -1300, -1300, -1300, -1300, -1300, -59, -1300, -580, -1300, 194,
5602 -1300, -1300, -1300, -1300, -1300, -1300, -635, -1300, -1300, -1300,
5603 -67, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 433, 638,
5604 36, 38, 40, -54, -51, -39, -38, -37, -20, -19,
5605 -1300, -1300, -1300, -1300, -18, -1300, -1300, 10, 13, 56,
5606 57, 60, 61, -1300, -1300, 64, -1300, 68, -1300, 71,
5607 72, 74, -1300, -1300, 75, 76, -1300, 78, -1300, 79,
5608 -1300, -1300, -1300, -1300, -1300, 53, -1300, -1300, -1300, 446,
5609 631, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5610 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5611 157, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 354,
5612 -1300, 130, -1300, -692, 136, -1300, -1300, -1299, -1300, -1290,
5613 -1300, -1300, -1300, -1300, -30, -1300, -1300, -1300, -1300, -1300,
5614 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5615 -734, -1300, -731, -1300, -728, -1300, -1300, -1300, -1300, -1300,
5616 -1300, 121, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5617 106, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 129, -1300,
5618 -1300, -1300, 123, 615, -1300, -1300, -1300, -1300, -1300, -1300,
5619 -1300, 119, -1300, -1300, -1300, -1300, -1300, -1300, -995, -1300,
5620 -1300, -1300, 151, -1300, -1300, -1300, 155, 648, -1300, -1300,
5621 -1300, -1300, -1300, -1300, -1300, -1300, -994, -1300, -11, -1300,
5622 23, -1300, 82, 86, 90, -1300, -1300, -1300, -1300, -1300,
5623 146, -1300, -1300, -92, -62, -1300, -1300, -1300, -1300, -1300,
5624 156, -1300, -1300, -1300, 159, -1300, 626, -1300, -61, -1300,
5625 -1300, -1300, -1300, -1300, -58, -1300, -1300, -1300, -1300, -1300,
5626 -31, -1300, -1300, -1300, 152, -1300, -1300, -1300, 158, -1300,
5627 625, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5628 -1300, -1300, -1300, -1300, -1300, 98, -1300, -1300, -1300, 97,
5629 655, -1300, -1300, -1300, -49, -1300, -3, -1300, -57, -1300,
5630 -1300, -1300, 150, -1300, -1300, -1300, 160, -1300, 651, 9,
5631 -1300, 16, -1300, 20, -1300, -1300, -1300, -1300, -1300, -1300,
5632 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5633 -1300, -989, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 161,
5634 -1300, -1300, -1300, -84, -1300, -1300, -1300, -1300, -1300, -1300,
5635 -1300, -1300, -1300, -1300, -1300, -1300, -1300, 124, -1300, 127,
5636 133, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5637 -1300, -1300, -1300, -129, -1300, -1300, -1300, -1300, -1300, -1300,
5638 -1300, -1300, -1300, -1300, -1300, -167, -1300, -1300, -190, -1300,
5639 -1300, -1300, -1300, -1300, -1300, -1300, 132, -1300, -1300, -1300,
5640 -1300, -1300, -1300, -1300, -1300, -1300, -1300, 447, 627, -1300,
5641 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300,
5642 -1300, -1300, -1300, -1300, -1300, -1300, 488, 629, -1300, -1300,
5643 -1300, -1300, -1300, -1300, 134, -1300, -1300, -81, -1300, -1300,
5644 -1300, -1300, -1300, -1300, -135, -1300, -1300, -158, -1300, -1300,
5645 -1300, -1300, -1300, -1300, -1300, -1300, -1300, -1300, 137, -1300,
5646 -1300, -1300, -1300
5647 };
5648
5649 const short
5650 Dhcp4Parser::yydefgoto_[] =
5651 {
5652 0, 14, 15, 16, 17, 18, 19, 20, 21, 22,
5653 23, 24, 25, 26, 27, 36, 37, 38, 65, 737,
5654 82, 83, 39, 64, 79, 80, 754, 971, 1078, 1079,
5655 826, 41, 66, 85, 429, 86, 43, 67, 157, 158,
5656 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
5657 169, 170, 457, 171, 172, 474, 173, 174, 175, 176,
5658 177, 178, 179, 463, 723, 180, 464, 181, 465, 182,
5659 183, 184, 475, 734, 185, 186, 493, 187, 494, 188,
5660 189, 190, 191, 192, 193, 194, 195, 196, 433, 235,
5661 236, 45, 68, 237, 503, 238, 504, 757, 239, 505,
5662 760, 240, 241, 242, 243, 197, 443, 198, 434, 801,
5663 802, 803, 983, 804, 984, 199, 444, 200, 445, 853,
5664 854, 855, 1011, 827, 828, 829, 987, 830, 988, 831,
5665 989, 832, 990, 833, 834, 540, 835, 836, 837, 838,
5666 839, 840, 841, 842, 843, 844, 1001, 1251, 845, 846,
5667 847, 1004, 848, 1005, 849, 1006, 850, 1007, 201, 482,
5668 877, 878, 879, 880, 881, 882, 883, 202, 488, 913,
5669 914, 915, 916, 917, 203, 485, 892, 893, 894, 1034,
5670 59, 75, 393, 394, 395, 555, 396, 556, 204, 486,
5671 901, 902, 903, 904, 905, 906, 907, 908, 205, 470,
5672 857, 858, 859, 1014, 47, 69, 284, 285, 286, 516,
5673 287, 512, 288, 513, 289, 514, 290, 517, 291, 520,
5674 292, 519, 206, 207, 208, 296, 209, 476, 869, 870,
5675 871, 1023, 1155, 1156, 210, 471, 53, 72, 861, 862,
5676 863, 1017, 55, 73, 354, 355, 356, 357, 358, 359,
5677 360, 539, 361, 543, 362, 542, 363, 364, 544, 365,
5678 211, 472, 865, 866, 867, 1020, 57, 74, 377, 378,
5679 379, 380, 381, 548, 382, 383, 384, 385, 386, 387,
5680 552, 298, 515, 973, 974, 975, 1080, 49, 70, 312,
5681 313, 314, 524, 315, 212, 477, 213, 478, 214, 484,
5682 888, 889, 890, 1031, 51, 71, 330, 331, 332, 215,
5683 438, 216, 439, 217, 440, 336, 529, 337, 530, 338,
5684 531, 339, 533, 340, 532, 341, 535, 342, 534, 343,
5685 528, 305, 521, 977, 978, 1083, 218, 483, 885, 886,
5686 1028, 1182, 1183, 1184, 1185, 1186, 1262, 1187, 1263, 1188,
5687 219, 220, 489, 221, 490, 941, 942, 943, 1058, 932,
5688 933, 934, 1050, 1272, 935, 1051, 936, 1052, 937, 938,
5689 939, 1054, 1299, 1300, 1301, 1311, 1328, 1302, 1312, 1303,
5690 1313, 1304, 1314, 1336, 1337, 1338, 1352, 1369, 1370, 1371,
5691 1380, 1372, 1381, 222, 491, 950, 951, 952, 953, 1062,
5692 954, 955, 1064, 223, 492, 61, 76, 408, 409, 410,
5693 411, 560, 412, 413, 562, 414, 415, 416, 565, 792,
5694 417, 566, 224, 432, 63, 77, 420, 421, 422, 569,
5695 423, 225, 498, 958, 959, 1068, 1226, 1227, 1228, 1229,
5696 1281, 1230, 1279, 1325, 1326, 1332, 1344, 1345, 1346, 1355,
5697 1347, 1348, 1349, 1350, 1359, 226, 499, 965, 966, 967,
5698 968, 969, 970
5699 };
5700
5701 const short
5702 Dhcp4Parser::yytable_[] =
5703 {
5704 156, 234, 256, 308, 326, 78, 352, 373, 392, 405,
5705 344, 927, 301, 375, 928, 260, 376, 929, 261, 244,
5706 299, 316, 328, 851, 366, 388, 767, 406, 1148, 1149,
5707 262, 263, 264, 771, 1163, 28, 790, 40, 297, 311,
5708 327, 345, 736, 353, 374, 390, 391, 430, 42, 265,
5709 266, 267, 431, 1365, 785, 44, 29, 46, 30, 309,
5710 31, 1292, 1366, 390, 391, 245, 300, 317, 329, 48,
5711 367, 389, 50, 407, 718, 719, 720, 721, 302, 268,
5712 333, 81, 269, 1365, 52, 303, 126, 334, 54, 304,
5713 56, 335, 1366, 310, 84, 346, 501, 347, 348, 418,
5714 419, 502, 349, 350, 351, 257, 58, 258, 60, 259,
5715 227, 228, 736, 722, 229, 132, 133, 230, 231, 232,
5716 233, 1026, 283, 62, 1027, 270, 271, 155, 1029, 272,
5717 273, 1030, 424, 274, 510, 132, 133, 275, 425, 511,
5718 276, 277, 426, 278, 279, 280, 1069, 281, 282, 1070,
5719 427, 293, 522, 132, 133, 294, 428, 523, 435, 295,
5720 805, 806, 807, 808, 809, 810, 811, 812, 813, 814,
5721 815, 816, 817, 818, 819, 1269, 1270, 1271, 820, 821,
5722 822, 823, 824, 825, 127, 526, 536, 1293, 1294, 1295,
5723 527, 909, 910, 911, 1248, 1249, 1250, 91, 92, 93,
5724 94, 95, 96, 791, 306, 132, 133, 557, 567, 132,
5725 133, 436, 558, 568, 346, 253, 806, 807, 571, 254,
5726 307, 758, 759, 572, 155, 960, 961, 962, 963, 755,
5727 756, 101, 102, 103, 104, 105, 106, 107, 108, 109,
5728 110, 437, 155, 441, 155, 115, 116, 117, 118, 119,
5729 120, 121, 122, 123, 124, 442, 246, 247, 248, 446,
5730 127, 447, 155, 448, 1339, 1148, 1149, 1340, 1341, 1342,
5731 1343, 1163, 129, 130, 32, 33, 34, 35, 449, 249,
5732 450, 132, 133, 250, 251, 252, 134, 135, 136, 132,
5733 133, 253, 451, 132, 133, 254, 1333, 139, 452, 1334,
5734 453, 93, 94, 95, 96, 255, 799, 800, 501, 537,
5735 93, 94, 95, 980, 155, 454, 571, 538, 155, 1111,
5736 346, 981, 927, 455, 927, 928, 510, 928, 929, 456,
5737 929, 982, 985, 101, 102, 103, 458, 986, 459, 460,
5738 132, 133, 1008, 155, 1362, 1363, 461, 1009, 462, 822,
5739 823, 824, 944, 945, 946, 1008, 546, 466, 148, 149,
5740 1010, 126, 127, 346, 1043, 1048, 573, 574, 467, 1044,
5741 1049, 127, 895, 896, 897, 898, 899, 900, 468, 469,
5742 1056, 553, 473, 132, 133, 1057, 872, 873, 874, 875,
5743 155, 876, 132, 133, 1166, 1167, 1168, 479, 155, 480,
5744 1065, 318, 947, 132, 133, 1066, 481, 487, 495, 319,
5745 320, 321, 322, 323, 324, 325, 346, 368, 347, 348,
5746 369, 370, 371, 1219, 567, 1220, 1221, 1075, 1008, 1067,
5747 522, 547, 1076, 1256, 156, 1257, 132, 133, 496, 1260,
5748 575, 497, 557, 234, 1261, 372, 920, 1268, 500, 155,
5749 921, 922, 923, 924, 506, 256, 507, 1056, 1282, 308,
5750 925, 244, 1276, 1283, 526, 301, 508, 1315, 260, 1285,
5751 326, 261, 1316, 299, 1360, 554, 1382, 316, 509, 1361,
5752 352, 1383, 518, 262, 263, 264, 525, 373, 328, 541,
5753 545, 297, 155, 375, 549, 311, 376, 550, 366, 551,
5754 405, 155, 265, 266, 267, 388, 327, 245, 730, 731,
5755 732, 733, 155, 559, 561, 309, 563, 353, 406, 300,
5756 564, 570, 576, 317, 374, 577, 578, 579, 580, 581,
5757 582, 302, 268, 583, 329, 269, 584, 585, 303, 586,
5758 587, 588, 304, 589, 367, 155, 333, 590, 591, 310,
5759 592, 389, 593, 334, 132, 133, 596, 335, 257, 602,
5760 258, 594, 259, 597, 407, 595, 605, 608, 598, 609,
5761 599, 600, 606, 601, 603, 283, 610, 607, 270, 271,
5762 604, 611, 272, 273, 612, 613, 274, 615, 616, 614,
5763 275, 617, 618, 276, 277, 619, 278, 279, 280, 620,
5764 281, 282, 621, 622, 293, 623, 1286, 624, 294, 625,
5765 626, 627, 295, 628, 629, 630, 631, 397, 398, 399,
5766 400, 401, 402, 403, 404, 1, 2, 3, 4, 5,
5767 6, 7, 8, 9, 10, 11, 12, 13, 632, 633,
5768 156, 634, 234, 635, 636, 637, 638, 795, 639, 640,
5769 643, 644, 641, 646, 647, 642, 648, 649, 650, 651,
5770 244, 654, 652, 155, 655, 656, 657, 658, 659, 660,
5771 661, 662, 663, 665, 668, 666, 669, 912, 926, 670,
5772 671, 405, 672, 673, 674, 964, 675, 679, 677, 678,
5773 680, 681, 682, 683, 87, 918, 930, 88, 948, 406,
5774 685, 686, 687, 688, 689, 691, 245, 692, 695, 89,
5775 694, 696, 90, 91, 92, 93, 94, 95, 96, 97,
5776 98, 99, 100, 697, 698, 699, 700, 701, 703, 704,
5777 706, 711, 707, 793, 708, 709, 710, 712, 713, 714,
5778 715, 919, 931, 716, 949, 407, 726, 101, 102, 103,
5779 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
5780 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
5781 124, 125, 717, 724, 725, 126, 127, 727, 728, 729,
5782 735, 30, 738, 739, 740, 741, 742, 128, 129, 130,
5783 743, 744, 745, 746, 131, 751, 747, 132, 133, 748,
5784 749, 750, 134, 135, 136, 137, 138, 752, 753, 761,
5785 764, 762, 763, 139, 769, 765, 766, 768, 794, 770,
5786 772, 852, 856, 140, 860, 773, 141, 774, 775, 776,
5787 864, 777, 868, 142, 143, 884, 778, 779, 144, 145,
5788 780, 781, 782, 783, 784, 786, 788, 789, 887, 891,
5789 940, 957, 972, 976, 991, 146, 992, 993, 994, 147,
5790 995, 996, 997, 998, 999, 1000, 1002, 1003, 1013, 1093,
5791 1012, 1016, 1015, 1018, 148, 149, 150, 151, 152, 153,
5792 1019, 1021, 1022, 1025, 1024, 1033, 787, 1032, 154, 1035,
5793 1036, 1059, 1037, 1038, 1039, 1040, 1041, 1042, 1045, 1046,
5794 1047, 1053, 1055, 1060, 1077, 1061, 155, 1063, 1071, 1072,
5795 1073, 1074, 1082, 1242, 1081, 1094, 1086, 1085, 1084, 1087,
5796 1089, 1090, 1091, 1092, 1096, 1103, 1095, 1106, 1107, 1097,
5797 1098, 1099, 1100, 1101, 1102, 1108, 1105, 1104, 1109, 1194,
5798 1195, 1196, 1197, 1205, 1198, 1199, 1206, 256, 1207, 1209,
5799 352, 1215, 1217, 373, 1202, 1203, 1119, 301, 1208, 375,
5800 260, 1169, 376, 261, 326, 299, 1175, 392, 366, 1123,
5801 1201, 388, 1124, 1210, 1158, 262, 263, 264, 1214, 1177,
5802 1216, 912, 328, 297, 1125, 1126, 1127, 353, 1232, 926,
5803 374, 926, 1157, 1147, 265, 266, 267, 1176, 1174, 918,
5804 327, 1222, 1233, 1128, 1129, 1130, 1237, 930, 964, 930,
5805 1238, 300, 1150, 308, 367, 1241, 948, 389, 1258, 1224,
5806 1159, 1234, 1235, 302, 268, 1178, 1259, 269, 329, 1243,
5807 303, 316, 1160, 1131, 304, 1244, 1132, 1179, 1223, 1161,
5808 333, 1245, 1246, 1162, 1180, 919, 1151, 334, 1181, 311,
5809 257, 335, 258, 931, 259, 931, 1247, 1252, 1253, 1120,
5810 1254, 1121, 949, 1122, 1170, 1225, 1171, 283, 1172, 309,
5811 270, 271, 1255, 1264, 272, 273, 1146, 317, 274, 1133,
5812 1134, 1173, 275, 1135, 1136, 276, 277, 1137, 278, 279,
5813 280, 1138, 281, 282, 1139, 1140, 293, 1141, 1142, 1143,
5814 294, 1144, 1145, 310, 295, 1152, 1265, 1266, 1267, 1153,
5815 1275, 1280, 1288, 1154, 1289, 1305, 1307, 1327, 1317, 1319,
5816 1320, 1321, 1273, 1322, 1353, 1274, 1331, 1324, 1354, 1335,
5817 1356, 1357, 1358, 1374, 1378, 1386, 1277, 1284, 1387, 645,
5818 796, 653, 1088, 1112, 1110, 1309, 1290, 1165, 979, 1306,
5819 1310, 1318, 1329, 1330, 1204, 798, 1376, 1192, 1278, 1375,
5820 1377, 1384, 1200, 1385, 1389, 1193, 1390, 1114, 1287, 1113,
5821 664, 1164, 693, 684, 1118, 1116, 1115, 1239, 1117, 690,
5822 1240, 667, 1291, 1191, 1213, 1212, 1323, 1373, 676, 1211,
5823 1189, 1190, 1388, 1119, 702, 956, 797, 1218, 1351, 1169,
5824 705, 1308, 1379, 1231, 1175, 0, 1123, 0, 1296, 1124,
5825 0, 1158, 1236, 0, 0, 1222, 0, 1177, 0, 0,
5826 0, 1125, 1126, 1127, 0, 0, 1297, 0, 0, 1157,
5827 1147, 0, 0, 1224, 0, 1176, 1174, 0, 0, 0,
5828 1128, 1129, 1130, 0, 0, 0, 0, 0, 1296, 1150,
5829 0, 0, 1223, 0, 0, 0, 0, 1159, 0, 0,
5830 0, 0, 0, 1178, 0, 0, 1297, 0, 0, 1160,
5831 1131, 0, 1298, 1132, 0, 1179, 1161, 0, 0, 1225,
5832 1162, 0, 1180, 1151, 0, 1364, 1181, 0, 0, 0,
5833 0, 0, 0, 0, 0, 0, 1120, 0, 1121, 0,
5834 1122, 0, 1170, 1367, 1171, 0, 1172, 0, 0, 0,
5835 0, 0, 1298, 1146, 0, 1364, 1133, 1134, 0, 1173,
5836 1135, 1136, 0, 0, 1137, 0, 0, 0, 1138, 0,
5837 0, 1139, 1140, 1367, 1141, 1142, 1143, 0, 1144, 1145,
5838 0, 0, 1152, 0, 0, 0, 1153, 0, 0, 1368,
5839 1154, 91, 92, 93, 94, 95, 96, 0, 0, 0,
5840 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5841 0, 0, 0, 0, 0, 0, 0, 0, 0, 1368,
5842 0, 0, 0, 0, 0, 101, 102, 103, 104, 105,
5843 106, 107, 108, 109, 110, 0, 0, 0, 0, 115,
5844 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
5845 0, 0, 0, 0, 127, 346, 0, 0, 0, 0,
5846 0, 0, 0, 0, 0, 0, 129, 130, 0, 0,
5847 0, 0, 0, 0, 0, 132, 133, 0, 251, 0,
5848 134, 135, 136, 0, 0, 253, 0, 0, 0, 254,
5849 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
5850 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5851 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5852 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5853 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5854 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5855 0, 0, 148, 149, 0, 0, 0, 0, 0, 0,
5856 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5857 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5858 0, 0, 0, 0, 155
5859 };
5860
5861 const short
5862 Dhcp4Parser::yycheck_[] =
5863 {
5864 67, 68, 69, 70, 71, 64, 73, 74, 75, 76,
5865 72, 745, 69, 74, 745, 69, 74, 745, 69, 68,
5866 69, 70, 71, 715, 73, 74, 661, 76, 1023, 1023,
5867 69, 69, 69, 668, 1023, 0, 18, 7, 69, 70,
5868 71, 40, 622, 73, 74, 141, 142, 3, 7, 69,
5869 69, 69, 8, 1352, 689, 7, 5, 7, 7, 70,
5870 9, 40, 1352, 141, 142, 68, 69, 70, 71, 7,
5871 73, 74, 7, 76, 187, 188, 189, 190, 69, 69,
5872 71, 223, 69, 1382, 7, 69, 92, 71, 7, 69,
5873 7, 71, 1382, 70, 10, 94, 3, 96, 97, 12,
5874 13, 8, 101, 102, 103, 69, 7, 69, 7, 69,
5875 15, 16, 692, 226, 19, 114, 115, 22, 23, 24,
5876 25, 3, 69, 7, 6, 69, 69, 223, 3, 69,
5877 69, 6, 6, 69, 3, 114, 115, 69, 3, 8,
5878 69, 69, 4, 69, 69, 69, 3, 69, 69, 6,
5879 8, 69, 3, 114, 115, 69, 3, 8, 4, 69,
5880 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
5881 50, 51, 52, 53, 54, 158, 159, 160, 58, 59,
5882 60, 61, 62, 63, 93, 3, 8, 166, 167, 168,
5883 8, 152, 153, 154, 55, 56, 57, 30, 31, 32,
5884 33, 34, 35, 185, 113, 114, 115, 3, 3, 114,
5885 115, 4, 8, 8, 94, 124, 41, 42, 3, 128,
5886 129, 20, 21, 8, 223, 206, 207, 208, 209, 17,
5887 18, 64, 65, 66, 67, 68, 69, 70, 71, 72,
5888 73, 4, 223, 4, 223, 78, 79, 80, 81, 82,
5889 83, 84, 85, 86, 87, 4, 89, 90, 91, 4,
5890 93, 4, 223, 4, 198, 1260, 1260, 201, 202, 203,
5891 204, 1260, 105, 106, 223, 224, 225, 226, 4, 112,
5892 4, 114, 115, 116, 117, 118, 119, 120, 121, 114,
5893 115, 124, 4, 114, 115, 128, 3, 130, 4, 6,
5894 4, 32, 33, 34, 35, 138, 27, 28, 3, 3,
5895 32, 33, 34, 8, 223, 4, 3, 8, 223, 1011,
5896 94, 8, 1056, 4, 1058, 1056, 3, 1058, 1056, 4,
5897 1058, 8, 3, 64, 65, 66, 4, 8, 4, 4,
5898 114, 115, 3, 223, 169, 170, 4, 8, 4, 60,
5899 61, 62, 173, 174, 175, 3, 8, 4, 191, 192,
5900 8, 92, 93, 94, 3, 3, 425, 426, 4, 8,
5901 8, 93, 144, 145, 146, 147, 148, 149, 4, 4,
5902 3, 8, 4, 114, 115, 8, 132, 133, 134, 135,
5903 223, 137, 114, 115, 125, 126, 127, 4, 223, 4,
5904 3, 123, 223, 114, 115, 8, 4, 4, 4, 131,
5905 132, 133, 134, 135, 136, 137, 94, 95, 96, 97,
5906 98, 99, 100, 197, 3, 199, 200, 3, 3, 8,
5907 3, 3, 8, 8, 501, 8, 114, 115, 4, 3,
5908 223, 4, 3, 510, 8, 123, 157, 8, 4, 223,
5909 161, 162, 163, 164, 4, 522, 4, 3, 3, 526,
5910 171, 510, 8, 8, 3, 522, 4, 3, 522, 8,
5911 537, 522, 8, 522, 3, 3, 3, 526, 4, 8,
5912 547, 8, 4, 522, 522, 522, 4, 554, 537, 4,
5913 4, 522, 223, 554, 4, 526, 554, 4, 547, 4,
5914 567, 223, 522, 522, 522, 554, 537, 510, 107, 108,
5915 109, 110, 223, 4, 4, 526, 4, 547, 567, 522,
5916 4, 4, 4, 526, 554, 4, 4, 4, 226, 226,
5917 226, 522, 522, 4, 537, 522, 4, 4, 522, 224,
5918 226, 4, 522, 4, 547, 223, 537, 4, 224, 526,
5919 224, 554, 224, 537, 114, 115, 226, 537, 522, 4,
5920 522, 224, 522, 225, 567, 224, 226, 4, 225, 4,
5921 225, 224, 226, 224, 224, 522, 4, 226, 522, 522,
5922 224, 226, 522, 522, 226, 225, 522, 4, 4, 226,
5923 522, 4, 224, 522, 522, 4, 522, 522, 522, 4,
5924 522, 522, 4, 4, 522, 4, 1241, 226, 522, 226,
5925 226, 4, 522, 4, 4, 4, 4, 177, 178, 179,
5926 180, 181, 182, 183, 184, 210, 211, 212, 213, 214,
5927 215, 216, 217, 218, 219, 220, 221, 222, 224, 4,
5928 707, 4, 709, 4, 4, 4, 4, 706, 4, 226,
5929 4, 4, 226, 4, 4, 226, 4, 226, 226, 224,
5930 709, 4, 224, 223, 4, 4, 4, 4, 4, 224,
5931 4, 4, 4, 4, 4, 224, 4, 744, 745, 4,
5932 4, 748, 4, 4, 4, 752, 4, 224, 4, 4,
5933 4, 4, 4, 226, 11, 744, 745, 14, 747, 748,
5934 4, 226, 226, 226, 4, 4, 709, 4, 4, 26,
5935 226, 224, 29, 30, 31, 32, 33, 34, 35, 36,
5936 37, 38, 39, 4, 224, 224, 4, 4, 4, 224,
5937 4, 223, 7, 186, 7, 7, 7, 223, 223, 7,
5938 7, 744, 745, 5, 747, 748, 5, 64, 65, 66,
5939 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
5940 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
5941 87, 88, 223, 223, 223, 92, 93, 5, 5, 223,
5942 5, 7, 223, 5, 5, 5, 5, 104, 105, 106,
5943 7, 7, 7, 5, 111, 5, 7, 114, 115, 7,
5944 223, 223, 119, 120, 121, 122, 123, 7, 5, 223,
5945 5, 223, 223, 130, 7, 223, 223, 223, 5, 223,
5946 223, 7, 7, 140, 7, 223, 143, 223, 223, 223,
5947 7, 223, 7, 150, 151, 7, 223, 223, 155, 156,
5948 223, 223, 223, 223, 223, 223, 223, 223, 7, 7,
5949 7, 7, 7, 139, 4, 172, 4, 4, 4, 176,
5950 4, 4, 4, 4, 4, 4, 4, 4, 3, 224,
5951 6, 3, 6, 6, 191, 192, 193, 194, 195, 196,
5952 3, 6, 3, 3, 6, 3, 692, 6, 205, 6,
5953 3, 6, 4, 4, 4, 4, 4, 4, 4, 4,
5954 4, 4, 4, 3, 223, 4, 223, 4, 4, 4,
5955 4, 4, 3, 223, 6, 226, 4, 6, 8, 4,
5956 4, 4, 4, 4, 226, 4, 224, 4, 4, 224,
5957 224, 224, 224, 224, 224, 4, 224, 226, 4, 224,
5958 224, 224, 224, 4, 224, 224, 4, 1014, 4, 4,
5959 1017, 4, 4, 1020, 224, 224, 1023, 1014, 224, 1020,
5960 1014, 1028, 1020, 1014, 1031, 1014, 1028, 1034, 1017, 1023,
5961 226, 1020, 1023, 226, 1023, 1014, 1014, 1014, 226, 1028,
5962 224, 1048, 1031, 1014, 1023, 1023, 1023, 1017, 226, 1056,
5963 1020, 1058, 1023, 1023, 1014, 1014, 1014, 1028, 1028, 1048,
5964 1031, 1068, 226, 1023, 1023, 1023, 6, 1056, 1075, 1058,
5965 3, 1014, 1023, 1080, 1017, 4, 1065, 1020, 8, 1068,
5966 1023, 226, 226, 1014, 1014, 1028, 8, 1014, 1031, 223,
5967 1014, 1080, 1023, 1023, 1014, 223, 1023, 1028, 1068, 1023,
5968 1031, 223, 223, 1023, 1028, 1048, 1023, 1031, 1028, 1080,
5969 1014, 1031, 1014, 1056, 1014, 1058, 223, 223, 223, 1023,
5970 223, 1023, 1065, 1023, 1028, 1068, 1028, 1014, 1028, 1080,
5971 1014, 1014, 223, 4, 1014, 1014, 1023, 1080, 1014, 1023,
5972 1023, 1028, 1014, 1023, 1023, 1014, 1014, 1023, 1014, 1014,
5973 1014, 1023, 1014, 1014, 1023, 1023, 1014, 1023, 1023, 1023,
5974 1014, 1023, 1023, 1080, 1014, 1023, 8, 3, 8, 1023,
5975 7, 4, 4, 1023, 4, 4, 4, 165, 5, 4,
5976 4, 4, 223, 4, 6, 223, 5, 7, 3, 7,
5977 4, 4, 4, 4, 4, 4, 223, 223, 4, 501,
5978 707, 510, 985, 1013, 1008, 223, 226, 1026, 794, 224,
5979 223, 223, 223, 223, 1048, 709, 224, 1034, 1217, 226,
5980 224, 223, 1043, 223, 223, 1036, 223, 1016, 1260, 1014,
5981 522, 1025, 557, 547, 1022, 1019, 1017, 1080, 1020, 554,
5982 1082, 526, 1266, 1033, 1060, 1058, 1315, 1354, 537, 1056,
5983 1029, 1031, 1382, 1260, 567, 748, 708, 1065, 1333, 1266,
5984 571, 1282, 1360, 1069, 1266, -1, 1260, -1, 1275, 1260,
5985 -1, 1260, 1075, -1, -1, 1282, -1, 1266, -1, -1,
5986 -1, 1260, 1260, 1260, -1, -1, 1275, -1, -1, 1260,
5987 1260, -1, -1, 1282, -1, 1266, 1266, -1, -1, -1,
5988 1260, 1260, 1260, -1, -1, -1, -1, -1, 1315, 1260,
5989 -1, -1, 1282, -1, -1, -1, -1, 1260, -1, -1,
5990 -1, -1, -1, 1266, -1, -1, 1315, -1, -1, 1260,
5991 1260, -1, 1275, 1260, -1, 1266, 1260, -1, -1, 1282,
5992 1260, -1, 1266, 1260, -1, 1352, 1266, -1, -1, -1,
5993 -1, -1, -1, -1, -1, -1, 1260, -1, 1260, -1,
5994 1260, -1, 1266, 1352, 1266, -1, 1266, -1, -1, -1,
5995 -1, -1, 1315, 1260, -1, 1382, 1260, 1260, -1, 1266,
5996 1260, 1260, -1, -1, 1260, -1, -1, -1, 1260, -1,
5997 -1, 1260, 1260, 1382, 1260, 1260, 1260, -1, 1260, 1260,
5998 -1, -1, 1260, -1, -1, -1, 1260, -1, -1, 1352,
5999 1260, 30, 31, 32, 33, 34, 35, -1, -1, -1,
6000 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6001 -1, -1, -1, -1, -1, -1, -1, -1, -1, 1382,
6002 -1, -1, -1, -1, -1, 64, 65, 66, 67, 68,
6003 69, 70, 71, 72, 73, -1, -1, -1, -1, 78,
6004 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
6005 -1, -1, -1, -1, 93, 94, -1, -1, -1, -1,
6006 -1, -1, -1, -1, -1, -1, 105, 106, -1, -1,
6007 -1, -1, -1, -1, -1, 114, 115, -1, 117, -1,
6008 119, 120, 121, -1, -1, 124, -1, -1, -1, 128,
6009 -1, -1, -1, -1, -1, -1, -1, -1, -1, 138,
6010 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6011 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6012 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6013 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6014 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6015 -1, -1, 191, 192, -1, -1, -1, -1, -1, -1,
6016 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6017 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
6018 -1, -1, -1, -1, 223
6019 };
6020
6021 const short
6022 Dhcp4Parser::yystos_[] =
6023 {
6024 0, 210, 211, 212, 213, 214, 215, 216, 217, 218,
6025 219, 220, 221, 222, 228, 229, 230, 231, 232, 233,
6026 234, 235, 236, 237, 238, 239, 240, 241, 0, 5,
6027 7, 9, 223, 224, 225, 226, 242, 243, 244, 249,
6028 7, 258, 7, 263, 7, 318, 7, 431, 7, 514,
6029 7, 531, 7, 463, 7, 469, 7, 493, 7, 407,
6030 7, 632, 7, 651, 250, 245, 259, 264, 319, 432,
6031 515, 532, 464, 470, 494, 408, 633, 652, 242, 251,
6032 252, 223, 247, 248, 10, 260, 262, 11, 14, 26,
6033 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
6034 39, 64, 65, 66, 67, 68, 69, 70, 71, 72,
6035 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
6036 83, 84, 85, 86, 87, 88, 92, 93, 104, 105,
6037 106, 111, 114, 115, 119, 120, 121, 122, 123, 130,
6038 140, 143, 150, 151, 155, 156, 172, 176, 191, 192,
6039 193, 194, 195, 196, 205, 223, 257, 265, 266, 267,
6040 268, 269, 270, 271, 272, 273, 274, 275, 276, 277,
6041 278, 280, 281, 283, 284, 285, 286, 287, 288, 289,
6042 292, 294, 296, 297, 298, 301, 302, 304, 306, 307,
6043 308, 309, 310, 311, 312, 313, 314, 332, 334, 342,
6044 344, 385, 394, 401, 415, 425, 449, 450, 451, 453,
6045 461, 487, 521, 523, 525, 536, 538, 540, 563, 577,
6046 578, 580, 620, 630, 649, 658, 682, 15, 16, 19,
6047 22, 23, 24, 25, 257, 316, 317, 320, 322, 325,
6048 328, 329, 330, 331, 521, 523, 89, 90, 91, 112,
6049 116, 117, 118, 124, 128, 138, 257, 267, 268, 269,
6050 270, 271, 272, 273, 274, 275, 276, 281, 284, 285,
6051 286, 287, 288, 289, 292, 294, 296, 297, 298, 301,
6052 302, 304, 306, 312, 433, 434, 435, 437, 439, 441,
6053 443, 445, 447, 449, 450, 451, 452, 487, 508, 521,
6054 523, 525, 536, 538, 540, 558, 113, 129, 257, 445,
6055 447, 487, 516, 517, 518, 520, 521, 523, 123, 131,
6056 132, 133, 134, 135, 136, 137, 257, 487, 521, 523,
6057 533, 534, 535, 536, 538, 540, 542, 544, 546, 548,
6058 550, 552, 554, 556, 461, 40, 94, 96, 97, 101,
6059 102, 103, 257, 361, 471, 472, 473, 474, 475, 476,
6060 477, 479, 481, 483, 484, 486, 521, 523, 95, 98,
6061 99, 100, 123, 257, 361, 475, 481, 495, 496, 497,
6062 498, 499, 501, 502, 503, 504, 505, 506, 521, 523,
6063 141, 142, 257, 409, 410, 411, 413, 177, 178, 179,
6064 180, 181, 182, 183, 184, 257, 521, 523, 634, 635,
6065 636, 637, 639, 640, 642, 643, 644, 647, 12, 13,
6066 653, 654, 655, 657, 6, 3, 4, 8, 3, 261,
6067 3, 8, 650, 315, 335, 4, 4, 4, 537, 539,
6068 541, 4, 4, 333, 343, 345, 4, 4, 4, 4,
6069 4, 4, 4, 4, 4, 4, 4, 279, 4, 4,
6070 4, 4, 4, 290, 293, 295, 4, 4, 4, 4,
6071 426, 462, 488, 4, 282, 299, 454, 522, 524, 4,
6072 4, 4, 386, 564, 526, 402, 416, 4, 395, 579,
6073 581, 621, 631, 303, 305, 4, 4, 4, 659, 683,
6074 4, 3, 8, 321, 323, 326, 4, 4, 4, 4,
6075 3, 8, 438, 440, 442, 509, 436, 444, 4, 448,
6076 446, 559, 3, 8, 519, 4, 3, 8, 557, 543,
6077 545, 547, 551, 549, 555, 553, 8, 3, 8, 478,
6078 362, 4, 482, 480, 485, 4, 8, 3, 500, 4,
6079 4, 4, 507, 8, 3, 412, 414, 3, 8, 4,
6080 638, 4, 641, 4, 4, 645, 648, 3, 8, 656,
6081 4, 3, 8, 242, 242, 223, 4, 4, 4, 4,
6082 226, 226, 226, 4, 4, 4, 224, 226, 4, 4,
6083 4, 224, 224, 224, 224, 224, 226, 225, 225, 225,
6084 224, 224, 4, 224, 224, 226, 226, 226, 4, 4,
6085 4, 226, 226, 225, 226, 4, 4, 4, 224, 4,
6086 4, 4, 4, 4, 226, 226, 226, 4, 4, 4,
6087 4, 4, 224, 4, 4, 4, 4, 4, 4, 4,
6088 226, 226, 226, 4, 4, 266, 4, 4, 4, 226,
6089 226, 224, 224, 317, 4, 4, 4, 4, 4, 4,
6090 224, 4, 4, 4, 434, 4, 224, 517, 4, 4,
6091 4, 4, 4, 4, 4, 4, 535, 4, 4, 224,
6092 4, 4, 4, 226, 473, 4, 226, 226, 226, 4,
6093 497, 4, 4, 410, 226, 4, 224, 4, 224, 224,
6094 4, 4, 635, 4, 224, 654, 4, 7, 7, 7,
6095 7, 223, 223, 223, 7, 7, 5, 223, 187, 188,
6096 189, 190, 226, 291, 223, 223, 5, 5, 5, 223,
6097 107, 108, 109, 110, 300, 5, 244, 246, 223, 5,
6098 5, 5, 5, 7, 7, 7, 5, 7, 7, 223,
6099 223, 5, 7, 5, 253, 17, 18, 324, 20, 21,
6100 327, 223, 223, 223, 5, 223, 223, 253, 223, 7,
6101 223, 253, 223, 223, 223, 223, 223, 223, 223, 223,
6102 223, 223, 223, 223, 223, 253, 223, 246, 223, 223,
6103 18, 185, 646, 186, 5, 242, 265, 653, 316, 27,
6104 28, 336, 337, 338, 340, 40, 41, 42, 43, 44,
6105 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
6106 58, 59, 60, 61, 62, 63, 257, 350, 351, 352,
6107 354, 356, 358, 360, 361, 363, 364, 365, 366, 367,
6108 368, 369, 370, 371, 372, 375, 376, 377, 379, 381,
6109 383, 350, 7, 346, 347, 348, 7, 427, 428, 429,
6110 7, 465, 466, 467, 7, 489, 490, 491, 7, 455,
6111 456, 457, 132, 133, 134, 135, 137, 387, 388, 389,
6112 390, 391, 392, 393, 7, 565, 566, 7, 527, 528,
6113 529, 7, 403, 404, 405, 144, 145, 146, 147, 148,
6114 149, 417, 418, 419, 420, 421, 422, 423, 424, 152,
6115 153, 154, 257, 396, 397, 398, 399, 400, 521, 523,
6116 157, 161, 162, 163, 164, 171, 257, 377, 379, 381,
6117 521, 523, 586, 587, 588, 591, 593, 595, 596, 597,
6118 7, 582, 583, 584, 173, 174, 175, 223, 521, 523,
6119 622, 623, 624, 625, 627, 628, 634, 7, 660, 661,
6120 206, 207, 208, 209, 257, 684, 685, 686, 687, 688,
6121 689, 254, 7, 510, 511, 512, 139, 560, 561, 346,
6122 8, 8, 8, 339, 341, 3, 8, 353, 355, 357,
6123 359, 4, 4, 4, 4, 4, 4, 4, 4, 4,
6124 4, 373, 4, 4, 378, 380, 382, 384, 3, 8,
6125 8, 349, 6, 3, 430, 6, 3, 468, 6, 3,
6126 492, 6, 3, 458, 6, 3, 3, 6, 567, 3,
6127 6, 530, 6, 3, 406, 6, 3, 4, 4, 4,
6128 4, 4, 4, 3, 8, 4, 4, 4, 3, 8,
6129 589, 592, 594, 4, 598, 4, 3, 8, 585, 6,
6130 3, 4, 626, 4, 629, 3, 8, 8, 662, 3,
6131 6, 4, 4, 4, 4, 3, 8, 223, 255, 256,
6132 513, 6, 3, 562, 8, 6, 4, 4, 337, 4,
6133 4, 4, 4, 224, 226, 224, 226, 224, 224, 224,
6134 224, 224, 224, 4, 226, 224, 4, 4, 4, 4,
6135 351, 350, 348, 433, 429, 471, 467, 495, 491, 257,
6136 267, 268, 269, 270, 271, 272, 273, 274, 275, 276,
6137 281, 284, 285, 286, 287, 288, 289, 292, 294, 296,
6138 297, 298, 301, 302, 304, 306, 312, 361, 425, 443,
6139 445, 447, 449, 450, 451, 459, 460, 487, 521, 523,
6140 536, 538, 540, 558, 457, 388, 125, 126, 127, 257,
6141 267, 268, 269, 312, 361, 461, 487, 521, 523, 536,
6142 538, 540, 568, 569, 570, 571, 572, 574, 576, 566,
6143 533, 529, 409, 405, 224, 224, 224, 224, 224, 224,
6144 418, 226, 224, 224, 397, 4, 4, 4, 224, 4,
6145 226, 587, 586, 584, 226, 4, 224, 4, 623, 197,
6146 199, 200, 257, 361, 521, 523, 663, 664, 665, 666,
6147 668, 661, 226, 226, 226, 226, 685, 6, 3, 516,
6148 512, 4, 223, 223, 223, 223, 223, 223, 55, 56,
6149 57, 374, 223, 223, 223, 223, 8, 8, 8, 8,
6150 3, 8, 573, 575, 4, 8, 3, 8, 8, 158,
6151 159, 160, 590, 223, 223, 7, 8, 223, 242, 669,
6152 4, 667, 3, 8, 223, 8, 253, 460, 4, 4,
6153 226, 570, 40, 166, 167, 168, 257, 521, 523, 599,
6154 600, 601, 604, 606, 608, 4, 224, 4, 664, 223,
6155 223, 602, 605, 607, 609, 3, 8, 5, 223, 4,
6156 4, 4, 4, 600, 7, 670, 671, 165, 603, 223,
6157 223, 5, 672, 3, 6, 7, 610, 611, 612, 198,
6158 201, 202, 203, 204, 673, 674, 675, 677, 678, 679,
6159 680, 671, 613, 6, 3, 676, 4, 4, 4, 681,
6160 3, 8, 169, 170, 257, 354, 356, 521, 523, 614,
6161 615, 616, 618, 612, 4, 226, 224, 224, 4, 674,
6162 617, 619, 3, 8, 223, 223, 4, 4, 615, 223,
6163 223
6164 };
6165
6166 const short
6167 Dhcp4Parser::yyr1_[] =
6168 {
6169 0, 227, 229, 228, 230, 228, 231, 228, 232, 228,
6170 233, 228, 234, 228, 235, 228, 236, 228, 237, 228,
6171 238, 228, 239, 228, 240, 228, 241, 228, 242, 242,
6172 242, 242, 242, 242, 242, 243, 245, 244, 246, 247,
6173 247, 248, 248, 248, 250, 249, 251, 251, 252, 252,
6174 252, 254, 253, 255, 255, 256, 256, 256, 257, 259,
6175 258, 261, 260, 260, 262, 264, 263, 265, 265, 265,
6176 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6177 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6178 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6179 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6180 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6181 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
6182 266, 266, 266, 266, 266, 266, 266, 266, 266, 267,
6183 268, 269, 270, 271, 272, 273, 274, 275, 276, 277,
6184 279, 278, 280, 282, 281, 283, 284, 285, 286, 287,
6185 288, 290, 289, 291, 291, 291, 291, 291, 293, 292,
6186 295, 294, 296, 297, 299, 298, 300, 300, 300, 300,
6187 301, 303, 302, 305, 304, 306, 307, 308, 309, 310,
6188 311, 312, 313, 315, 314, 316, 316, 316, 317, 317,
6189 317, 317, 317, 317, 317, 317, 317, 317, 319, 318,
6190 321, 320, 323, 322, 324, 324, 326, 325, 327, 327,
6191 328, 329, 330, 331, 333, 332, 335, 334, 336, 336,
6192 336, 337, 337, 339, 338, 341, 340, 343, 342, 345,
6193 344, 346, 346, 347, 347, 347, 349, 348, 350, 350,
6194 350, 351, 351, 351, 351, 351, 351, 351, 351, 351,
6195 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
6196 351, 351, 351, 351, 353, 352, 355, 354, 357, 356,
6197 359, 358, 360, 362, 361, 363, 364, 365, 366, 367,
6198 368, 369, 370, 371, 373, 372, 374, 374, 374, 375,
6199 376, 378, 377, 380, 379, 382, 381, 384, 383, 386,
6200 385, 387, 387, 387, 388, 388, 388, 388, 388, 389,
6201 390, 391, 392, 393, 395, 394, 396, 396, 396, 397,
6202 397, 397, 397, 397, 397, 398, 399, 400, 402, 401,
6203 403, 403, 404, 404, 404, 406, 405, 408, 407, 409,
6204 409, 409, 409, 410, 410, 412, 411, 414, 413, 416,
6205 415, 417, 417, 417, 418, 418, 418, 418, 418, 418,
6206 419, 420, 421, 422, 423, 424, 426, 425, 427, 427,
6207 428, 428, 428, 430, 429, 432, 431, 433, 433, 433,
6208 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
6209 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
6210 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
6211 434, 434, 434, 434, 434, 434, 434, 434, 434, 434,
6212 434, 434, 434, 434, 434, 434, 434, 434, 436, 435,
6213 438, 437, 440, 439, 442, 441, 444, 443, 446, 445,
6214 448, 447, 449, 450, 451, 452, 454, 453, 455, 455,
6215 456, 456, 456, 458, 457, 459, 459, 459, 460, 460,
6216 460, 460, 460, 460, 460, 460, 460, 460, 460, 460,
6217 460, 460, 460, 460, 460, 460, 460, 460, 460, 460,
6218 460, 460, 460, 460, 460, 460, 460, 460, 460, 460,
6219 460, 460, 460, 460, 460, 460, 460, 460, 460, 460,
6220 460, 462, 461, 464, 463, 465, 465, 466, 466, 466,
6221 468, 467, 470, 469, 471, 471, 472, 472, 472, 473,
6222 473, 473, 473, 473, 473, 473, 473, 473, 473, 474,
6223 475, 476, 478, 477, 480, 479, 482, 481, 483, 485,
6224 484, 486, 488, 487, 489, 489, 490, 490, 490, 492,
6225 491, 494, 493, 495, 495, 496, 496, 496, 497, 497,
6226 497, 497, 497, 497, 497, 497, 497, 497, 497, 498,
6227 500, 499, 501, 502, 503, 504, 505, 507, 506, 509,
6228 508, 510, 510, 511, 511, 511, 513, 512, 515, 514,
6229 516, 516, 516, 517, 517, 517, 517, 517, 517, 517,
6230 517, 519, 518, 520, 522, 521, 524, 523, 526, 525,
6231 527, 527, 528, 528, 528, 530, 529, 532, 531, 533,
6232 533, 534, 534, 534, 535, 535, 535, 535, 535, 535,
6233 535, 535, 535, 535, 535, 535, 535, 535, 535, 537,
6234 536, 539, 538, 541, 540, 543, 542, 545, 544, 547,
6235 546, 549, 548, 551, 550, 553, 552, 555, 554, 557,
6236 556, 559, 558, 560, 562, 561, 564, 563, 565, 565,
6237 565, 567, 566, 568, 568, 569, 569, 569, 570, 570,
6238 570, 570, 570, 570, 570, 570, 570, 570, 570, 570,
6239 570, 570, 570, 570, 571, 573, 572, 575, 574, 576,
6240 577, 579, 578, 581, 580, 582, 582, 583, 583, 583,
6241 585, 584, 586, 586, 586, 587, 587, 587, 587, 587,
6242 587, 587, 587, 587, 587, 587, 587, 589, 588, 590,
6243 590, 590, 592, 591, 594, 593, 595, 596, 598, 597,
6244 599, 599, 599, 600, 600, 600, 600, 600, 600, 600,
6245 602, 601, 603, 605, 604, 607, 606, 609, 608, 610,
6246 610, 611, 611, 611, 613, 612, 614, 614, 614, 615,
6247 615, 615, 615, 615, 615, 615, 617, 616, 619, 618,
6248 621, 620, 622, 622, 622, 623, 623, 623, 623, 623,
6249 623, 624, 626, 625, 627, 629, 628, 631, 630, 633,
6250 632, 634, 634, 634, 635, 635, 635, 635, 635, 635,
6251 635, 635, 635, 635, 635, 636, 638, 637, 639, 641,
6252 640, 642, 643, 645, 644, 646, 646, 648, 647, 650,
6253 649, 652, 651, 653, 653, 653, 654, 654, 656, 655,
6254 657, 659, 658, 660, 660, 660, 662, 661, 663, 663,
6255 663, 664, 664, 664, 664, 664, 664, 664, 665, 667,
6256 666, 669, 668, 670, 670, 670, 672, 671, 673, 673,
6257 673, 674, 674, 674, 674, 674, 676, 675, 677, 678,
6258 679, 681, 680, 683, 682, 684, 684, 684, 685, 685,
6259 685, 685, 685, 686, 687, 688, 689
6260 };
6261
6262 const signed char
6263 Dhcp4Parser::yyr2_[] =
6264 {
6265 0, 2, 0, 3, 0, 3, 0, 3, 0, 3,
6266 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,
6267 0, 3, 0, 3, 0, 3, 0, 3, 1, 1,
6268 1, 1, 1, 1, 1, 1, 0, 4, 1, 0,
6269 1, 3, 5, 2, 0, 4, 0, 1, 1, 3,
6270 2, 0, 4, 0, 1, 1, 3, 2, 2, 0,
6271 4, 0, 6, 1, 2, 0, 4, 1, 3, 2,
6272 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6273 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6274 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6275 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6276 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6277 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6278 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
6279 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
6280 0, 4, 3, 0, 4, 3, 3, 3, 3, 3,
6281 3, 0, 4, 1, 1, 1, 1, 1, 0, 4,
6282 0, 4, 3, 3, 0, 4, 1, 1, 1, 1,
6283 3, 0, 4, 0, 4, 3, 3, 3, 3, 3,
6284 3, 3, 3, 0, 6, 1, 3, 2, 1, 1,
6285 1, 1, 1, 1, 1, 1, 1, 1, 0, 4,
6286 0, 4, 0, 4, 1, 1, 0, 4, 1, 1,
6287 3, 3, 3, 3, 0, 6, 0, 6, 1, 3,
6288 2, 1, 1, 0, 4, 0, 4, 0, 6, 0,
6289 6, 0, 1, 1, 3, 2, 0, 4, 1, 3,
6290 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6291 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6292 1, 1, 1, 1, 0, 4, 0, 4, 0, 4,
6293 0, 4, 3, 0, 4, 3, 3, 3, 3, 3,
6294 3, 3, 3, 3, 0, 4, 1, 1, 1, 3,
6295 3, 0, 4, 0, 4, 0, 4, 0, 4, 0,
6296 6, 1, 3, 2, 1, 1, 1, 1, 1, 1,
6297 1, 1, 1, 1, 0, 6, 1, 3, 2, 1,
6298 1, 1, 1, 1, 1, 3, 3, 3, 0, 6,
6299 0, 1, 1, 3, 2, 0, 4, 0, 4, 1,
6300 3, 2, 1, 1, 1, 0, 4, 0, 4, 0,
6301 6, 1, 3, 2, 1, 1, 1, 1, 1, 1,
6302 3, 3, 3, 3, 3, 3, 0, 6, 0, 1,
6303 1, 3, 2, 0, 4, 0, 4, 1, 3, 2,
6304 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6305 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6306 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6307 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6308 1, 1, 1, 1, 1, 1, 1, 1, 0, 4,
6309 0, 4, 0, 4, 0, 4, 0, 4, 0, 4,
6310 0, 4, 3, 3, 3, 3, 0, 6, 0, 1,
6311 1, 3, 2, 0, 4, 1, 3, 2, 1, 1,
6312 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6313 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6314 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6315 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6316 1, 0, 6, 0, 4, 0, 1, 1, 3, 2,
6317 0, 4, 0, 4, 0, 1, 1, 3, 2, 1,
6318 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6319 3, 1, 0, 4, 0, 4, 0, 4, 1, 0,
6320 4, 3, 0, 6, 0, 1, 1, 3, 2, 0,
6321 4, 0, 4, 0, 1, 1, 3, 2, 1, 1,
6322 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6323 0, 4, 1, 1, 3, 3, 3, 0, 4, 0,
6324 6, 0, 1, 1, 3, 2, 0, 4, 0, 4,
6325 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
6326 1, 0, 4, 3, 0, 4, 0, 4, 0, 6,
6327 0, 1, 1, 3, 2, 0, 4, 0, 4, 0,
6328 1, 1, 3, 2, 1, 1, 1, 1, 1, 1,
6329 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
6330 4, 0, 4, 0, 4, 0, 4, 0, 4, 0,
6331 4, 0, 4, 0, 4, 0, 4, 0, 4, 0,
6332 4, 0, 6, 1, 0, 4, 0, 6, 1, 3,
6333 2, 0, 4, 0, 1, 1, 3, 2, 1, 1,
6334 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
6335 1, 1, 1, 1, 1, 0, 4, 0, 4, 3,
6336 3, 0, 6, 0, 6, 0, 1, 1, 3, 2,
6337 0, 4, 1, 3, 2, 1, 1, 1, 1, 1,
6338 1, 1, 1, 1, 1, 1, 1, 0, 4, 1,
6339 1, 1, 0, 4, 0, 4, 3, 3, 0, 6,
6340 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
6341 0, 4, 1, 0, 4, 0, 4, 0, 6, 0,
6342 1, 1, 3, 2, 0, 4, 1, 3, 2, 1,
6343 1, 1, 1, 1, 1, 1, 0, 4, 0, 4,
6344 0, 6, 1, 3, 2, 1, 1, 1, 1, 1,
6345 1, 3, 0, 4, 3, 0, 4, 0, 6, 0,
6346 4, 1, 3, 2, 1, 1, 1, 1, 1, 1,
6347 1, 1, 1, 1, 1, 3, 0, 4, 3, 0,
6348 4, 3, 3, 0, 4, 1, 1, 0, 4, 0,
6349 6, 0, 4, 1, 3, 2, 1, 1, 0, 6,
6350 3, 0, 6, 1, 3, 2, 0, 4, 1, 3,
6351 2, 1, 1, 1, 1, 1, 1, 1, 3, 0,
6352 4, 0, 6, 1, 3, 2, 0, 4, 1, 3,
6353 2, 1, 1, 1, 1, 1, 0, 4, 3, 3,
6354 3, 0, 4, 0, 6, 1, 3, 2, 1, 1,
6355 1, 1, 1, 3, 3, 3, 3
6356 };
6357
6358
6359#if PARSER4_DEBUG || 1
6360 // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
6361 // First, the terminals, then, starting at \a YYNTOKENS, nonterminals.
6362 const char*
6363 const Dhcp4Parser::yytname_[] =
6364 {
6365 "\"end of file\"", "error", "\"invalid token\"", "\",\"", "\":\"",
6366 "\"[\"", "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Dhcp4\"",
6367 "\"config-control\"", "\"config-databases\"",
6368 "\"config-fetch-wait-time\"", "\"interfaces-config\"", "\"interfaces\"",
6369 "\"dhcp-socket-type\"", "\"raw\"", "\"udp\"", "\"outbound-interface\"",
6370 "\"same-as-inbound\"", "\"use-routing\"", "\"re-detect\"",
6371 "\"service-sockets-require-all\"", "\"service-sockets-retry-wait-time\"",
6372 "\"service-sockets-max-retries\"", "\"sanity-checks\"",
6373 "\"lease-checks\"", "\"extended-info-checks\"", "\"echo-client-id\"",
6374 "\"match-client-id\"", "\"authoritative\"", "\"next-server\"",
6375 "\"server-hostname\"", "\"boot-file-name\"", "\"offer-lifetime\"",
6376 "\"stash-agent-options\"", "\"lease-database\"", "\"hosts-database\"",
6377 "\"hosts-databases\"", "\"type\"", "\"user\"", "\"password\"",
6378 "\"host\"", "\"port\"", "\"persist\"", "\"lfc-interval\"",
6379 "\"readonly\"", "\"connect-timeout\"", "\"read-timeout\"",
6380 "\"write-timeout\"", "\"tcp-user-timeout\"", "\"max-reconnect-tries\"",
6381 "\"reconnect-wait-time\"", "\"on-fail\"", "\"stop-retry-exit\"",
6382 "\"serve-retry-exit\"", "\"serve-retry-continue\"",
6383 "\"retry-on-startup\"", "\"max-row-errors\"", "\"trust-anchor\"",
6384 "\"cert-file\"", "\"key-file\"", "\"cipher-list\"", "\"valid-lifetime\"",
6385 "\"min-valid-lifetime\"", "\"max-valid-lifetime\"", "\"renew-timer\"",
6386 "\"rebind-timer\"", "\"calculate-tee-times\"", "\"t1-percent\"",
6387 "\"t2-percent\"", "\"cache-threshold\"", "\"cache-max-age\"",
6388 "\"decline-probation-period\"", "\"server-tag\"",
6389 "\"statistic-default-sample-count\"", "\"statistic-default-sample-age\"",
6390 "\"ddns-send-updates\"", "\"ddns-override-no-update\"",
6391 "\"ddns-override-client-update\"", "\"ddns-replace-client-name\"",
6392 "\"ddns-generated-prefix\"", "\"ddns-qualifying-suffix\"",
6393 "\"ddns-update-on-renew\"", "\"ddns-use-conflict-resolution\"",
6394 "\"ddns-ttl-percent\"", "\"store-extended-info\"", "\"subnet4\"",
6395 "\"4o6-interface\"", "\"4o6-interface-id\"", "\"4o6-subnet\"",
6396 "\"option-def\"", "\"option-data\"", "\"name\"", "\"data\"", "\"code\"",
6397 "\"space\"", "\"csv-format\"", "\"always-send\"", "\"never-send\"",
6398 "\"record-types\"", "\"encapsulate\"", "\"array\"",
6399 "\"parked-packet-limit\"", "\"allocator\"",
6400 "\"ddns-conflict-resolution-mode\"", "\"check-with-dhcid\"",
6401 "\"no-check-with-dhcid\"", "\"check-exists-with-dhcid\"",
6402 "\"no-check-without-dhcid\"", "\"shared-networks\"", "\"pools\"",
6403 "\"pool\"", "\"user-context\"", "\"comment\"", "\"subnet\"",
6404 "\"interface\"", "\"id\"", "\"reservations-global\"",
6405 "\"reservations-in-subnet\"", "\"reservations-out-of-pool\"",
6406 "\"host-reservation-identifiers\"", "\"client-classes\"",
6407 "\"require-client-classes\"", "\"test\"", "\"template-test\"",
6408 "\"only-if-required\"", "\"client-class\"", "\"pool-id\"",
6409 "\"reservations\"", "\"ip-address\"", "\"duid\"", "\"hw-address\"",
6410 "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"",
6411 "\"relay\"", "\"ip-addresses\"", "\"hooks-libraries\"", "\"library\"",
6412 "\"parameters\"", "\"expired-leases-processing\"",
6413 "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"",
6414 "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"",
6415 "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"",
6416 "\"dhcp4o6-port\"", "\"multi-threading\"", "\"enable-multi-threading\"",
6417 "\"thread-pool-size\"", "\"packet-queue-size\"", "\"control-socket\"",
6418 "\"control-sockets\"", "\"socket-type\"", "\"unix\"", "\"http\"",
6419 "\"https\"", "\"socket-name\"", "\"socket-address\"", "\"socket-port\"",
6420 "\"authentication\"", "\"basic\"", "\"realm\"", "\"directory\"",
6421 "\"clients\"", "\"user-file\"", "\"password-file\"", "\"cert-required\"",
6422 "\"dhcp-queue-control\"", "\"enable-queue\"", "\"queue-type\"",
6423 "\"capacity\"", "\"dhcp-ddns\"", "\"enable-updates\"", "\"server-ip\"",
6424 "\"server-port\"", "\"sender-ip\"", "\"sender-port\"",
6425 "\"max-queue-size\"", "\"ncr-protocol\"", "\"ncr-format\"", "\"tcp\"",
6426 "\"JSON\"", "\"when-present\"", "\"never\"", "\"always\"",
6427 "\"when-not-present\"", "\"hostname-char-set\"",
6428 "\"hostname-char-replacement\"", "\"early-global-reservations-lookup\"",
6429 "\"ip-reservations-unique\"", "\"reservations-lookup-first\"",
6430 "\"loggers\"", "\"output-options\"", "\"output\"", "\"debuglevel\"",
6431 "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"pattern\"",
6432 "\"compatibility\"", "\"lenient-option-parsing\"",
6433 "\"ignore-dhcp-server-identifier\"", "\"ignore-rai-link-selection\"",
6434 "\"exclude-first-last-24\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP4",
6435 "SUB_DHCP4", "SUB_INTERFACES4", "SUB_SUBNET4", "SUB_POOL4",
6436 "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF",
6437 "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS",
6438 "SUB_CONFIG_CONTROL", "\"constant string\"", "\"integer\"",
6439 "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2",
6440 "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12",
6441 "$@13", "value", "sub_json", "map2", "$@14", "map_value", "map_content",
6442 "not_empty_map", "list_generic", "$@15", "list_content",
6443 "not_empty_list", "list_strings", "$@16", "list_strings_content",
6444 "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@17",
6445 "global_object", "$@18", "global_object_comma", "sub_dhcp4", "$@19",
6446 "global_params", "global_param", "valid_lifetime", "min_valid_lifetime",
6447 "max_valid_lifetime", "renew_timer", "rebind_timer",
6448 "calculate_tee_times", "t1_percent", "t2_percent", "cache_threshold",
6449 "cache_max_age", "decline_probation_period", "server_tag", "$@20",
6450 "parked_packet_limit", "allocator", "$@21", "echo_client_id",
6451 "match_client_id", "authoritative", "ddns_send_updates",
6452 "ddns_override_no_update", "ddns_override_client_update",
6453 "ddns_replace_client_name", "$@22", "ddns_replace_client_name_value",
6454 "ddns_generated_prefix", "$@23", "ddns_qualifying_suffix", "$@24",
6455 "ddns_update_on_renew", "ddns_use_conflict_resolution",
6456 "ddns_conflict_resolution_mode", "$@25",
6457 "ddns_conflict_resolution_mode_value", "ddns_ttl_percent",
6458 "hostname_char_set", "$@26", "hostname_char_replacement", "$@27",
6459 "store_extended_info", "statistic_default_sample_count",
6460 "statistic_default_sample_age", "early_global_reservations_lookup",
6461 "ip_reservations_unique", "reservations_lookup_first", "offer_lifetime",
6462 "stash_agent_options", "interfaces_config", "$@28",
6463 "interfaces_config_params", "interfaces_config_param", "sub_interfaces4",
6464 "$@29", "interfaces_list", "$@30", "dhcp_socket_type", "$@31",
6465 "socket_type", "outbound_interface", "$@32", "outbound_interface_value",
6466 "re_detect", "service_sockets_require_all",
6467 "service_sockets_retry_wait_time", "service_sockets_max_retries",
6468 "lease_database", "$@33", "sanity_checks", "$@34",
6469 "sanity_checks_params", "sanity_checks_param", "lease_checks", "$@35",
6470 "extended_info_checks", "$@36", "hosts_database", "$@37",
6471 "hosts_databases", "$@38", "database_list", "not_empty_database_list",
6472 "database", "$@39", "database_map_params", "database_map_param",
6473 "database_type", "$@40", "user", "$@41", "password", "$@42", "host",
6474 "$@43", "port", "name", "$@44", "persist", "lfc_interval", "readonly",
6475 "connect_timeout", "read_timeout", "write_timeout", "tcp_user_timeout",
6476 "max_reconnect_tries", "reconnect_wait_time", "on_fail", "$@45",
6477 "on_fail_mode", "retry_on_startup", "max_row_errors", "trust_anchor",
6478 "$@46", "cert_file", "$@47", "key_file", "$@48", "cipher_list", "$@49",
6479 "host_reservation_identifiers", "$@50",
6480 "host_reservation_identifiers_list", "host_reservation_identifier",
6481 "duid_id", "hw_address_id", "circuit_id", "client_id", "flex_id",
6482 "dhcp_multi_threading", "$@51", "multi_threading_params",
6483 "multi_threading_param", "enable_multi_threading", "thread_pool_size",
6484 "packet_queue_size", "hooks_libraries", "$@52", "hooks_libraries_list",
6485 "not_empty_hooks_libraries_list", "hooks_library", "$@53",
6486 "sub_hooks_library", "$@54", "hooks_params", "hooks_param", "library",
6487 "$@55", "parameters", "$@56", "expired_leases_processing", "$@57",
6488 "expired_leases_params", "expired_leases_param",
6489 "reclaim_timer_wait_time", "flush_reclaimed_timer_wait_time",
6490 "hold_reclaimed_time", "max_reclaim_leases", "max_reclaim_time",
6491 "unwarned_reclaim_cycles", "subnet4_list", "$@58",
6492 "subnet4_list_content", "not_empty_subnet4_list", "subnet4", "$@59",
6493 "sub_subnet4", "$@60", "subnet4_params", "subnet4_param", "subnet",
6494 "$@61", "subnet_4o6_interface", "$@62", "subnet_4o6_interface_id",
6495 "$@63", "subnet_4o6_subnet", "$@64", "interface", "$@65", "client_class",
6496 "$@66", "require_client_classes", "$@67", "reservations_global",
6497 "reservations_in_subnet", "reservations_out_of_pool", "id",
6498 "shared_networks", "$@68", "shared_networks_content",
6499 "shared_networks_list", "shared_network", "$@69",
6500 "shared_network_params", "shared_network_param", "option_def_list",
6501 "$@70", "sub_option_def_list", "$@71", "option_def_list_content",
6502 "not_empty_option_def_list", "option_def_entry", "$@72",
6503 "sub_option_def", "$@73", "option_def_params",
6504 "not_empty_option_def_params", "option_def_param", "option_def_name",
6505 "code", "option_def_code", "option_def_type", "$@74",
6506 "option_def_record_types", "$@75", "space", "$@76", "option_def_space",
6507 "option_def_encapsulate", "$@77", "option_def_array", "option_data_list",
6508 "$@78", "option_data_list_content", "not_empty_option_data_list",
6509 "option_data_entry", "$@79", "sub_option_data", "$@80",
6510 "option_data_params", "not_empty_option_data_params",
6511 "option_data_param", "option_data_name", "option_data_data", "$@81",
6512 "option_data_code", "option_data_space", "option_data_csv_format",
6513 "option_data_always_send", "option_data_never_send",
6514 "option_data_client_classes", "$@82", "pools_list", "$@83",
6515 "pools_list_content", "not_empty_pools_list", "pool_list_entry", "$@84",
6516 "sub_pool4", "$@85", "pool_params", "pool_param", "pool_entry", "$@86",
6517 "pool_id", "user_context", "$@87", "comment", "$@88", "reservations",
6518 "$@89", "reservations_list", "not_empty_reservations_list",
6519 "reservation", "$@90", "sub_reservation", "$@91", "reservation_params",
6520 "not_empty_reservation_params", "reservation_param", "next_server",
6521 "$@92", "server_hostname", "$@93", "boot_file_name", "$@94",
6522 "ip_address", "$@95", "duid", "$@96", "hw_address", "$@97",
6523 "client_id_value", "$@98", "circuit_id_value", "$@99", "flex_id_value",
6524 "$@100", "hostname", "$@101", "reservation_client_classes", "$@102",
6525 "relay", "$@103", "relay_map", "ip_addresses", "$@104", "client_classes",
6526 "$@105", "client_classes_list", "client_class_entry", "$@106",
6527 "client_class_params", "not_empty_client_class_params",
6528 "client_class_param", "client_class_name", "client_class_test", "$@107",
6529 "client_class_template_test", "$@108", "only_if_required",
6530 "dhcp4o6_port", "control_socket", "$@109", "control_sockets", "$@110",
6531 "control_socket_list", "not_empty_control_socket_list",
6532 "control_socket_entry", "$@111", "control_socket_params",
6533 "control_socket_param", "control_socket_type", "$@112",
6534 "control_socket_type_value", "control_socket_name", "$@113",
6535 "control_socket_address", "$@114", "control_socket_port",
6536 "cert_required", "authentication", "$@115", "auth_params", "auth_param",
6537 "auth_type", "$@116", "auth_type_value", "realm", "$@117", "directory",
6538 "$@118", "clients", "$@119", "clients_list", "not_empty_clients_list",
6539 "basic_auth", "$@120", "clients_params", "clients_param", "user_file",
6540 "$@121", "password_file", "$@122", "dhcp_queue_control", "$@123",
6541 "queue_control_params", "queue_control_param", "enable_queue",
6542 "queue_type", "$@124", "capacity", "arbitrary_map_entry", "$@125",
6543 "dhcp_ddns", "$@126", "sub_dhcp_ddns", "$@127", "dhcp_ddns_params",
6544 "dhcp_ddns_param", "enable_updates", "server_ip", "$@128", "server_port",
6545 "sender_ip", "$@129", "sender_port", "max_queue_size", "ncr_protocol",
6546 "$@130", "ncr_protocol_value", "ncr_format", "$@131", "config_control",
6547 "$@132", "sub_config_control", "$@133", "config_control_params",
6548 "config_control_param", "config_databases", "$@134",
6549 "config_fetch_wait_time", "loggers", "$@135", "loggers_entries",
6550 "logger_entry", "$@136", "logger_params", "logger_param", "debuglevel",
6551 "severity", "$@137", "output_options_list", "$@138",
6552 "output_options_list_content", "output_entry", "$@139",
6553 "output_params_list", "output_params", "output", "$@140", "flush",
6554 "maxsize", "maxver", "pattern", "$@141", "compatibility", "$@142",
6555 "compatibility_params", "compatibility_param", "lenient_option_parsing",
6556 "ignore_dhcp_server_identifier", "ignore_rai_link_selection",
6557 "exclude_first_last_24", YY_NULLPTR
6558 };
6559#endif
6560
6561
6562#if PARSER4_DEBUG
6563 const short
6564 Dhcp4Parser::yyrline_[] =
6565 {
6566 0, 322, 322, 322, 323, 323, 324, 324, 325, 325,
6567 326, 326, 327, 327, 328, 328, 329, 329, 330, 330,
6568 331, 331, 332, 332, 333, 333, 334, 334, 342, 343,
6569 344, 345, 346, 347, 348, 351, 356, 356, 367, 370,
6570 371, 374, 379, 385, 390, 390, 397, 398, 401, 405,
6571 409, 415, 415, 422, 423, 426, 430, 434, 444, 453,
6572 453, 468, 468, 482, 485, 491, 491, 500, 501, 502,
6573 509, 510, 511, 512, 513, 514, 515, 516, 517, 518,
6574 519, 520, 521, 522, 523, 524, 525, 526, 527, 528,
6575 529, 530, 531, 532, 533, 534, 535, 536, 537, 538,
6576 539, 540, 541, 542, 543, 544, 545, 546, 547, 548,
6577 549, 550, 551, 552, 553, 554, 555, 556, 557, 558,
6578 559, 560, 561, 562, 563, 564, 565, 566, 567, 568,
6579 569, 570, 571, 572, 573, 574, 575, 576, 577, 580,
6580 586, 592, 598, 604, 610, 616, 622, 628, 634, 640,
6581 646, 646, 655, 661, 661, 670, 676, 682, 688, 694,
6582 700, 706, 706, 715, 718, 721, 724, 727, 733, 733,
6583 742, 742, 751, 760, 770, 770, 779, 782, 785, 788,
6584 793, 799, 799, 808, 808, 817, 823, 829, 835, 841,
6585 847, 853, 859, 865, 865, 877, 878, 879, 884, 885,
6586 886, 887, 888, 889, 890, 891, 892, 893, 896, 896,
6587 905, 905, 916, 916, 924, 925, 928, 928, 936, 938,
6588 942, 948, 954, 960, 966, 966, 979, 979, 990, 991,
6589 992, 997, 998, 1001, 1001, 1020, 1020, 1038, 1038, 1051,
6590 1051, 1062, 1063, 1066, 1067, 1068, 1073, 1073, 1083, 1084,
6591 1085, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098,
6592 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
6593 1109, 1110, 1111, 1112, 1115, 1115, 1124, 1124, 1133, 1133,
6594 1142, 1142, 1151, 1157, 1157, 1166, 1172, 1178, 1184, 1190,
6595 1196, 1202, 1208, 1214, 1220, 1220, 1228, 1229, 1230, 1233,
6596 1239, 1245, 1245, 1254, 1254, 1263, 1263, 1272, 1272, 1281,
6597 1281, 1292, 1293, 1294, 1299, 1300, 1301, 1302, 1303, 1306,
6598 1311, 1316, 1321, 1326, 1333, 1333, 1346, 1347, 1348, 1353,
6599 1354, 1355, 1356, 1357, 1358, 1361, 1367, 1373, 1379, 1379,
6600 1390, 1391, 1394, 1395, 1396, 1401, 1401, 1411, 1411, 1421,
6601 1422, 1423, 1426, 1429, 1430, 1433, 1433, 1442, 1442, 1451,
6602 1451, 1463, 1464, 1465, 1470, 1471, 1472, 1473, 1474, 1475,
6603 1478, 1484, 1490, 1496, 1502, 1508, 1517, 1517, 1531, 1532,
6604 1535, 1536, 1537, 1546, 1546, 1572, 1572, 1583, 1584, 1585,
6605 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600,
6606 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610,
6607 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620,
6608 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630,
6609 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1641, 1641,
6610 1650, 1650, 1659, 1659, 1668, 1668, 1677, 1677, 1686, 1686,
6611 1695, 1695, 1706, 1712, 1718, 1724, 1732, 1732, 1744, 1745,
6612 1749, 1750, 1751, 1756, 1756, 1764, 1765, 1766, 1771, 1772,
6613 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782,
6614 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792,
6615 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802,
6616 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812,
6617 1813, 1820, 1820, 1834, 1834, 1843, 1844, 1847, 1848, 1849,
6618 1856, 1856, 1871, 1871, 1885, 1886, 1889, 1890, 1891, 1896,
6619 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1908,
6620 1910, 1916, 1918, 1918, 1927, 1927, 1936, 1936, 1945, 1947,
6621 1947, 1956, 1966, 1966, 1979, 1980, 1985, 1986, 1987, 1994,
6622 1994, 2006, 2006, 2018, 2019, 2024, 2025, 2026, 2033, 2034,
6623 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2046,
6624 2048, 2048, 2057, 2059, 2061, 2067, 2073, 2079, 2079, 2093,
6625 2093, 2106, 2107, 2110, 2111, 2112, 2117, 2117, 2127, 2127,
6626 2137, 2138, 2139, 2144, 2145, 2146, 2147, 2148, 2149, 2150,
6627 2151, 2154, 2154, 2163, 2169, 2169, 2194, 2194, 2224, 2224,
6628 2235, 2236, 2239, 2240, 2241, 2246, 2246, 2255, 2255, 2264,
6629 2265, 2268, 2269, 2270, 2276, 2277, 2278, 2279, 2280, 2281,
6630 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2293,
6631 2293, 2302, 2302, 2311, 2311, 2320, 2320, 2329, 2329, 2338,
6632 2338, 2347, 2347, 2356, 2356, 2365, 2365, 2374, 2374, 2383,
6633 2383, 2397, 2397, 2408, 2411, 2411, 2425, 2425, 2436, 2437,
6634 2438, 2443, 2443, 2453, 2454, 2457, 2458, 2459, 2464, 2465,
6635 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475,
6636 2476, 2477, 2478, 2479, 2482, 2484, 2484, 2493, 2493, 2502,
6637 2510, 2518, 2518, 2530, 2530, 2542, 2543, 2546, 2547, 2548,
6638 2553, 2553, 2561, 2562, 2563, 2568, 2569, 2570, 2571, 2572,
6639 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2582, 2582, 2591,
6640 2592, 2593, 2596, 2596, 2606, 2606, 2616, 2622, 2630, 2630,
6641 2643, 2644, 2645, 2650, 2651, 2652, 2653, 2654, 2655, 2656,
6642 2659, 2659, 2667, 2670, 2670, 2679, 2679, 2688, 2688, 2699,
6643 2700, 2703, 2704, 2705, 2710, 2710, 2718, 2719, 2720, 2725,
6644 2726, 2727, 2728, 2729, 2730, 2731, 2734, 2734, 2743, 2743,
6645 2754, 2754, 2767, 2768, 2769, 2774, 2775, 2776, 2777, 2778,
6646 2779, 2782, 2788, 2788, 2797, 2803, 2803, 2813, 2813, 2826,
6647 2826, 2836, 2837, 2838, 2843, 2844, 2845, 2846, 2847, 2848,
6648 2849, 2850, 2851, 2852, 2853, 2856, 2862, 2862, 2871, 2877,
6649 2877, 2886, 2892, 2898, 2898, 2907, 2908, 2911, 2911, 2922,
6650 2922, 2934, 2934, 2944, 2945, 2946, 2952, 2953, 2956, 2956,
6651 2967, 2975, 2975, 2988, 2989, 2990, 2996, 2996, 3004, 3005,
6652 3006, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3020, 3026,
6653 3026, 3035, 3035, 3046, 3047, 3048, 3053, 3053, 3061, 3062,
6654 3063, 3068, 3069, 3070, 3071, 3072, 3075, 3075, 3084, 3090,
6655 3096, 3102, 3102, 3111, 3111, 3122, 3123, 3124, 3129, 3130,
6656 3131, 3132, 3133, 3136, 3142, 3148, 3154
6657 };
6658
6659 void
6660 Dhcp4Parser::yy_stack_print_ () const
6661 {
6662 *yycdebug_ << "Stack now";
6663 for (stack_type::const_iterator
6664 i = yystack_.begin (),
6665 i_end = yystack_.end ();
6666 i != i_end; ++i)
6667 *yycdebug_ << ' ' << int (i->state);
6668 *yycdebug_ << '\n';
6669 }
6670
6671 void
6672 Dhcp4Parser::yy_reduce_print_ (int yyrule) const
6673 {
6674 int yylno = yyrline_[yyrule];
6675 int yynrhs = yyr2_[yyrule];
6676 // Print the symbols being reduced, and their result.
6677 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
6678 << " (line " << yylno << "):\n";
6679 // The symbols being reduced.
6680 for (int yyi = 0; yyi < yynrhs; yyi++)
6681 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
6682 yystack_[(yynrhs) - (yyi + 1)]);
6683 }
6684#endif // PARSER4_DEBUG
6685
6686
6687#line 14 "dhcp4_parser.yy"
6688} } // isc::dhcp
6689#line 6690 "dhcp4_parser.cc"
6690
6691#line 3160 "dhcp4_parser.yy"
6692
6693
6694void
6696 const std::string& what)
6697{
6698 ctx.error(loc, what);
6699}
#define yylex
#define YYCDEBUG
#define YYABORT
#define YYLLOC_DEFAULT(Current, Rhs, N)
#define YY_REDUCE_PRINT(Rule)
#define YY_SYMBOL_PRINT(Title, Symbol)
#define YYCASE_(N, S)
#define YY_STACK_PRINT()
#define YY_(msgid)
#define YYACCEPT
#define YYERROR
#define YY_RVREF(Type)
#define YY_CAST(Type, Val)
#define YY_MOVE_REF(Type)
#define YY_NOEXCEPT
#define YY_MOVE
#define YY_NOTHROW
#define YY_USE(E)
Notes: IntElement type is changed to int64_t.
Definition data.h:615
context(const Dhcp4Parser &yyparser, const symbol_type &yyla)
int expected_tokens(symbol_kind_type yyarg[], int yyargn) const
Put in YYARG at most YYARGN of the expected tokens, and return the number of tokens stored in YYARG.
Present a slice of the top of a stack.
virtual void error(const location_type &loc, const std::string &msg)
Report a syntax error.
virtual int parse()
Parse.
location location_type
Symbol locations.
symbol_kind::symbol_kind_type symbol_kind_type
(Internal) symbol kind.
static const symbol_kind_type YYNTOKENS
The number of tokens.
static std::string symbol_name(symbol_kind_type yysymbol)
The user-facing name of the symbol whose (internal) number is YYSYMBOL.
Dhcp4Parser(isc::dhcp::Parser4Context &ctx_yyarg)
Build a parser object.
Evaluation context, an interface to the expression evaluation.
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.
void unique(const std::string &name, isc::data::Element::Position loc)
Check if a parameter is already present.
void enter(const ParserContext &ctx)
Enter a new syntactic context.
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.
@ SUBNET4
Used while parsing Dhcp4/Subnet4 structures.
@ 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.
@ 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.
@ 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...
@ AUTH_TYPE
Used while parsing Dhcp4/control-socket/authentication/type structures.
@ 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.
@ CLIENTS
Used while parsing Dhcp4/control-socket/authentication/clients structures.
@ 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.
@ CONTROL_SOCKET_TYPE
Used while parsing Dhcp4/control-socket/socket-type structures.
@ 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.
@ AUTHENTICATION
Used while parsing Dhcp4/control-socket/authentication 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.
std::vector< isc::data::ElementPtr > stack_
JSON elements being parsed.
ParserContext ctx_
Current syntactic context.
Define the isc::dhcp::parser class.
void merge(ElementPtr element, ConstElementPtr other)
Merges the data from other into element.
Definition data.cc:1199
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:29
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
@ error
Definition db_log.h:118
Defines the logger used by the top-level component of kea-lfc.
"External" symbols: returned by the scanner.
Syntax errors thrown from user actions.
~syntax_error() YY_NOEXCEPT YY_NOTHROW