]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[(no branch, rebasing 1897-add-d2-server-hook-syntax)] [(no branch, rebasing 1897...
authorFrancis Dupont <fdupont@isc.org>
Wed, 26 May 2021 20:11:04 +0000 (20:11 +0000)
committerFrancis Dupont <fdupont@isc.org>
Thu, 3 Jun 2021 09:29:55 +0000 (11:29 +0200)
src/bin/d2/d2_lexer.cc
src/bin/d2/d2_parser.cc
src/bin/d2/d2_parser.h
src/bin/d2/location.hh
src/bin/d2/position.hh
src/bin/d2/stack.hh

index 95273ab260a890011988101ac1a510a6066f5d7e..3d1cc43fe95fa220209c14c58d0a629302219e33 100644 (file)
@@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
        (yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 65
-#define YY_END_OF_BUFFER 66
+#define YY_NUM_RULES 68
+#define YY_END_OF_BUFFER 69
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,52 +700,55 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[395] =
+static const flex_int16_t yy_accept[425] =
     {   0,
-       58,   58,    0,    0,    0,    0,    0,    0,    0,    0,
-       66,   64,   10,   11,   64,    1,   58,   55,   58,   58,
-       64,   57,   56,   64,   64,   64,   64,   64,   51,   52,
-       64,   64,   64,   53,   54,    5,    5,    5,   64,   64,
-       64,   10,   11,    0,    0,   46,    0,    0,    0,    0,
+       61,   61,    0,    0,    0,    0,    0,    0,    0,    0,
+       69,   67,   10,   11,   67,    1,   61,   58,   61,   61,
+       67,   60,   59,   67,   67,   67,   67,   67,   54,   55,
+       67,   67,   67,   56,   57,    5,    5,    5,   67,   67,
+       67,   10,   11,    0,    0,   49,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    1,   58,   58,
-        0,   57,   58,    3,    2,    6,    0,   58,    0,    0,
-        0,    0,    0,    0,    4,    0,    0,    9,    0,   47,
-        0,    0,    0,    0,    0,    0,   49,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    1,   61,   61,
+        0,   60,   61,    3,    2,    6,    0,   61,    0,    0,
+        0,    0,    0,    0,    4,    0,    0,    9,    0,   50,
+        0,    0,    0,    0,    0,    0,   52,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    2,    0,    0,    0,    0,    0,    0,    0,    8,
-        0,    0,    0,    0,    0,   48,   50,    0,    0,    0,
+        0,    0,    2,    0,    0,    0,    0,    0,    0,    0,
+        8,    0,    0,    0,    0,    0,   51,   53,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   63,   61,    0,   60,   59,    0,
-        0,    0,   19,   18,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   66,   64,
+        0,   63,   62,    0,    0,    0,   19,   18,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,   62,   59,    0,    0,   20,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   65,   62,
+        0,    0,   20,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   43,    0,    0,    0,    0,   14,    0,    0,
+        0,   46,    0,    0,    0,    0,    0,   14,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   39,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   42,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    7,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   41,    0,    0,   38,
-        0,    0,    0,   32,    0,    0,    0,    0,    0,    0,
-       22,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
-       36,   40,    0,    0,    0,   42,    0,    0,    0,    0,
-        0,    0,   12,    0,    0,    0,    0,    0,    0,    0,
-       28,    0,   26,    0,    0,    0,    0,   45,    0,    0,
-        0,    0,   30,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   29,    0,    0,    0,
-       44,    0,    0,    0,    0,   13,   17,    0,    0,    0,
-        0,    0,    0,    0,    0,   31,    0,   27,    0,    0,
-        0,    0,   35,   34,    0,    0,   25,    0,   23,   16,
-        0,   24,   21,    0,    0,    0,   33,    0,   37,    0,
+        0,    0,    0,    0,    7,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   44,    0,    0,   41,    0,    0,    0,    0,   32,
+
+        0,    0,    0,    0,    0,    0,   22,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   38,   39,   43,
+        0,    0,    0,    0,   45,    0,    0,    0,    0,    0,
+        0,   12,    0,    0,    0,    0,    0,    0,    0,    0,
+       28,    0,   26,    0,    0,    0,    0,    0,   48,    0,
+        0,    0,    0,   30,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   29,
+        0,    0,    0,   47,    0,    0,    0,    0,    0,   13,
+       17,    0,    0,   37,    0,    0,    0,    0,    0,    0,
+       31,    0,   27,    0,    0,    0,    0,    0,   35,   34,
+
+        0,    0,   25,    0,   23,    0,   16,    0,   24,   21,
+        0,    0,    0,    0,   33,    0,    0,   40,    0,   36,
         0,    0,   15,    0
-
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -791,120 +794,126 @@ static const YY_CHAR yy_meta[65] =
         1,    1,    1,    1
     } ;
 
-static const flex_int16_t yy_base[403] =
+static const flex_int16_t yy_base[433] =
     {   0,
         0,   63,   17,   27,   35,   42,   46,   51,   80,   89,
-      647,  648,   24,  643,  127,    0,  180,  648,  181,   66,
-        9,  184,  648,  627,  101,   21,   14,   31,  648,  648,
-       22,   61,   66,  648,  648,  648,   98,  631,  592,    0,
-      625,   99,  638,   27,  205,  648,  595,  166,   83,  177,
-      228,  590,  586,  159,   64,  585,  583,  593,  582,  595,
-       71,  575,  164,  589,   16,  185,  187,    0,  194,  252,
-      259,  260,  197,  648,    0,  648,  616,  615,  186,  198,
-      232,  243,  250,  244,  648,  588,  621,  648,  209,  648,
-      274,  586,  253,  257,  259,  619,    0,  326,  580,   71,
-
-      572,  583,  577,  565,  562,  564,  562,  605,  554,  570,
-      553,  562,  557,  554,  553,  554,  549,  173,  566,  559,
-      562,    0,  259,  267,  191,  260,  269,  255,  554,  648,
-      549,  269,  595,  594,  593,  648,  648,  356,  546,  547,
-      540,  540,  537,  551,  581,  536,  531,  533,  550,  576,
-      542,  174,  543,  573,  530,  526,  525,  538,  525,  536,
-      529,  532,  521,  277,  648,  648,  280,  648,  648,  517,
-      551,  566,  648,  648,  386,  517,  528,  515,  557,  523,
-      511,  510,  519,  525,  511,  520,  509,  517,  512,  515,
-      550,  255,  498,  512,  547,  498,  509,  496,  507,  537,
-
-      536,  648,  648,  505,  504,  648,  416,  498,  492,  490,
-      500,  491,  483,  496,  531,  482,  497,  493,  495,  478,
-      469,  476,  648,  477,  474,  471,  472,  648,  470,  468,
-      477,  466,  473,  480,  477,  467,  461,  460,  466,  462,
-      471,  501,  457,  648,  469,  459,  454,  457,  451,  463,
-      498,  449,  450,  298,  450,  458,  493,  442,  486,  454,
-      443,  648,  439,  448,  486,  480,  440,  431,  449,  429,
-      475,  443,  442,  441,  476,  475,  648,  426,  411,  648,
-      401,  446,  440,  648,  389,  255,  388,  397,  441,  396,
-      648,  390,  406,  401,  396,  399,  393,  427,  377,  425,
-
-      648,  648,  385,  370,  368,  648,  379,  413,  380,  356,
-      361,  359,  648,  408,  361,  366,  362,  348,  349,  361,
-      648,  346,  648,  337,  352,  335,  349,  648,  339,  335,
-      381,  344,  648,  345,  333,  377,  327,  296,  330,  368,
-      367,  320,  325,  312,  320,  319,  648,  300,  311,  303,
-      648,  351,  300,  349,  299,  648,  648,  304,  300,  289,
-      337,  336,  285,  297,  332,  648,  291,  648,  330,  328,
-      282,  323,  648,  648,  321,  270,  648,  274,  648,  648,
-      268,  648,  648,  315,  207,  213,  648,   73,  648,   67,
-       61,    2,  648,  648,  459,  462,  465,    0,  468,  471,
-
+      677,  678,   24,  673,  127,    0,  180,  678,  181,   66,
+        9,  184,  678,  657,  101,   21,   14,   31,  678,  678,
+       22,   61,   66,  678,  678,  678,   98,  661,  622,    0,
+      655,   99,  668,   27,  205,  678,  625,  166,   83,  177,
+      228,  620,  616,  159,   64,  615,  613,  623,   65,  626,
+       84,  606,  164,  620,   16,  185,  187,    0,  194,  252,
+      259,  260,  197,  678,    0,  678,  647,  646,  186,  198,
+      232,  243,  250,  244,  678,  619,  652,  678,  209,  678,
+      274,  617,  253,  257,  259,  650,    0,  326,  611,  163,
+
+      603,  614,  608,  596,  593,  595,  177,  637,  586,  607,
+      601,  584,  593,  588,  585,  177,  586,  581,  238,  598,
+      591,  594,    0,  259,  267,  277,  260,  269,  280,  586,
+      678,  581,  270,  627,  626,  625,  678,  678,  356,  578,
+      579,  572,  572,  569,  583,  613,  568,  563,  573,  564,
+      581,  607,  563,  572,  249,  573,  603,  560,  574,  555,
+      554,  567,  554,  565,  558,  561,  550,  285,  678,  678,
+      297,  678,  678,  546,  580,  595,  678,  678,  386,  546,
+      557,  544,  586,  552,  540,  539,  548,  554,  536,  539,
+      548,  537,  549,  544,  539,  542,  577,  280,  525,  531,
+
+      538,  573,  524,  535,  522,  533,  563,  562,  678,  678,
+      531,  530,  678,  416,  524,  518,  516,  526,  517,  509,
+      522,  557,  508,  550,  522,  518,  520,  503,  502,  493,
+      500,  678,  501,  498,  495,  508,  495,  678,  493,  491,
+      500,  489,  496,  503,  500,  490,  484,  483,  489,  485,
+      494,  524,  480,  678,  492,  483,  481,  476,  479,  467,
+      472,  484,  519,  470,  471,  292,  466,  470,  478,  513,
+      462,  506,  474,  463,  678,  459,  468,  506,  500,  460,
+      451,  469,  449,  495,  459,  462,  461,  460,  495,  494,
+      493,  678,  448,  441,  678,  444,  453,  488,  482,  678,
+
+      431,  255,  430,  439,  483,  438,  678,  432,  448,  443,
+      438,  441,  441,  442,  470,  412,  447,  678,  678,  678,
+      414,  399,  397,  395,  678,  407,  441,  408,  384,  389,
+      387,  678,  436,  389,  388,  384,  376,  377,  382,  368,
+      678,  366,  678,  364,  379,  362,  362,  375,  678,  365,
+      361,  407,  370,  678,  371,  353,  397,  347,  326,  350,
+      355,  386,  385,  338,  343,  382,  336,  344,  343,  678,
+      324,  335,  327,  678,  368,  317,  366,  316,  309,  678,
+      678,  313,  309,  678,  305,  353,  352,  301,  314,  349,
+      678,  308,  678,  347,  306,  345,  293,  337,  678,  678,
+
+      336,  285,  678,  288,  678,  294,  678,  280,  678,  678,
+      328,  284,  269,  243,  678,  167,  119,  678,   64,  678,
+       53,    2,  678,  678,  459,  462,  465,    0,  468,  471,
       474,  477
     } ;
 
-static const flex_int16_t yy_def[403] =
+static const flex_int16_t yy_def[433] =
     {   0,
-      395,  395,  396,  396,  395,  395,  395,  395,  395,  395,
-      394,  394,  394,  394,  394,  397,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  398,
-      394,  394,  394,  399,   15,  394,   45,   45,   45,   45,
-      400,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,  397,  394,  394,
-      394,  394,  394,  394,  401,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  398,  394,  399,  394,
-      394,   45,   45,   45,   45,  402,   45,  400,   45,   45,
+      425,  425,  426,  426,  425,  425,  425,  425,  425,  425,
+      424,  424,  424,  424,  424,  427,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  428,
+      424,  424,  424,  429,   15,  424,   45,   45,   45,   45,
+      430,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,  427,  424,  424,
+      424,  424,  424,  424,  431,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  428,  424,  429,  424,
+      424,   45,   45,   45,   45,  432,   45,  430,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,  401,  394,  394,  394,  394,  394,  394,  394,  394,
-       45,   45,   45,   45,  402,  394,  394,   98,   45,   45,
+       45,   45,  431,  424,  424,  424,  424,  424,  424,  424,
+      424,   45,   45,   45,   45,  432,  424,  424,   98,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,  394,  394,  394,  394,  394,  394,  394,
-       45,   45,  394,  394,   98,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,  424,  424,  424,
+      424,  424,  424,  424,   45,   45,  424,  424,   98,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
-       45,  394,  394,  394,   45,  394,   98,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,  424,  424,
+      424,   45,  424,   98,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,  424,   45,   45,   45,   45,   45,  424,   45,   45,
+       45,   45,   45,   45,  424,   45,   45,   45,   45,   45,
+       45,   45,   45,  424,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,  394,   45,   45,   45,   45,  394,   45,   45,
-       45,   45,   45,   45,  394,   45,   45,   45,   45,   45,
-       45,   45,   45,  394,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,  424,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,  394,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,  394,   45,   45,  394,
-       45,   45,   45,  394,   45,   45,   45,   45,   45,   45,
-      394,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-
-      394,  394,   45,   45,   45,  394,   45,   45,   45,   45,
-       45,   45,  394,   45,   45,   45,   45,   45,   45,   45,
-      394,   45,  394,   45,   45,   45,   45,  394,   45,   45,
-       45,   45,  394,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,  394,   45,   45,   45,
-      394,   45,   45,   45,   45,  394,  394,   45,   45,   45,
-       45,   45,   45,   45,   45,  394,   45,  394,   45,   45,
-       45,   45,  394,  394,   45,   45,  394,   45,  394,  394,
-       45,  394,  394,   45,   45,   45,  394,   45,  394,   45,
-       45,   45,  394,    0,  394,  394,  394,  394,  394,  394,
-
-      394,  394
+       45,  424,   45,   45,  424,   45,   45,   45,   45,  424,
+
+       45,   45,   45,   45,   45,   45,  424,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,  424,  424,  424,
+       45,   45,   45,   45,  424,   45,   45,   45,   45,   45,
+       45,  424,   45,   45,   45,   45,   45,   45,   45,   45,
+      424,   45,  424,   45,   45,   45,   45,   45,  424,   45,
+       45,   45,   45,  424,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,  424,
+       45,   45,   45,  424,   45,   45,   45,   45,   45,  424,
+      424,   45,   45,  424,   45,   45,   45,   45,   45,   45,
+      424,   45,  424,   45,   45,   45,   45,   45,  424,  424,
+
+       45,   45,  424,   45,  424,   45,  424,   45,  424,  424,
+       45,   45,   45,   45,  424,   45,   45,  424,   45,  424,
+       45,   45,  424,    0,  424,  424,  424,  424,  424,  424,
+      424,  424
     } ;
 
-static const flex_int16_t yy_nxt[713] =
+static const flex_int16_t yy_nxt[743] =
     {   0,
-       87,   13,   14,   13,  394,   15,   16,  393,   17,   18,
-       19,   20,   21,   22,   23,   24,   74,  394,   37,   14,
+       87,   13,   14,   13,  424,   15,   16,  423,   17,   18,
+       19,   20,   21,   22,   23,   24,   74,  424,   37,   14,
        37,   75,   25,   26,   38,   42,   27,   42,   37,   14,
        37,   28,   90,   29,   38,   30,   13,   14,   13,   79,
        79,   25,   31,   13,   14,   13,   80,   13,   14,   13,
-       32,   40,   13,   14,   13,   33,   40,  118,   79,   82,
-       81,   91,   34,   35,   13,   14,   13,  119,   15,   16,
+       32,   40,   13,   14,   13,   33,   40,  119,   79,   82,
+       81,   91,   34,   35,   13,   14,   13,  120,   15,   16,
        80,   17,   18,   19,   20,   21,   22,   23,   24,   73,
        39,   13,   14,   13,   81,   25,   26,   39,   71,   27,
        13,   14,   13,   80,   28,   81,   29,   41,   30,   42,
 
-       42,   42,   42,   94,   25,   31,   41,   71,  112,   77,
-      113,   77,  105,   32,   78,  106,  392,   83,   33,   84,
-      140,  141,   94,  391,  390,   34,   35,   44,   44,   44,
+       42,   42,   42,   94,   25,   31,   41,   71,  422,   77,
+      110,   77,  105,   32,   78,  106,  111,   83,   33,   84,
+      421,  113,   94,  114,  420,   34,   35,   44,   44,   44,
        45,   45,   46,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   47,   45,
        45,   48,   45,   45,   45,   45,   45,   45,   49,   50,
@@ -913,68 +922,71 @@ static const flex_int16_t yy_nxt[713] =
        64,   65,   66,   67,   45,   45,   45,   45,   45,   45,
        45,   69,   69,   70,   72,   69,   93,   72,   95,  101,
 
-      102,  115,   71,   71,  103,   94,   71,   73,   95,  104,
-       73,  123,  159,  166,   90,  116,   71,   95,  389,   71,
-       93,   71,   71,  124,   94,   71,   45,   95,  189,   45,
-      160,  190,  166,   97,  123,   71,   45,   45,   71,  120,
-       45,  121,   45,   91,   45,   45,  124,   45,  388,   45,
+      102,  116,   71,   71,  103,   94,   71,   73,   95,  104,
+       73,  124,  141,  142,   90,  117,   71,   95,  419,   71,
+       93,   71,   71,  125,   94,   71,   45,   95,  149,   45,
+      159,  150,  160,   97,  124,   71,   45,   45,   71,  121,
+       45,  122,   45,   91,   45,   45,  125,   45,  418,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   69,  125,   70,   45,   77,  123,   77,
-       45,   69,   78,   72,   71,  124,  125,  166,   45,   89,
-      132,   45,   71,   45,   98,  133,   89,  134,  125,  164,
-      164,  126,  165,   71,  165,  172,  169,  224,  127,  202,
-
-      128,   71,  202,  280,  132,  309,  353,  225,   89,  133,
-      310,  134,   89,  164,  167,  165,   89,  168,  202,  172,
-      387,  203,  386,  385,   89,  384,  383,   89,  382,   89,
-       89,  137,  381,  380,  281,  379,  378,  377,  376,  138,
-      375,  374,  373,  372,  138,  138,  138,  138,  138,  138,
-      354,  371,  370,  369,  368,  367,  366,  365,  364,  363,
-      362,  361,  360,  138,  138,  138,  138,  138,  138,  175,
-      359,  358,  357,  356,  175,  175,  175,  175,  175,  175,
-      355,  352,  351,  350,  349,  348,  347,  346,  345,  344,
-      343,  342,  341,  175,  175,  175,  175,  175,  175,  207,
-
-      340,  339,  338,  337,  207,  207,  207,  207,  207,  207,
-      336,  335,  334,  333,  332,  331,  330,  329,  328,  327,
-      326,  325,  324,  207,  207,  207,  207,  207,  207,   45,
-      323,  322,  321,  320,   45,   45,   45,   45,   45,   45,
-      319,  318,  317,  316,  315,  314,  313,  312,  311,  308,
-      307,  306,  305,   45,   45,   45,   45,   45,   45,   12,
-       12,   12,   36,   36,   36,   68,  304,   68,   89,   89,
-       89,   96,   96,   96,  122,  303,  122,  135,  135,  135,
-      302,  301,  300,  299,  298,  297,  296,  295,  294,  293,
-      292,  291,  290,  289,  288,  287,  286,  285,  284,  283,
-
-      282,  279,  278,  277,  276,  275,  274,  273,  272,  271,
-      270,  269,  268,  267,  266,  265,  264,  263,  262,  261,
-      260,  259,  258,  257,  256,  255,  254,  253,  252,  251,
-      250,  249,  248,  247,  246,  245,  244,  243,  242,  241,
-      240,  239,  238,  237,  236,  235,  234,  233,  232,  231,
-      230,  229,  228,  227,  226,  223,  222,  221,  220,  219,
-      218,  217,  216,  215,  214,  213,  212,  211,  210,  209,
-      208,  206,  205,  204,  201,  200,  199,  198,  197,  196,
-      195,  194,  193,  192,  191,  188,  187,  186,  185,  184,
-      183,  182,  181,  180,  179,  178,  177,  176,  136,  174,
-
-      173,  171,  170,  163,  162,  161,  158,  157,  156,  155,
-      154,  153,  152,  151,  150,  149,  148,  147,  146,  145,
-      144,  143,  142,  139,  136,  131,  130,  129,   78,   78,
-      117,  114,  111,  110,  109,  108,  107,  100,   99,   92,
-       43,   88,   86,   85,   76,   43,  394,   11,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394
+       45,   45,   45,   69,  126,   70,   45,   77,  124,   77,
+       45,   69,   78,   72,   71,  125,  126,  163,   45,   89,
+      133,   45,   71,   45,   98,  134,   89,  135,  126,  168,
+      168,  127,  169,   71,  169,  164,  176,  295,  128,  170,
+
+      129,   71,  170,  195,  133,  328,  196,  209,   89,  134,
+      329,  135,   89,  168,  171,  169,   89,  172,  170,  209,
+      176,  173,  233,  417,   89,  416,  209,   89,  296,   89,
+       89,  138,  234,  415,  414,  413,  376,  412,  210,  139,
+      411,  410,  409,  408,  139,  139,  139,  139,  139,  139,
+      407,  406,  405,  404,  403,  402,  401,  400,  399,  398,
+      397,  396,  395,  139,  139,  139,  139,  139,  139,  179,
+      394,  393,  392,  391,  179,  179,  179,  179,  179,  179,
+      377,  390,  389,  388,  387,  386,  385,  384,  383,  382,
+      381,  380,  379,  179,  179,  179,  179,  179,  179,  214,
+
+      378,  375,  374,  373,  214,  214,  214,  214,  214,  214,
+      372,  371,  370,  369,  368,  367,  366,  365,  364,  363,
+      362,  361,  360,  214,  214,  214,  214,  214,  214,   45,
+      359,  358,  357,  356,   45,   45,   45,   45,   45,   45,
+      355,  354,  353,  352,  351,  350,  349,  348,  347,  346,
+      345,  344,  343,   45,   45,   45,   45,   45,   45,   12,
+       12,   12,   36,   36,   36,   68,  342,   68,   89,   89,
+       89,   96,   96,   96,  123,  341,  123,  136,  136,  136,
+      340,  339,  338,  337,  336,  335,  334,  333,  332,  331,
+      330,  327,  326,  325,  324,  323,  322,  321,  320,  319,
+
+      318,  317,  316,  315,  314,  313,  312,  311,  310,  309,
+      308,  307,  306,  305,  304,  303,  302,  301,  300,  299,
+      298,  297,  294,  293,  292,  291,  290,  289,  288,  287,
+      286,  285,  284,  283,  282,  281,  280,  279,  278,  277,
+      276,  275,  274,  273,  272,  271,  270,  269,  268,  267,
+      266,  265,  264,  263,  262,  261,  260,  259,  258,  257,
+      256,  255,  254,  253,  252,  251,  250,  249,  248,  247,
+      246,  245,  244,  243,  242,  241,  240,  239,  238,  237,
+      236,  235,  232,  231,  230,  229,  228,  227,  226,  225,
+      224,  223,  222,  221,  220,  219,  218,  217,  216,  215,
+
+      213,  212,  211,  208,  207,  206,  205,  204,  203,  202,
+      201,  200,  199,  198,  197,  194,  193,  192,  191,  190,
+      189,  188,  187,  186,  185,  184,  183,  182,  181,  180,
+      137,  178,  177,  175,  174,  167,  166,  165,  162,  161,
+      158,  157,  156,  155,  154,  153,  152,  151,  148,  147,
+      146,  145,  144,  143,  140,  137,  132,  131,  130,   78,
+       78,  118,  115,  112,  109,  108,  107,  100,   99,   92,
+       43,   88,   86,   85,   76,   43,  424,   11,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424
     } ;
 
-static const flex_int16_t yy_chk[713] =
+static const flex_int16_t yy_chk[743] =
     {   0,
-      398,    1,    1,    1,    0,    1,    1,  392,    1,    1,
+      428,    1,    1,    1,    0,    1,    1,  422,    1,    1,
         1,    1,    1,    1,    1,    1,   21,    0,    3,    3,
         3,   21,    1,    1,    3,   13,    1,   13,    4,    4,
         4,    1,   44,    1,    4,    1,    5,    5,    5,   26,
@@ -985,9 +997,9 @@ static const flex_int16_t yy_chk[713] =
         5,    9,    9,    9,   28,    2,    2,    6,   20,    2,
        10,   10,   10,   32,    2,   33,    2,    9,    2,   37,
 
-       42,   37,   42,   49,    2,    2,   10,   20,   61,   25,
-       61,   25,   55,    2,   25,   55,  391,   32,    2,   33,
-      100,  100,   49,  390,  388,    2,    2,   15,   15,   15,
+       42,   37,   42,   49,    2,    2,   10,   20,  421,   25,
+       59,   25,   55,    2,   25,   55,   59,   32,    2,   33,
+      419,   61,   49,   61,  417,    2,    2,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
@@ -997,62 +1009,65 @@ static const flex_int16_t yy_chk[713] =
        15,   17,   19,   17,   19,   22,   48,   22,   50,   54,
 
        54,   63,   17,   19,   54,   66,   22,   69,   67,   54,
-       73,   79,  118,  125,   89,   63,   69,   50,  386,   73,
-       48,   17,   19,   80,   66,   22,   45,   67,  152,   45,
-      118,  152,  125,   51,   79,   69,   45,   45,   73,   66,
-       51,   67,   45,   89,   45,   45,   80,   45,  385,   45,
+       73,   79,  100,  100,   89,   63,   69,   50,  416,   73,
+       48,   17,   19,   80,   66,   22,   45,   67,  107,   45,
+      116,  107,  116,   51,   79,   69,   45,   45,   73,   66,
+       51,   67,   45,   89,   45,   45,   80,   45,  414,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   51,   70,   81,   70,   51,   71,   82,   71,
-       51,   72,   71,   72,   70,   83,   84,  128,   51,   91,
-       93,   51,   72,   51,   51,   94,   91,   95,   81,  123,
-      126,   82,  124,   70,  127,  132,  128,  192,   83,  164,
-
-       84,   72,  167,  254,   93,  286,  338,  192,   91,   94,
-      286,   95,   91,  123,  126,  124,   91,  127,  164,  132,
-      384,  167,  381,  378,   91,  376,  375,   91,  372,   91,
-       91,   98,  371,  370,  254,  369,  367,  365,  364,   98,
-      363,  362,  361,  360,   98,   98,   98,   98,   98,   98,
-      338,  359,  358,  355,  354,  353,  352,  350,  349,  348,
-      346,  345,  344,   98,   98,   98,   98,   98,   98,  138,
-      343,  342,  341,  340,  138,  138,  138,  138,  138,  138,
-      339,  337,  336,  335,  334,  332,  331,  330,  329,  327,
-      326,  325,  324,  138,  138,  138,  138,  138,  138,  175,
-
-      322,  320,  319,  318,  175,  175,  175,  175,  175,  175,
-      317,  316,  315,  314,  312,  311,  310,  309,  308,  307,
-      305,  304,  303,  175,  175,  175,  175,  175,  175,  207,
-      300,  299,  298,  297,  207,  207,  207,  207,  207,  207,
-      296,  295,  294,  293,  292,  290,  289,  288,  287,  285,
-      283,  282,  281,  207,  207,  207,  207,  207,  207,  395,
-      395,  395,  396,  396,  396,  397,  279,  397,  399,  399,
-      399,  400,  400,  400,  401,  278,  401,  402,  402,  402,
-      276,  275,  274,  273,  272,  271,  270,  269,  268,  267,
-      266,  265,  264,  263,  261,  260,  259,  258,  257,  256,
-
-      255,  253,  252,  251,  250,  249,  248,  247,  246,  245,
-      243,  242,  241,  240,  239,  238,  237,  236,  235,  234,
-      233,  232,  231,  230,  229,  227,  226,  225,  224,  222,
-      221,  220,  219,  218,  217,  216,  215,  214,  213,  212,
-      211,  210,  209,  208,  205,  204,  201,  200,  199,  198,
-      197,  196,  195,  194,  193,  191,  190,  189,  188,  187,
-      186,  185,  184,  183,  182,  181,  180,  179,  178,  177,
-      176,  172,  171,  170,  163,  162,  161,  160,  159,  158,
-      157,  156,  155,  154,  153,  151,  150,  149,  148,  147,
-      146,  145,  144,  143,  142,  141,  140,  139,  135,  134,
-
-      133,  131,  129,  121,  120,  119,  117,  116,  115,  114,
-      113,  112,  111,  110,  109,  108,  107,  106,  105,  104,
-      103,  102,  101,   99,   96,   92,   87,   86,   78,   77,
-       64,   62,   60,   59,   58,   57,   56,   53,   52,   47,
-       43,   41,   39,   38,   24,   14,   11,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-
-      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
-      394,  394
+       51,   72,   71,   72,   70,   83,   84,  119,   51,   91,
+       93,   51,   72,   51,   51,   94,   91,   95,   81,  124,
+      127,   82,  125,   70,  128,  119,  133,  266,   83,  126,
+
+       84,   72,  129,  155,   93,  302,  155,  168,   91,   94,
+      302,   95,   91,  124,  127,  125,   91,  128,  126,  171,
+      133,  129,  198,  413,   91,  412,  168,   91,  266,   91,
+       91,   98,  198,  411,  408,  406,  359,  404,  171,   98,
+      402,  401,  398,  397,   98,   98,   98,   98,   98,   98,
+      396,  395,  394,  392,  390,  389,  388,  387,  386,  385,
+      383,  382,  379,   98,   98,   98,   98,   98,   98,  139,
+      378,  377,  376,  375,  139,  139,  139,  139,  139,  139,
+      359,  373,  372,  371,  369,  368,  367,  366,  365,  364,
+      363,  362,  361,  139,  139,  139,  139,  139,  139,  179,
+
+      360,  358,  357,  356,  179,  179,  179,  179,  179,  179,
+      355,  353,  352,  351,  350,  348,  347,  346,  345,  344,
+      342,  340,  339,  179,  179,  179,  179,  179,  179,  214,
+      338,  337,  336,  335,  214,  214,  214,  214,  214,  214,
+      334,  333,  331,  330,  329,  328,  327,  326,  324,  323,
+      322,  321,  317,  214,  214,  214,  214,  214,  214,  425,
+      425,  425,  426,  426,  426,  427,  316,  427,  429,  429,
+      429,  430,  430,  430,  431,  315,  431,  432,  432,  432,
+      314,  313,  312,  311,  310,  309,  308,  306,  305,  304,
+      303,  301,  299,  298,  297,  296,  294,  293,  291,  290,
+
+      289,  288,  287,  286,  285,  284,  283,  282,  281,  280,
+      279,  278,  277,  276,  274,  273,  272,  271,  270,  269,
+      268,  267,  265,  264,  263,  262,  261,  260,  259,  258,
+      257,  256,  255,  253,  252,  251,  250,  249,  248,  247,
+      246,  245,  244,  243,  242,  241,  240,  239,  237,  236,
+      235,  234,  233,  231,  230,  229,  228,  227,  226,  225,
+      224,  223,  222,  221,  220,  219,  218,  217,  216,  215,
+      212,  211,  208,  207,  206,  205,  204,  203,  202,  201,
+      200,  199,  197,  196,  195,  194,  193,  192,  191,  190,
+      189,  188,  187,  186,  185,  184,  183,  182,  181,  180,
+
+      176,  175,  174,  167,  166,  165,  164,  163,  162,  161,
+      160,  159,  158,  157,  156,  154,  153,  152,  151,  150,
+      149,  148,  147,  146,  145,  144,  143,  142,  141,  140,
+      136,  135,  134,  132,  130,  122,  121,  120,  118,  117,
+      115,  114,  113,  112,  111,  110,  109,  108,  106,  105,
+      104,  103,  102,  101,   99,   96,   92,   87,   86,   78,
+       77,   64,   62,   60,   58,   57,   56,   53,   52,   47,
+       43,   41,   39,   38,   24,   14,   11,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  424
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1061,15 +1076,15 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[65] =
+static const flex_int16_t yy_rule_linenum[68] =
     {   0,
-      134,  136,  138,  143,  144,  149,  150,  151,  163,  166,
-      171,  177,  186,  197,  208,  217,  226,  235,  245,  255,
-      265,  282,  299,  308,  317,  327,  337,  347,  358,  367,
-      377,  387,  397,  406,  415,  424,  433,  442,  451,  460,
-      469,  478,  487,  500,  509,  518,  619,  635,  684,  692,
-      707,  708,  709,  710,  711,  712,  714,  732,  745,  750,
-      754,  756,  758,  760
+      136,  138,  140,  145,  146,  151,  152,  153,  165,  168,
+      173,  179,  188,  199,  210,  219,  228,  237,  247,  257,
+      267,  284,  301,  310,  319,  329,  339,  349,  360,  369,
+      379,  389,  399,  408,  417,  426,  435,  444,  453,  462,
+      471,  480,  489,  498,  507,  516,  529,  538,  547,  648,
+      664,  713,  721,  736,  737,  738,  739,  740,  741,  743,
+      761,  774,  779,  783,  785,  787,  789
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1081,7 +1096,7 @@ static const flex_int16_t yy_rule_linenum[65] =
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
 #line 1 "d2_lexer.ll"
-/* Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2017-2021 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -1121,7 +1136,7 @@ unsigned int comment_start_line = 0;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
-#line 1124 "d2_lexer.cc"
+#line 1139 "d2_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1147,8 +1162,8 @@ unsigned int comment_start_line = 0;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 1150 "d2_lexer.cc"
-#line 1151 "d2_lexer.cc"
+#line 1165 "d2_lexer.cc"
+#line 1166 "d2_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -1462,11 +1477,13 @@ YY_DECL
             return isc::d2::D2Parser::make_SUB_DDNS_DOMAINS(driver.loc_);
         case D2ParserContext::PARSER_DNS_SERVER:
             return isc::d2::D2Parser::make_SUB_DNS_SERVER(driver.loc_);
+        case D2ParserContext::PARSER_HOOKS_LIBRARY:
+            return isc::d2::D2Parser::make_SUB_HOOKS_LIBRARY(driver.loc_);
         }
     }
 
 
-#line 1469 "d2_lexer.cc"
+#line 1486 "d2_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -1495,13 +1512,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 395 )
+                               if ( yy_current_state >= 425 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 394 );
+               while ( yy_current_state != 424 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -1520,13 +1537,13 @@ do_action:      /* This label is used only to access EOF actions. */
                        {
                        if ( yy_act == 0 )
                                fprintf( stderr, "--scanner backing up\n" );
-                       else if ( yy_act < 65 )
+                       else if ( yy_act < 68 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 65 )
+                       else if ( yy_act == 68 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 66 )
+                       else if ( yy_act == 69 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1544,17 +1561,17 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 134 "d2_lexer.ll"
+#line 136 "d2_lexer.ll"
 ;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 136 "d2_lexer.ll"
+#line 138 "d2_lexer.ll"
 ;
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 138 "d2_lexer.ll"
+#line 140 "d2_lexer.ll"
 {
   BEGIN(COMMENT);
   comment_start_line = driver.loc_.end.line;;
@@ -1562,33 +1579,33 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 143 "d2_lexer.ll"
+#line 145 "d2_lexer.ll"
 BEGIN(INITIAL);
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 144 "d2_lexer.ll"
+#line 146 "d2_lexer.ll"
 ;
        YY_BREAK
 case YY_STATE_EOF(COMMENT):
-#line 145 "d2_lexer.ll"
+#line 147 "d2_lexer.ll"
 {
     isc_throw(D2ParseError, "Comment not closed. (/* in line " << comment_start_line);
 }
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 149 "d2_lexer.ll"
+#line 151 "d2_lexer.ll"
 BEGIN(DIR_ENTER);
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 150 "d2_lexer.ll"
+#line 152 "d2_lexer.ll"
 BEGIN(DIR_INCLUDE);
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 151 "d2_lexer.ll"
+#line 153 "d2_lexer.ll"
 {
     /* Include directive. */
 
@@ -1602,19 +1619,19 @@ YY_RULE_SETUP
 case YY_STATE_EOF(DIR_ENTER):
 case YY_STATE_EOF(DIR_INCLUDE):
 case YY_STATE_EOF(DIR_EXIT):
-#line 160 "d2_lexer.ll"
+#line 162 "d2_lexer.ll"
 {
     isc_throw(D2ParseError, "Directive not closed.");
 }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 163 "d2_lexer.ll"
+#line 165 "d2_lexer.ll"
 BEGIN(INITIAL);
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 166 "d2_lexer.ll"
+#line 168 "d2_lexer.ll"
 {
     /* Ok, we found a with space. Let's ignore it and update loc variable. */
     driver.loc_.step();
@@ -1623,7 +1640,7 @@ YY_RULE_SETUP
 case 11:
 /* rule 11 can match eol */
 YY_RULE_SETUP
-#line 171 "d2_lexer.ll"
+#line 173 "d2_lexer.ll"
 {
     /* Newline found. Let's update the location and continue. */
     driver.loc_.lines(yyleng);
@@ -1632,7 +1649,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 177 "d2_lexer.ll"
+#line 179 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONFIG:
@@ -1644,7 +1661,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 186 "d2_lexer.ll"
+#line 188 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1658,7 +1675,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 197 "d2_lexer.ll"
+#line 199 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1672,7 +1689,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 208 "d2_lexer.ll"
+#line 210 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1684,7 +1701,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 217 "d2_lexer.ll"
+#line 219 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1696,7 +1713,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 226 "d2_lexer.ll"
+#line 228 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1708,7 +1725,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 235 "d2_lexer.ll"
+#line 237 "d2_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::d2::D2ParserContext::NCR_PROTOCOL) {
@@ -1721,7 +1738,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 245 "d2_lexer.ll"
+#line 247 "d2_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::d2::D2ParserContext::NCR_PROTOCOL) {
@@ -1734,7 +1751,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 255 "d2_lexer.ll"
+#line 257 "d2_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::d2::D2ParserContext::NCR_FORMAT) {
@@ -1747,7 +1764,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 265 "d2_lexer.ll"
+#line 267 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1767,7 +1784,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 282 "d2_lexer.ll"
+#line 284 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1787,7 +1804,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 299 "d2_lexer.ll"
+#line 301 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1799,7 +1816,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 308 "d2_lexer.ll"
+#line 310 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1811,7 +1828,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 317 "d2_lexer.ll"
+#line 319 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::FORWARD_DDNS:
@@ -1824,7 +1841,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 327 "d2_lexer.ll"
+#line 329 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DDNS_DOMAIN:
@@ -1837,7 +1854,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 337 "d2_lexer.ll"
+#line 339 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DDNS_DOMAIN:
@@ -1850,7 +1867,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 347 "d2_lexer.ll"
+#line 349 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DNS_SERVER:
@@ -1863,7 +1880,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 358 "d2_lexer.ll"
+#line 360 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1875,7 +1892,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 367 "d2_lexer.ll"
+#line 369 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1888,7 +1905,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 377 "d2_lexer.ll"
+#line 379 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1901,7 +1918,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 387 "d2_lexer.ll"
+#line 389 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::TSIG_KEY:
@@ -1914,7 +1931,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 397 "d2_lexer.ll"
+#line 399 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1926,7 +1943,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 406 "d2_lexer.ll"
+#line 408 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONTROL_SOCKET:
@@ -1938,7 +1955,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 415 "d2_lexer.ll"
+#line 417 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::CONTROL_SOCKET:
@@ -1950,7 +1967,43 @@ YY_RULE_SETUP
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 424 "d2_lexer.ll"
+#line 426 "d2_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DHCPDDNS:
+        return isc::d2::D2Parser::make_HOOKS_LIBRARIES(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("hooks-libraries", driver.loc_);
+    }
+}
+       YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 435 "d2_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::HOOKS_LIBRARIES:
+        return isc::d2::D2Parser::make_PARAMETERS(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("parameters", driver.loc_);
+    }
+}
+       YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 444 "d2_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::HOOKS_LIBRARIES:
+        return isc::d2::D2Parser::make_LIBRARY(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("library", driver.loc_);
+    }
+}
+       YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 453 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -1960,9 +2013,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 37:
+case 40:
 YY_RULE_SETUP
-#line 433 "d2_lexer.ll"
+#line 462 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -1972,9 +2025,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 38:
+case 41:
 YY_RULE_SETUP
-#line 442 "d2_lexer.ll"
+#line 471 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1984,9 +2037,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 39:
+case 42:
 YY_RULE_SETUP
-#line 451 "d2_lexer.ll"
+#line 480 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -1996,9 +2049,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 40:
+case 43:
 YY_RULE_SETUP
-#line 460 "d2_lexer.ll"
+#line 489 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -2008,9 +2061,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 41:
+case 44:
 YY_RULE_SETUP
-#line 469 "d2_lexer.ll"
+#line 498 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -2020,9 +2073,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 42:
+case 45:
 YY_RULE_SETUP
-#line 478 "d2_lexer.ll"
+#line 507 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::OUTPUT_OPTIONS:
@@ -2032,9 +2085,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 43:
+case 46:
 YY_RULE_SETUP
-#line 487 "d2_lexer.ll"
+#line 516 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -2048,9 +2101,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 44:
+case 47:
 YY_RULE_SETUP
-#line 500 "d2_lexer.ll"
+#line 529 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -2060,9 +2113,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 45:
+case 48:
 YY_RULE_SETUP
-#line 509 "d2_lexer.ll"
+#line 538 "d2_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
@@ -2072,9 +2125,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 46:
+case 49:
 YY_RULE_SETUP
-#line 518 "d2_lexer.ll"
+#line 547 "d2_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -2176,10 +2229,10 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 47:
-/* rule 47 can match eol */
+case 50:
+/* rule 50 can match eol */
 YY_RULE_SETUP
-#line 619 "d2_lexer.ll"
+#line 648 "d2_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     std::string raw(yytext+1);
@@ -2196,10 +2249,10 @@ YY_RULE_SETUP
                  pos + 1);
 }
        YY_BREAK
-case 48:
-/* rule 48 can match eol */
+case 51:
+/* rule 51 can match eol */
 YY_RULE_SETUP
-#line 635 "d2_lexer.ll"
+#line 664 "d2_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     std::string raw(yytext+1);
@@ -2249,9 +2302,9 @@ YY_RULE_SETUP
                  pos);
 }
        YY_BREAK
-case 49:
+case 52:
 YY_RULE_SETUP
-#line 684 "d2_lexer.ll"
+#line 713 "d2_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     std::string raw(yytext+1);
@@ -2260,9 +2313,9 @@ YY_RULE_SETUP
                  raw.size() + 1);
 }
        YY_BREAK
-case 50:
+case 53:
 YY_RULE_SETUP
-#line 692 "d2_lexer.ll"
+#line 721 "d2_lexer.ll"
 {
     /* Bad string with an open unicode escape at the end */
     std::string raw(yytext+1);
@@ -2278,39 +2331,39 @@ YY_RULE_SETUP
                  pos + 1);
 }
        YY_BREAK
-case 51:
+case 54:
 YY_RULE_SETUP
-#line 707 "d2_lexer.ll"
+#line 736 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 52:
+case 55:
 YY_RULE_SETUP
-#line 708 "d2_lexer.ll"
+#line 737 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 53:
+case 56:
 YY_RULE_SETUP
-#line 709 "d2_lexer.ll"
+#line 738 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 54:
+case 57:
 YY_RULE_SETUP
-#line 710 "d2_lexer.ll"
+#line 739 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 55:
+case 58:
 YY_RULE_SETUP
-#line 711 "d2_lexer.ll"
+#line 740 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 56:
+case 59:
 YY_RULE_SETUP
-#line 712 "d2_lexer.ll"
+#line 741 "d2_lexer.ll"
 { return isc::d2::D2Parser::make_COLON(driver.loc_); }
        YY_BREAK
-case 57:
+case 60:
 YY_RULE_SETUP
-#line 714 "d2_lexer.ll"
+#line 743 "d2_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -2329,9 +2382,9 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 58:
+case 61:
 YY_RULE_SETUP
-#line 732 "d2_lexer.ll"
+#line 761 "d2_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -2345,43 +2398,43 @@ YY_RULE_SETUP
     return isc::d2::D2Parser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 59:
+case 62:
 YY_RULE_SETUP
-#line 745 "d2_lexer.ll"
+#line 774 "d2_lexer.ll"
 {
     string tmp(yytext);
     return isc::d2::D2Parser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 60:
+case 63:
 YY_RULE_SETUP
-#line 750 "d2_lexer.ll"
+#line 779 "d2_lexer.ll"
 {
    return isc::d2::D2Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 61:
+case 64:
 YY_RULE_SETUP
-#line 754 "d2_lexer.ll"
+#line 783 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 62:
+case 65:
 YY_RULE_SETUP
-#line 756 "d2_lexer.ll"
+#line 785 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 63:
+case 66:
 YY_RULE_SETUP
-#line 758 "d2_lexer.ll"
+#line 787 "d2_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 64:
+case 67:
 YY_RULE_SETUP
-#line 760 "d2_lexer.ll"
+#line 789 "d2_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 762 "d2_lexer.ll"
+#line 791 "d2_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::d2::D2Parser::make_END(driver.loc_);
@@ -2405,12 +2458,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 65:
+case 68:
 YY_RULE_SETUP
-#line 785 "d2_lexer.ll"
+#line 814 "d2_lexer.ll"
 ECHO;
        YY_BREAK
-#line 2413 "d2_lexer.cc"
+#line 2466 "d2_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -2729,7 +2782,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 395 )
+                       if ( yy_current_state >= 425 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2762,11 +2815,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 395 )
+               if ( yy_current_state >= 425 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 394);
+       yy_is_jam = (yy_current_state == 424);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3515,7 +3568,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 785 "d2_lexer.ll"
+#line 814 "d2_lexer.ll"
 
 
 using namespace isc::dhcp;
index f98cd93c180526696cb6158d7ccf6621ca790c41..d084cbe5c838ce01a25defad34469f167b7b6d38 100644 (file)
@@ -1,4 +1,4 @@
-// A Bison parser, made by GNU Bison 3.7.5.
+// A Bison parser, made by GNU Bison 3.7.6.
 
 // Skeleton implementation for Bison LALR(1) parsers in C++
 
@@ -15,7 +15,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
@@ -378,43 +378,43 @@ namespace isc { namespace d2 {
         switch (yykind)
     {
       case symbol_kind::S_STRING: // "constant string"
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < std::string > (); }
 #line 384 "d2_parser.cc"
         break;
 
       case symbol_kind::S_INTEGER: // "integer"
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < int64_t > (); }
 #line 390 "d2_parser.cc"
         break;
 
       case symbol_kind::S_FLOAT: // "floating point"
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < double > (); }
 #line 396 "d2_parser.cc"
         break;
 
       case symbol_kind::S_BOOLEAN: // "boolean"
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < bool > (); }
 #line 402 "d2_parser.cc"
         break;
 
       case symbol_kind::S_value: // value
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < ElementPtr > (); }
 #line 408 "d2_parser.cc"
         break;
 
       case symbol_kind::S_map_value: // map_value
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < ElementPtr > (); }
 #line 414 "d2_parser.cc"
         break;
 
       case symbol_kind::S_ncr_protocol_value: // ncr_protocol_value
-#line 111 "d2_parser.yy"
+#line 116 "d2_parser.yy"
                  { yyoutput << yysym.value.template as < ElementPtr > (); }
 #line 420 "d2_parser.cc"
         break;
@@ -689,227 +689,233 @@ namespace isc { namespace d2 {
           switch (yyn)
             {
   case 2: // $@1: %empty
-#line 120 "d2_parser.yy"
+#line 125 "d2_parser.yy"
                      { ctx.ctx_ = ctx.NO_KEYWORD; }
 #line 695 "d2_parser.cc"
     break;
 
   case 4: // $@2: %empty
-#line 121 "d2_parser.yy"
+#line 126 "d2_parser.yy"
                          { ctx.ctx_ = ctx.CONFIG; }
 #line 701 "d2_parser.cc"
     break;
 
   case 6: // $@3: %empty
-#line 122 "d2_parser.yy"
+#line 127 "d2_parser.yy"
                     { ctx.ctx_ = ctx.DHCPDDNS; }
 #line 707 "d2_parser.cc"
     break;
 
   case 8: // $@4: %empty
-#line 123 "d2_parser.yy"
+#line 128 "d2_parser.yy"
                     { ctx.ctx_ = ctx.TSIG_KEY; }
 #line 713 "d2_parser.cc"
     break;
 
   case 10: // $@5: %empty
-#line 124 "d2_parser.yy"
+#line 129 "d2_parser.yy"
                      { ctx.ctx_ = ctx.TSIG_KEYS; }
 #line 719 "d2_parser.cc"
     break;
 
   case 12: // $@6: %empty
-#line 125 "d2_parser.yy"
+#line 130 "d2_parser.yy"
                        { ctx.ctx_ = ctx.DDNS_DOMAIN; }
 #line 725 "d2_parser.cc"
     break;
 
   case 14: // $@7: %empty
-#line 126 "d2_parser.yy"
+#line 131 "d2_parser.yy"
                         { ctx.ctx_ = ctx.DDNS_DOMAINS; }
 #line 731 "d2_parser.cc"
     break;
 
   case 16: // $@8: %empty
-#line 127 "d2_parser.yy"
+#line 132 "d2_parser.yy"
                       { ctx.ctx_ = ctx.DNS_SERVERS; }
 #line 737 "d2_parser.cc"
     break;
 
   case 18: // $@9: %empty
-#line 128 "d2_parser.yy"
+#line 133 "d2_parser.yy"
                        { ctx.ctx_ = ctx.DNS_SERVERS; }
 #line 743 "d2_parser.cc"
     break;
 
-  case 20: // value: "integer"
-#line 136 "d2_parser.yy"
-               { yylhs.value.as < ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); }
+  case 20: // $@10: %empty
+#line 134 "d2_parser.yy"
+                         { ctx.ctx_ = ctx.HOOKS_LIBRARIES; }
 #line 749 "d2_parser.cc"
     break;
 
-  case 21: // value: "floating point"
-#line 137 "d2_parser.yy"
-             { yylhs.value.as < ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location))); }
+  case 22: // value: "integer"
+#line 142 "d2_parser.yy"
+               { yylhs.value.as < ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); }
 #line 755 "d2_parser.cc"
     break;
 
-  case 22: // value: "boolean"
-#line 138 "d2_parser.yy"
-               { yylhs.value.as < ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); }
+  case 23: // value: "floating point"
+#line 143 "d2_parser.yy"
+             { yylhs.value.as < ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location))); }
 #line 761 "d2_parser.cc"
     break;
 
-  case 23: // value: "constant string"
-#line 139 "d2_parser.yy"
-              { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); }
+  case 24: // value: "boolean"
+#line 144 "d2_parser.yy"
+               { yylhs.value.as < ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); }
 #line 767 "d2_parser.cc"
     break;
 
-  case 24: // value: "null"
-#line 140 "d2_parser.yy"
-                 { yylhs.value.as < ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
+  case 25: // value: "constant string"
+#line 145 "d2_parser.yy"
+              { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); }
 #line 773 "d2_parser.cc"
     break;
 
-  case 25: // value: map2
-#line 141 "d2_parser.yy"
-            { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+  case 26: // value: "null"
+#line 146 "d2_parser.yy"
+                 { yylhs.value.as < ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
 #line 779 "d2_parser.cc"
     break;
 
-  case 26: // value: list_generic
-#line 142 "d2_parser.yy"
-                    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+  case 27: // value: map2
+#line 147 "d2_parser.yy"
+            { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
 #line 785 "d2_parser.cc"
     break;
 
-  case 27: // sub_json: value
-#line 145 "d2_parser.yy"
+  case 28: // value: list_generic
+#line 148 "d2_parser.yy"
+                    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 791 "d2_parser.cc"
+    break;
+
+  case 29: // sub_json: value
+#line 151 "d2_parser.yy"
                 {
     // Push back the JSON value on the stack
     ctx.stack_.push_back(yystack_[0].value.as < ElementPtr > ());
 }
-#line 794 "d2_parser.cc"
+#line 800 "d2_parser.cc"
     break;
 
-  case 28: // $@10: %empty
-#line 150 "d2_parser.yy"
+  case 30: // $@11: %empty
+#line 156 "d2_parser.yy"
                      {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 805 "d2_parser.cc"
+#line 811 "d2_parser.cc"
     break;
 
-  case 29: // map2: "{" $@10 map_content "}"
-#line 155 "d2_parser.yy"
+  case 31: // map2: "{" $@11 map_content "}"
+#line 161 "d2_parser.yy"
                              {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 815 "d2_parser.cc"
+#line 821 "d2_parser.cc"
     break;
 
-  case 30: // map_value: map2
-#line 161 "d2_parser.yy"
+  case 32: // map_value: map2
+#line 167 "d2_parser.yy"
                 { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 821 "d2_parser.cc"
+#line 827 "d2_parser.cc"
     break;
 
-  case 33: // not_empty_map: "constant string" ":" value
-#line 168 "d2_parser.yy"
+  case 35: // not_empty_map: "constant string" ":" value
+#line 174 "d2_parser.yy"
                                   {
                   // map containing a single entry
                   ctx.unique(yystack_[2].value.as < std::string > (), ctx.loc2pos(yystack_[2].location));
                   ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
                   }
-#line 831 "d2_parser.cc"
+#line 837 "d2_parser.cc"
     break;
 
-  case 34: // not_empty_map: not_empty_map "," "constant string" ":" value
-#line 173 "d2_parser.yy"
+  case 36: // not_empty_map: not_empty_map "," "constant string" ":" value
+#line 179 "d2_parser.yy"
                                                       {
                   // map consisting of a shorter map followed by
                   // comma and string:value
                   ctx.unique(yystack_[2].value.as < std::string > (), ctx.loc2pos(yystack_[2].location));
                   ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
                   }
-#line 842 "d2_parser.cc"
+#line 848 "d2_parser.cc"
     break;
 
-  case 35: // $@11: %empty
-#line 181 "d2_parser.yy"
+  case 37: // $@12: %empty
+#line 187 "d2_parser.yy"
                               {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 851 "d2_parser.cc"
+#line 857 "d2_parser.cc"
     break;
 
-  case 36: // list_generic: "[" $@11 list_content "]"
-#line 184 "d2_parser.yy"
+  case 38: // list_generic: "[" $@12 list_content "]"
+#line 190 "d2_parser.yy"
                                {
     // list parsing complete. Put any sanity checking here
 }
-#line 859 "d2_parser.cc"
+#line 865 "d2_parser.cc"
     break;
 
-  case 39: // not_empty_list: value
-#line 192 "d2_parser.yy"
+  case 41: // not_empty_list: value
+#line 198 "d2_parser.yy"
                       {
                   // List consisting of a single element.
                   ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
                   }
-#line 868 "d2_parser.cc"
+#line 874 "d2_parser.cc"
     break;
 
-  case 40: // not_empty_list: not_empty_list "," value
-#line 196 "d2_parser.yy"
+  case 42: // not_empty_list: not_empty_list "," value
+#line 202 "d2_parser.yy"
                                            {
                   // List ending with , and a value.
                   ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
                   }
-#line 877 "d2_parser.cc"
+#line 883 "d2_parser.cc"
     break;
 
-  case 41: // unknown_map_entry: "constant string" ":"
-#line 207 "d2_parser.yy"
+  case 43: // unknown_map_entry: "constant string" ":"
+#line 213 "d2_parser.yy"
                                 {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as < std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 888 "d2_parser.cc"
+#line 894 "d2_parser.cc"
     break;
 
-  case 42: // $@12: %empty
-#line 216 "d2_parser.yy"
+  case 44: // $@13: %empty
+#line 222 "d2_parser.yy"
                            {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 899 "d2_parser.cc"
+#line 905 "d2_parser.cc"
     break;
 
-  case 43: // syntax_map: "{" $@12 global_object "}"
-#line 221 "d2_parser.yy"
+  case 45: // syntax_map: "{" $@13 global_object "}"
+#line 227 "d2_parser.yy"
                                {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 909 "d2_parser.cc"
+#line 915 "d2_parser.cc"
     break;
 
-  case 44: // $@13: %empty
-#line 229 "d2_parser.yy"
+  case 46: // $@14: %empty
+#line 235 "d2_parser.yy"
                         {
     ctx.unique("DhcpDdns", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -917,57 +923,57 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCPDDNS);
 }
-#line 921 "d2_parser.cc"
+#line 927 "d2_parser.cc"
     break;
 
-  case 45: // global_object: "DhcpDdns" $@13 ":" "{" dhcpddns_params "}"
-#line 235 "d2_parser.yy"
+  case 47: // global_object: "DhcpDdns" $@14 ":" "{" dhcpddns_params "}"
+#line 241 "d2_parser.yy"
                                                       {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 930 "d2_parser.cc"
+#line 936 "d2_parser.cc"
     break;
 
-  case 46: // $@14: %empty
-#line 240 "d2_parser.yy"
+  case 48: // $@15: %empty
+#line 246 "d2_parser.yy"
                              {
     // Parse the dhcpddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 940 "d2_parser.cc"
+#line 946 "d2_parser.cc"
     break;
 
-  case 47: // sub_dhcpddns: "{" $@14 dhcpddns_params "}"
-#line 244 "d2_parser.yy"
+  case 49: // sub_dhcpddns: "{" $@15 dhcpddns_params "}"
+#line 250 "d2_parser.yy"
                                  {
     // parsing completed
 }
-#line 948 "d2_parser.cc"
+#line 954 "d2_parser.cc"
     break;
 
-  case 63: // $@15: %empty
-#line 268 "d2_parser.yy"
+  case 66: // $@16: %empty
+#line 275 "d2_parser.yy"
                        {
     ctx.unique("ip-address", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 957 "d2_parser.cc"
+#line 963 "d2_parser.cc"
     break;
 
-  case 64: // ip_address: "ip-address" $@15 ":" "constant string"
-#line 271 "d2_parser.yy"
+  case 67: // ip_address: "ip-address" $@16 ":" "constant string"
+#line 278 "d2_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", s);
     ctx.leave();
 }
-#line 967 "d2_parser.cc"
+#line 973 "d2_parser.cc"
     break;
 
-  case 65: // port: "port" ":" "integer"
-#line 277 "d2_parser.yy"
+  case 68: // port: "port" ":" "integer"
+#line 284 "d2_parser.yy"
                          {
     ctx.unique("port", ctx.loc2pos(yystack_[2].location));
     if (yystack_[0].value.as < int64_t > () <= 0 || yystack_[0].value.as < int64_t > () >= 65536 ) {
@@ -976,11 +982,11 @@ namespace isc { namespace d2 {
     ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", i);
 }
-#line 980 "d2_parser.cc"
+#line 986 "d2_parser.cc"
     break;
 
-  case 66: // dns_server_timeout: "dns-server-timeout" ":" "integer"
-#line 286 "d2_parser.yy"
+  case 69: // dns_server_timeout: "dns-server-timeout" ":" "integer"
+#line 293 "d2_parser.yy"
                                                      {
     ctx.unique("dns-server-timeout", ctx.loc2pos(yystack_[2].location));
     if (yystack_[0].value.as < int64_t > () <= 0) {
@@ -990,68 +996,68 @@ namespace isc { namespace d2 {
         ctx.stack_.back()->set("dns-server-timeout", i);
     }
 }
-#line 994 "d2_parser.cc"
+#line 1000 "d2_parser.cc"
     break;
 
-  case 67: // $@16: %empty
-#line 296 "d2_parser.yy"
+  case 70: // $@17: %empty
+#line 303 "d2_parser.yy"
                            {
     ctx.unique("ncr-protocol", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_PROTOCOL);
 }
-#line 1003 "d2_parser.cc"
+#line 1009 "d2_parser.cc"
     break;
 
-  case 68: // ncr_protocol: "ncr-protocol" $@16 ":" ncr_protocol_value
-#line 299 "d2_parser.yy"
+  case 71: // ncr_protocol: "ncr-protocol" $@17 ":" ncr_protocol_value
+#line 306 "d2_parser.yy"
                            {
     ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
 }
-#line 1012 "d2_parser.cc"
+#line 1018 "d2_parser.cc"
     break;
 
-  case 69: // ncr_protocol_value: "UDP"
-#line 305 "d2_parser.yy"
+  case 72: // ncr_protocol_value: "UDP"
+#line 312 "d2_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
-#line 1018 "d2_parser.cc"
+#line 1024 "d2_parser.cc"
     break;
 
-  case 70: // ncr_protocol_value: "TCP"
-#line 306 "d2_parser.yy"
+  case 73: // ncr_protocol_value: "TCP"
+#line 313 "d2_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
-#line 1024 "d2_parser.cc"
+#line 1030 "d2_parser.cc"
     break;
 
-  case 71: // $@17: %empty
-#line 309 "d2_parser.yy"
+  case 74: // $@18: %empty
+#line 316 "d2_parser.yy"
                        {
     ctx.unique("ncr-format", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_FORMAT);
 }
-#line 1033 "d2_parser.cc"
+#line 1039 "d2_parser.cc"
     break;
 
-  case 72: // ncr_format: "ncr-format" $@17 ":" "JSON"
-#line 312 "d2_parser.yy"
+  case 75: // ncr_format: "ncr-format" $@18 ":" "JSON"
+#line 319 "d2_parser.yy"
              {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
     ctx.leave();
 }
-#line 1043 "d2_parser.cc"
+#line 1049 "d2_parser.cc"
     break;
 
-  case 73: // $@18: %empty
-#line 318 "d2_parser.yy"
+  case 76: // $@19: %empty
+#line 325 "d2_parser.yy"
                            {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1051 "d2_parser.cc"
+#line 1057 "d2_parser.cc"
     break;
 
-  case 74: // user_context: "user-context" $@18 ":" map_value
-#line 320 "d2_parser.yy"
+  case 77: // user_context: "user-context" $@19 ":" map_value
+#line 327 "d2_parser.yy"
                   {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context = yystack_[0].value.as < ElementPtr > ();
@@ -1074,19 +1080,19 @@ namespace isc { namespace d2 {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 1078 "d2_parser.cc"
+#line 1084 "d2_parser.cc"
     break;
 
-  case 75: // $@19: %empty
-#line 343 "d2_parser.yy"
+  case 78: // $@20: %empty
+#line 350 "d2_parser.yy"
                  {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1086 "d2_parser.cc"
+#line 1092 "d2_parser.cc"
     break;
 
-  case 76: // comment: "comment" $@19 ":" "constant string"
-#line 345 "d2_parser.yy"
+  case 79: // comment: "comment" $@20 ":" "constant string"
+#line 352 "d2_parser.yy"
                {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
@@ -1111,11 +1117,11 @@ namespace isc { namespace d2 {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 1115 "d2_parser.cc"
+#line 1121 "d2_parser.cc"
     break;
 
-  case 77: // $@20: %empty
-#line 370 "d2_parser.yy"
+  case 80: // $@21: %empty
+#line 377 "d2_parser.yy"
                             {
     ctx.unique("forward-ddns", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -1123,20 +1129,20 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.FORWARD_DDNS);
 }
-#line 1127 "d2_parser.cc"
+#line 1133 "d2_parser.cc"
     break;
 
-  case 78: // forward_ddns: "forward-ddns" $@20 ":" "{" ddns_mgr_params "}"
-#line 376 "d2_parser.yy"
+  case 81: // forward_ddns: "forward-ddns" $@21 ":" "{" ddns_mgr_params "}"
+#line 383 "d2_parser.yy"
                                                       {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1136 "d2_parser.cc"
+#line 1142 "d2_parser.cc"
     break;
 
-  case 79: // $@21: %empty
-#line 381 "d2_parser.yy"
+  case 82: // $@22: %empty
+#line 388 "d2_parser.yy"
                             {
     ctx.unique("reverse-ddns", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -1144,20 +1150,20 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.REVERSE_DDNS);
 }
-#line 1148 "d2_parser.cc"
+#line 1154 "d2_parser.cc"
     break;
 
-  case 80: // reverse_ddns: "reverse-ddns" $@21 ":" "{" ddns_mgr_params "}"
-#line 387 "d2_parser.yy"
+  case 83: // reverse_ddns: "reverse-ddns" $@22 ":" "{" ddns_mgr_params "}"
+#line 394 "d2_parser.yy"
                                                       {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1157 "d2_parser.cc"
+#line 1163 "d2_parser.cc"
     break;
 
-  case 87: // $@22: %empty
-#line 406 "d2_parser.yy"
+  case 90: // $@23: %empty
+#line 413 "d2_parser.yy"
                            {
     ctx.unique("ddns-domains", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -1165,81 +1171,81 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(l);
     ctx.enter(ctx.DDNS_DOMAINS);
 }
-#line 1169 "d2_parser.cc"
+#line 1175 "d2_parser.cc"
     break;
 
-  case 88: // ddns_domains: "ddns-domains" $@22 ":" "[" ddns_domain_list "]"
-#line 412 "d2_parser.yy"
+  case 91: // ddns_domains: "ddns-domains" $@23 ":" "[" ddns_domain_list "]"
+#line 419 "d2_parser.yy"
                                                          {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1178 "d2_parser.cc"
+#line 1184 "d2_parser.cc"
     break;
 
-  case 89: // $@23: %empty
-#line 417 "d2_parser.yy"
+  case 92: // $@24: %empty
+#line 424 "d2_parser.yy"
                                   {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1187 "d2_parser.cc"
+#line 1193 "d2_parser.cc"
     break;
 
-  case 90: // sub_ddns_domains: "[" $@23 ddns_domain_list "]"
-#line 420 "d2_parser.yy"
+  case 93: // sub_ddns_domains: "[" $@24 ddns_domain_list "]"
+#line 427 "d2_parser.yy"
                                    {
     // parsing completed
 }
-#line 1195 "d2_parser.cc"
+#line 1201 "d2_parser.cc"
     break;
 
-  case 95: // $@24: %empty
-#line 432 "d2_parser.yy"
+  case 98: // $@25: %empty
+#line 439 "d2_parser.yy"
                             {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1205 "d2_parser.cc"
+#line 1211 "d2_parser.cc"
     break;
 
-  case 96: // ddns_domain: "{" $@24 ddns_domain_params "}"
-#line 436 "d2_parser.yy"
+  case 99: // ddns_domain: "{" $@25 ddns_domain_params "}"
+#line 443 "d2_parser.yy"
                                     {
     ctx.stack_.pop_back();
 }
-#line 1213 "d2_parser.cc"
+#line 1219 "d2_parser.cc"
     break;
 
-  case 97: // $@25: %empty
-#line 440 "d2_parser.yy"
+  case 100: // $@26: %empty
+#line 447 "d2_parser.yy"
                                 {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1222 "d2_parser.cc"
+#line 1228 "d2_parser.cc"
     break;
 
-  case 98: // sub_ddns_domain: "{" $@25 ddns_domain_params "}"
-#line 443 "d2_parser.yy"
+  case 101: // sub_ddns_domain: "{" $@26 ddns_domain_params "}"
+#line 450 "d2_parser.yy"
                                     {
     // parsing completed
 }
-#line 1230 "d2_parser.cc"
+#line 1236 "d2_parser.cc"
     break;
 
-  case 107: // $@26: %empty
-#line 460 "d2_parser.yy"
+  case 110: // $@27: %empty
+#line 467 "d2_parser.yy"
                        {
     ctx.unique("name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1239 "d2_parser.cc"
+#line 1245 "d2_parser.cc"
     break;
 
-  case 108: // ddns_domain_name: "name" $@26 ":" "constant string"
-#line 463 "d2_parser.yy"
+  case 111: // ddns_domain_name: "name" $@27 ":" "constant string"
+#line 470 "d2_parser.yy"
                {
     if (yystack_[0].value.as < std::string > () == "") {
         error(yystack_[1].location, "Ddns domain name cannot be blank");
@@ -1249,31 +1255,31 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1253 "d2_parser.cc"
+#line 1259 "d2_parser.cc"
     break;
 
-  case 109: // $@27: %empty
-#line 473 "d2_parser.yy"
+  case 112: // $@28: %empty
+#line 480 "d2_parser.yy"
                                {
     ctx.unique("key-name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1262 "d2_parser.cc"
+#line 1268 "d2_parser.cc"
     break;
 
-  case 110: // ddns_domain_key_name: "key-name" $@27 ":" "constant string"
-#line 476 "d2_parser.yy"
+  case 113: // ddns_domain_key_name: "key-name" $@28 ":" "constant string"
+#line 483 "d2_parser.yy"
                {
     ElementPtr elem(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("key-name", name);
     ctx.leave();
 }
-#line 1273 "d2_parser.cc"
+#line 1279 "d2_parser.cc"
     break;
 
-  case 111: // $@28: %empty
-#line 486 "d2_parser.yy"
+  case 114: // $@29: %empty
+#line 493 "d2_parser.yy"
                          {
     ctx.unique("dns-servers", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -1281,81 +1287,81 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(l);
     ctx.enter(ctx.DNS_SERVERS);
 }
-#line 1285 "d2_parser.cc"
+#line 1291 "d2_parser.cc"
     break;
 
-  case 112: // dns_servers: "dns-servers" $@28 ":" "[" dns_server_list "]"
-#line 492 "d2_parser.yy"
+  case 115: // dns_servers: "dns-servers" $@29 ":" "[" dns_server_list "]"
+#line 499 "d2_parser.yy"
                                                         {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1294 "d2_parser.cc"
+#line 1300 "d2_parser.cc"
     break;
 
-  case 113: // $@29: %empty
-#line 497 "d2_parser.yy"
+  case 116: // $@30: %empty
+#line 504 "d2_parser.yy"
                                  {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1303 "d2_parser.cc"
+#line 1309 "d2_parser.cc"
     break;
 
-  case 114: // sub_dns_servers: "[" $@29 dns_server_list "]"
-#line 500 "d2_parser.yy"
+  case 117: // sub_dns_servers: "[" $@30 dns_server_list "]"
+#line 507 "d2_parser.yy"
                                   {
     // parsing completed
 }
-#line 1311 "d2_parser.cc"
+#line 1317 "d2_parser.cc"
     break;
 
-  case 117: // $@30: %empty
-#line 508 "d2_parser.yy"
+  case 120: // $@31: %empty
+#line 515 "d2_parser.yy"
                            {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1321 "d2_parser.cc"
+#line 1327 "d2_parser.cc"
     break;
 
-  case 118: // dns_server: "{" $@30 dns_server_params "}"
-#line 512 "d2_parser.yy"
+  case 121: // dns_server: "{" $@31 dns_server_params "}"
+#line 519 "d2_parser.yy"
                                    {
     ctx.stack_.pop_back();
 }
-#line 1329 "d2_parser.cc"
+#line 1335 "d2_parser.cc"
     break;
 
-  case 119: // $@31: %empty
-#line 516 "d2_parser.yy"
+  case 122: // $@32: %empty
+#line 523 "d2_parser.yy"
                                {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1338 "d2_parser.cc"
+#line 1344 "d2_parser.cc"
     break;
 
-  case 120: // sub_dns_server: "{" $@31 dns_server_params "}"
-#line 519 "d2_parser.yy"
+  case 123: // sub_dns_server: "{" $@32 dns_server_params "}"
+#line 526 "d2_parser.yy"
                                    {
     // parsing completed
 }
-#line 1346 "d2_parser.cc"
+#line 1352 "d2_parser.cc"
     break;
 
-  case 129: // $@32: %empty
-#line 535 "d2_parser.yy"
+  case 132: // $@33: %empty
+#line 542 "d2_parser.yy"
                               {
     ctx.unique("hostname", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1355 "d2_parser.cc"
+#line 1361 "d2_parser.cc"
     break;
 
-  case 130: // dns_server_hostname: "hostname" $@32 ":" "constant string"
-#line 538 "d2_parser.yy"
+  case 133: // dns_server_hostname: "hostname" $@33 ":" "constant string"
+#line 545 "d2_parser.yy"
                {
     if (yystack_[0].value.as < std::string > () != "") {
         error(yystack_[1].location, "hostname is not yet supported");
@@ -1365,30 +1371,30 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("hostname", name);
     ctx.leave();
 }
-#line 1369 "d2_parser.cc"
+#line 1375 "d2_parser.cc"
     break;
 
-  case 131: // $@33: %empty
-#line 548 "d2_parser.yy"
+  case 134: // $@34: %empty
+#line 555 "d2_parser.yy"
                                   {
     ctx.unique("ip-address", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1378 "d2_parser.cc"
+#line 1384 "d2_parser.cc"
     break;
 
-  case 132: // dns_server_ip_address: "ip-address" $@33 ":" "constant string"
-#line 551 "d2_parser.yy"
+  case 135: // dns_server_ip_address: "ip-address" $@34 ":" "constant string"
+#line 558 "d2_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", s);
     ctx.leave();
 }
-#line 1388 "d2_parser.cc"
+#line 1394 "d2_parser.cc"
     break;
 
-  case 133: // dns_server_port: "port" ":" "integer"
-#line 557 "d2_parser.yy"
+  case 136: // dns_server_port: "port" ":" "integer"
+#line 564 "d2_parser.yy"
                                     {
     ctx.unique("port", ctx.loc2pos(yystack_[2].location));
     if (yystack_[0].value.as < int64_t > () <= 0 || yystack_[0].value.as < int64_t > () >= 65536 ) {
@@ -1397,11 +1403,11 @@ namespace isc { namespace d2 {
     ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", i);
 }
-#line 1401 "d2_parser.cc"
+#line 1407 "d2_parser.cc"
     break;
 
-  case 134: // $@34: %empty
-#line 572 "d2_parser.yy"
+  case 137: // $@35: %empty
+#line 579 "d2_parser.yy"
                      {
     ctx.unique("tsig-keys", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -1409,82 +1415,82 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(l);
     ctx.enter(ctx.TSIG_KEYS);
 }
-#line 1413 "d2_parser.cc"
+#line 1419 "d2_parser.cc"
     break;
 
-  case 135: // tsig_keys: "tsig-keys" $@34 ":" "[" tsig_keys_list "]"
-#line 578 "d2_parser.yy"
+  case 138: // tsig_keys: "tsig-keys" $@35 ":" "[" tsig_keys_list "]"
+#line 585 "d2_parser.yy"
                                                        {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1422 "d2_parser.cc"
+#line 1428 "d2_parser.cc"
     break;
 
-  case 136: // $@35: %empty
-#line 583 "d2_parser.yy"
+  case 139: // $@36: %empty
+#line 590 "d2_parser.yy"
                                {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 1431 "d2_parser.cc"
+#line 1437 "d2_parser.cc"
     break;
 
-  case 137: // sub_tsig_keys: "[" $@35 tsig_keys_list "]"
-#line 586 "d2_parser.yy"
+  case 140: // sub_tsig_keys: "[" $@36 tsig_keys_list "]"
+#line 593 "d2_parser.yy"
                                  {
     // parsing completed
 }
-#line 1439 "d2_parser.cc"
+#line 1445 "d2_parser.cc"
     break;
 
-  case 142: // $@36: %empty
-#line 598 "d2_parser.yy"
+  case 145: // $@37: %empty
+#line 605 "d2_parser.yy"
                          {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1449 "d2_parser.cc"
+#line 1455 "d2_parser.cc"
     break;
 
-  case 143: // tsig_key: "{" $@36 tsig_key_params "}"
-#line 602 "d2_parser.yy"
+  case 146: // tsig_key: "{" $@37 tsig_key_params "}"
+#line 609 "d2_parser.yy"
                                  {
     ctx.stack_.pop_back();
 }
-#line 1457 "d2_parser.cc"
+#line 1463 "d2_parser.cc"
     break;
 
-  case 144: // $@37: %empty
-#line 606 "d2_parser.yy"
+  case 147: // $@38: %empty
+#line 613 "d2_parser.yy"
                              {
     // Parse tsig key list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1467 "d2_parser.cc"
+#line 1473 "d2_parser.cc"
     break;
 
-  case 145: // sub_tsig_key: "{" $@37 tsig_key_params "}"
-#line 610 "d2_parser.yy"
+  case 148: // sub_tsig_key: "{" $@38 tsig_key_params "}"
+#line 617 "d2_parser.yy"
                                  {
     // parsing completed
 }
-#line 1475 "d2_parser.cc"
+#line 1481 "d2_parser.cc"
     break;
 
-  case 155: // $@38: %empty
-#line 628 "d2_parser.yy"
+  case 158: // $@39: %empty
+#line 635 "d2_parser.yy"
                     {
     ctx.unique("name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1484 "d2_parser.cc"
+#line 1490 "d2_parser.cc"
     break;
 
-  case 156: // tsig_key_name: "name" $@38 ":" "constant string"
-#line 631 "d2_parser.yy"
+  case 159: // tsig_key_name: "name" $@39 ":" "constant string"
+#line 638 "d2_parser.yy"
                {
     if (yystack_[0].value.as < std::string > () == "") {
         error(yystack_[1].location, "TSIG key name cannot be blank");
@@ -1494,20 +1500,20 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1498 "d2_parser.cc"
+#line 1504 "d2_parser.cc"
     break;
 
-  case 157: // $@39: %empty
-#line 641 "d2_parser.yy"
+  case 160: // $@40: %empty
+#line 648 "d2_parser.yy"
                               {
     ctx.unique("algorithm", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1507 "d2_parser.cc"
+#line 1513 "d2_parser.cc"
     break;
 
-  case 158: // tsig_key_algorithm: "algorithm" $@39 ":" "constant string"
-#line 644 "d2_parser.yy"
+  case 161: // tsig_key_algorithm: "algorithm" $@40 ":" "constant string"
+#line 651 "d2_parser.yy"
                {
     if (yystack_[0].value.as < std::string > () == "") {
         error(yystack_[1].location, "TSIG key algorithm cannot be blank");
@@ -1516,11 +1522,11 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("algorithm", elem);
     ctx.leave();
 }
-#line 1520 "d2_parser.cc"
+#line 1526 "d2_parser.cc"
     break;
 
-  case 159: // tsig_key_digest_bits: "digest-bits" ":" "integer"
-#line 653 "d2_parser.yy"
+  case 162: // tsig_key_digest_bits: "digest-bits" ":" "integer"
+#line 660 "d2_parser.yy"
                                                 {
     ctx.unique("digest-bits", ctx.loc2pos(yystack_[2].location));
     if (yystack_[0].value.as < int64_t > () < 0 || (yystack_[0].value.as < int64_t > () > 0  && (yystack_[0].value.as < int64_t > () % 8 != 0))) {
@@ -1529,20 +1535,20 @@ namespace isc { namespace d2 {
     ElementPtr elem(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("digest-bits", elem);
 }
-#line 1533 "d2_parser.cc"
+#line 1539 "d2_parser.cc"
     break;
 
-  case 160: // $@40: %empty
-#line 662 "d2_parser.yy"
+  case 163: // $@41: %empty
+#line 669 "d2_parser.yy"
                         {
     ctx.unique("secret", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1542 "d2_parser.cc"
+#line 1548 "d2_parser.cc"
     break;
 
-  case 161: // tsig_key_secret: "secret" $@40 ":" "constant string"
-#line 665 "d2_parser.yy"
+  case 164: // tsig_key_secret: "secret" $@41 ":" "constant string"
+#line 672 "d2_parser.yy"
                {
     if (yystack_[0].value.as < std::string > () == "") {
         error(yystack_[1].location, "TSIG key secret cannot be blank");
@@ -1551,11 +1557,11 @@ namespace isc { namespace d2 {
     ctx.stack_.back()->set("secret", elem);
     ctx.leave();
 }
-#line 1555 "d2_parser.cc"
+#line 1561 "d2_parser.cc"
     break;
 
-  case 162: // $@41: %empty
-#line 679 "d2_parser.yy"
+  case 165: // $@42: %empty
+#line 686 "d2_parser.yy"
                                {
     ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -1563,58 +1569,156 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKET);
 }
-#line 1567 "d2_parser.cc"
+#line 1573 "d2_parser.cc"
     break;
 
-  case 163: // control_socket: "control-socket" $@41 ":" "{" control_socket_params "}"
-#line 685 "d2_parser.yy"
+  case 166: // control_socket: "control-socket" $@42 ":" "{" control_socket_params "}"
+#line 692 "d2_parser.yy"
                                                             {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1576 "d2_parser.cc"
+#line 1582 "d2_parser.cc"
     break;
 
-  case 171: // $@42: %empty
-#line 701 "d2_parser.yy"
+  case 174: // $@43: %empty
+#line 708 "d2_parser.yy"
                                  {
     ctx.unique("socket-type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1585 "d2_parser.cc"
+#line 1591 "d2_parser.cc"
     break;
 
-  case 172: // control_socket_type: "socket-type" $@42 ":" "constant string"
-#line 704 "d2_parser.yy"
+  case 175: // control_socket_type: "socket-type" $@43 ":" "constant string"
+#line 711 "d2_parser.yy"
                {
     ElementPtr stype(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-type", stype);
     ctx.leave();
 }
-#line 1595 "d2_parser.cc"
+#line 1601 "d2_parser.cc"
     break;
 
-  case 173: // $@43: %empty
-#line 710 "d2_parser.yy"
+  case 176: // $@44: %empty
+#line 717 "d2_parser.yy"
                                  {
     ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1604 "d2_parser.cc"
+#line 1610 "d2_parser.cc"
     break;
 
-  case 174: // control_socket_name: "socket-name" $@43 ":" "constant string"
-#line 713 "d2_parser.yy"
+  case 177: // control_socket_name: "socket-name" $@44 ":" "constant string"
+#line 720 "d2_parser.yy"
                {
     ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
     ctx.leave();
 }
-#line 1614 "d2_parser.cc"
+#line 1620 "d2_parser.cc"
+    break;
+
+  case 178: // $@45: %empty
+#line 728 "d2_parser.yy"
+                                 {
+    ctx.unique("hooks-libraries", ctx.loc2pos(yystack_[0].location));
+    ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("hooks-libraries", l);
+    ctx.stack_.push_back(l);
+    ctx.enter(ctx.HOOKS_LIBRARIES);
+}
+#line 1632 "d2_parser.cc"
+    break;
+
+  case 179: // hooks_libraries: "hooks-libraries" $@45 ":" "[" hooks_libraries_list "]"
+#line 734 "d2_parser.yy"
+                                                             {
+    ctx.stack_.pop_back();
+    ctx.leave();
+}
+#line 1641 "d2_parser.cc"
+    break;
+
+  case 184: // $@46: %empty
+#line 747 "d2_parser.yy"
+                              {
+    ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->add(m);
+    ctx.stack_.push_back(m);
+}
+#line 1651 "d2_parser.cc"
+    break;
+
+  case 185: // hooks_library: "{" $@46 hooks_params "}"
+#line 751 "d2_parser.yy"
+                              {
+    // The library hooks parameter is required
+    ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
+    ctx.stack_.pop_back();
+}
+#line 1661 "d2_parser.cc"
+    break;
+
+  case 186: // $@47: %empty
+#line 757 "d2_parser.yy"
+                                  {
+    // Parse the hooks-libraries list entry map
+    ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.push_back(m);
+}
+#line 1671 "d2_parser.cc"
+    break;
+
+  case 187: // sub_hooks_library: "{" $@47 hooks_params "}"
+#line 761 "d2_parser.yy"
+                              {
+    // The library hooks parameter is required
+    ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
+    // parsing completed
+}
+#line 1681 "d2_parser.cc"
+    break;
+
+  case 193: // $@48: %empty
+#line 776 "d2_parser.yy"
+                 {
+    ctx.unique("library", ctx.loc2pos(yystack_[0].location));
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 1690 "d2_parser.cc"
+    break;
+
+  case 194: // library: "library" $@48 ":" "constant string"
+#line 779 "d2_parser.yy"
+               {
+    ElementPtr lib(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("library", lib);
+    ctx.leave();
+}
+#line 1700 "d2_parser.cc"
     break;
 
-  case 175: // $@44: %empty
-#line 721 "d2_parser.yy"
+  case 195: // $@49: %empty
+#line 785 "d2_parser.yy"
+                       {
+    ctx.unique("parameters", ctx.loc2pos(yystack_[0].location));
+    ctx.enter(ctx.NO_KEYWORD);
+}
+#line 1709 "d2_parser.cc"
+    break;
+
+  case 196: // parameters: "parameters" $@49 ":" map_value
+#line 788 "d2_parser.yy"
+                  {
+    ctx.stack_.back()->set("parameters", yystack_[0].value.as < ElementPtr > ());
+    ctx.leave();
+}
+#line 1718 "d2_parser.cc"
+    break;
+
+  case 197: // $@50: %empty
+#line 795 "d2_parser.yy"
                  {
     ctx.unique("loggers", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -1622,86 +1726,86 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 1626 "d2_parser.cc"
+#line 1730 "d2_parser.cc"
     break;
 
-  case 176: // loggers: "loggers" $@44 ":" "[" loggers_entries "]"
-#line 727 "d2_parser.yy"
+  case 198: // loggers: "loggers" $@50 ":" "[" loggers_entries "]"
+#line 801 "d2_parser.yy"
                                                          {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1635 "d2_parser.cc"
+#line 1739 "d2_parser.cc"
     break;
 
-  case 179: // $@45: %empty
-#line 739 "d2_parser.yy"
+  case 201: // $@51: %empty
+#line 813 "d2_parser.yy"
                              {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 1645 "d2_parser.cc"
+#line 1749 "d2_parser.cc"
     break;
 
-  case 180: // logger_entry: "{" $@45 logger_params "}"
-#line 743 "d2_parser.yy"
+  case 202: // logger_entry: "{" $@51 logger_params "}"
+#line 817 "d2_parser.yy"
                                {
     ctx.stack_.pop_back();
 }
-#line 1653 "d2_parser.cc"
+#line 1757 "d2_parser.cc"
     break;
 
-  case 190: // $@46: %empty
-#line 760 "d2_parser.yy"
+  case 212: // $@52: %empty
+#line 834 "d2_parser.yy"
            {
     ctx.unique("name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1662 "d2_parser.cc"
+#line 1766 "d2_parser.cc"
     break;
 
-  case 191: // name: "name" $@46 ":" "constant string"
-#line 763 "d2_parser.yy"
+  case 213: // name: "name" $@52 ":" "constant string"
+#line 837 "d2_parser.yy"
                {
     ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1672 "d2_parser.cc"
+#line 1776 "d2_parser.cc"
     break;
 
-  case 192: // debuglevel: "debuglevel" ":" "integer"
-#line 769 "d2_parser.yy"
+  case 214: // debuglevel: "debuglevel" ":" "integer"
+#line 843 "d2_parser.yy"
                                      {
     ctx.unique("debuglevel", ctx.loc2pos(yystack_[2].location));
     ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 1682 "d2_parser.cc"
+#line 1786 "d2_parser.cc"
     break;
 
-  case 193: // $@47: %empty
-#line 775 "d2_parser.yy"
+  case 215: // $@53: %empty
+#line 849 "d2_parser.yy"
                    {
     ctx.unique("severity", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1691 "d2_parser.cc"
+#line 1795 "d2_parser.cc"
     break;
 
-  case 194: // severity: "severity" $@47 ":" "constant string"
-#line 778 "d2_parser.yy"
+  case 216: // severity: "severity" $@53 ":" "constant string"
+#line 852 "d2_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 1701 "d2_parser.cc"
+#line 1805 "d2_parser.cc"
     break;
 
-  case 195: // $@48: %empty
-#line 784 "d2_parser.yy"
+  case 217: // $@54: %empty
+#line 858 "d2_parser.yy"
                                     {
     ctx.unique("output_options", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -1709,106 +1813,106 @@ namespace isc { namespace d2 {
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 1713 "d2_parser.cc"
+#line 1817 "d2_parser.cc"
     break;
 
-  case 196: // output_options_list: "output_options" $@48 ":" "[" output_options_list_content "]"
-#line 790 "d2_parser.yy"
+  case 218: // output_options_list: "output_options" $@54 ":" "[" output_options_list_content "]"
+#line 864 "d2_parser.yy"
                                                                     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1722 "d2_parser.cc"
+#line 1826 "d2_parser.cc"
     break;
 
-  case 199: // $@49: %empty
-#line 799 "d2_parser.yy"
+  case 221: // $@55: %empty
+#line 873 "d2_parser.yy"
                              {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1732 "d2_parser.cc"
+#line 1836 "d2_parser.cc"
     break;
 
-  case 200: // output_entry: "{" $@49 output_params_list "}"
-#line 803 "d2_parser.yy"
+  case 222: // output_entry: "{" $@55 output_params_list "}"
+#line 877 "d2_parser.yy"
                                     {
     ctx.stack_.pop_back();
 }
-#line 1740 "d2_parser.cc"
+#line 1844 "d2_parser.cc"
     break;
 
-  case 208: // $@50: %empty
-#line 818 "d2_parser.yy"
+  case 230: // $@56: %empty
+#line 892 "d2_parser.yy"
                {
     ctx.unique("output", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1749 "d2_parser.cc"
+#line 1853 "d2_parser.cc"
     break;
 
-  case 209: // output: "output" $@50 ":" "constant string"
-#line 821 "d2_parser.yy"
+  case 231: // output: "output" $@56 ":" "constant string"
+#line 895 "d2_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 1759 "d2_parser.cc"
+#line 1863 "d2_parser.cc"
     break;
 
-  case 210: // flush: "flush" ":" "boolean"
-#line 827 "d2_parser.yy"
+  case 232: // flush: "flush" ":" "boolean"
+#line 901 "d2_parser.yy"
                            {
     ctx.unique("flush", ctx.loc2pos(yystack_[2].location));
     ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 1769 "d2_parser.cc"
+#line 1873 "d2_parser.cc"
     break;
 
-  case 211: // maxsize: "maxsize" ":" "integer"
-#line 833 "d2_parser.yy"
+  case 233: // maxsize: "maxsize" ":" "integer"
+#line 907 "d2_parser.yy"
                                {
     ctx.unique("maxsize", ctx.loc2pos(yystack_[2].location));
     ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 1779 "d2_parser.cc"
+#line 1883 "d2_parser.cc"
     break;
 
-  case 212: // maxver: "maxver" ":" "integer"
-#line 839 "d2_parser.yy"
+  case 234: // maxver: "maxver" ":" "integer"
+#line 913 "d2_parser.yy"
                              {
     ctx.unique("maxver", ctx.loc2pos(yystack_[2].location));
     ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 1789 "d2_parser.cc"
+#line 1893 "d2_parser.cc"
     break;
 
-  case 213: // $@51: %empty
-#line 845 "d2_parser.yy"
+  case 235: // $@57: %empty
+#line 919 "d2_parser.yy"
                  {
     ctx.unique("pattern", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1798 "d2_parser.cc"
+#line 1902 "d2_parser.cc"
     break;
 
-  case 214: // pattern: "pattern" $@51 ":" "constant string"
-#line 848 "d2_parser.yy"
+  case 236: // pattern: "pattern" $@57 ":" "constant string"
+#line 922 "d2_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pattern", sev);
     ctx.leave();
 }
-#line 1808 "d2_parser.cc"
+#line 1912 "d2_parser.cc"
     break;
 
 
-#line 1812 "d2_parser.cc"
+#line 1916 "d2_parser.cc"
 
             default:
               break;
@@ -2157,262 +2261,286 @@ namespace isc { namespace d2 {
   }
 
 
-  const signed char D2Parser::yypact_ninf_ = -80;
+  const short D2Parser::yypact_ninf_ = -208;
 
   const signed char D2Parser::yytable_ninf_ = -1;
 
   const short
   D2Parser::yypact_[] =
   {
-      38,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-       7,     1,     2,     8,    17,    26,    34,    53,    60,    86,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,     1,    40,
-       3,     6,    15,    93,    46,   103,    10,   104,   -80,   113,
-     117,   123,   121,   118,   -80,   129,   -80,   151,   153,   -80,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   154,   -80,
-      39,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   155,   -80,   -80,   -80,   -80,
-     -80,    45,   -80,   -80,   -80,   -80,   -80,   -80,   133,   146,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,    61,   -80,   -80,
-     -80,   -80,   -80,   148,   157,   -80,   -80,   158,   -80,   -80,
-     -80,   -80,    70,   -80,   -80,   -80,   -80,   -80,    43,   -80,
-     -80,     1,     1,   -80,   108,   159,   -80,   160,   111,   112,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   -80,
-       6,   -80,   172,   124,   173,   175,    15,   -80,    15,   -80,
-      93,   176,   179,   183,    46,   -80,    46,   -80,   103,   184,
-     136,   185,    10,   -80,    10,   104,   -80,   -80,   -80,   187,
-     186,   139,   -80,   -80,    59,   177,   190,   141,   191,   192,
-     195,   194,   197,   -80,   152,   -80,   156,   161,   -80,    98,
-     -80,   162,   198,   174,   -80,    99,   -80,   180,   -80,   181,
-     -80,   100,   -80,     1,     6,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,     9,     9,    93,    19,   199,   -80,   -80,
-     -80,   -80,   -80,   104,   -80,   -80,   -80,   -80,   -80,   -80,
-     110,   -80,   -80,   132,   -80,   -80,   -80,   135,   201,   -80,
-     -80,   -80,   -80,   -80,   138,   -80,   -80,   -80,   -80,   106,
-     -80,   145,   -80,   200,     9,   -80,   -80,   -80,   204,   206,
-      19,   -80,    41,   199,   -80,   -80,   207,   -80,   182,   188,
-     -80,   -80,   -80,   209,   -80,   -80,   -80,   -80,   142,   -80,
-     -80,   -80,   -80,   -80,   -80,   103,   -80,   -80,   212,   213,
-     178,   214,    41,   -80,   205,   193,   215,   -80,   196,   -80,
-     -80,   -80,   216,   -80,   -80,   150,   -80,    55,   216,   -80,
-     -80,   217,   220,   221,   -80,   144,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   222,   189,   202,   203,   232,    55,   -80,
-     210,   -80,   -80,   -80,   211,   -80,   -80,   -80
+      42,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,    45,     8,     0,    41,    49,    67,    55,    80,    95,
+     124,   114,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,     8,    65,   120,     7,    23,   125,    50,   131,
+      20,   133,    14,  -208,   142,   128,   158,   159,   147,  -208,
+     160,  -208,   162,   165,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,   166,  -208,    96,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,   167,  -208,  -208,  -208,  -208,  -208,    97,  -208,
+    -208,  -208,  -208,  -208,  -208,   168,   169,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,    98,  -208,  -208,  -208,  -208,  -208,
+     170,   172,  -208,  -208,   173,  -208,  -208,  -208,  -208,   100,
+    -208,  -208,  -208,  -208,  -208,    27,  -208,  -208,  -208,  -208,
+     108,  -208,  -208,  -208,  -208,     8,     8,  -208,   121,   175,
+    -208,   176,   115,   123,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,  -208,     7,  -208,   188,   135,   190,
+     191,    23,  -208,    23,  -208,   125,   192,   193,   194,    50,
+    -208,    50,  -208,   131,   195,   144,   202,    20,  -208,    20,
+     133,  -208,   203,   204,    51,  -208,  -208,  -208,   205,   206,
+     154,  -208,  -208,    94,   196,   209,   161,   210,   212,   207,
+     213,   216,   217,  -208,   171,  -208,   174,   177,  -208,   109,
+    -208,   189,   218,   200,  -208,   110,  -208,   201,  -208,   208,
+    -208,   116,  -208,   211,   209,  -208,     8,     7,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,     2,     2,   125,   -10,
+     219,   220,  -208,  -208,  -208,  -208,  -208,   133,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,   143,  -208,  -208,   146,
+    -208,  -208,  -208,   149,   223,  -208,  -208,  -208,  -208,  -208,
+     153,  -208,  -208,  -208,  -208,   224,   221,  -208,  -208,    57,
+    -208,    73,  -208,   228,     2,  -208,  -208,  -208,   229,   231,
+     -10,  -208,    14,  -208,   219,    16,   220,  -208,  -208,   232,
+    -208,   215,   222,  -208,   155,  -208,  -208,  -208,   234,  -208,
+    -208,  -208,  -208,   156,  -208,  -208,  -208,  -208,  -208,  -208,
+     131,  -208,  -208,  -208,   235,   236,   152,   237,    16,  -208,
+     230,   225,   238,  -208,   226,  -208,  -208,  -208,   240,  -208,
+    -208,   117,  -208,    38,   240,  -208,  -208,   241,   245,   246,
+    -208,   157,  -208,  -208,  -208,  -208,  -208,  -208,  -208,   247,
+     214,   227,   233,   248,    38,  -208,   239,  -208,  -208,  -208,
+     242,  -208,  -208,  -208
   };
 
   const unsigned char
   D2Parser::yydefact_[] =
   {
        0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       1,    35,    28,    24,    23,    20,    21,    22,    27,     3,
-      25,    26,    42,     5,    46,     7,   144,     9,   136,    11,
-      97,    13,    89,    15,   119,    17,   113,    19,    37,    31,
-       0,     0,     0,   138,     0,    91,     0,     0,    39,     0,
-      38,     0,     0,    32,    44,     0,    63,     0,     0,    67,
-      71,    73,    75,    77,    79,   134,   162,   175,     0,    62,
-       0,    48,    50,    51,    52,    53,    54,    60,    61,    55,
-      56,    57,    58,    59,   157,     0,   160,   155,   154,   152,
-     153,     0,   146,   148,   149,   150,   151,   142,     0,   139,
-     140,   109,   111,   107,   106,   104,   105,     0,    99,   101,
-     102,   103,    95,     0,    92,    93,   131,     0,   129,   128,
-     126,   127,     0,   121,   123,   124,   125,   117,     0,   115,
-      36,     0,     0,    29,     0,     0,    43,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    41,
-       0,    47,     0,     0,     0,     0,     0,   145,     0,   137,
-       0,     0,     0,     0,     0,    98,     0,    90,     0,     0,
-       0,     0,     0,   120,     0,     0,   114,    40,    33,     0,
-       0,     0,    65,    66,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    49,     0,   159,     0,     0,   147,     0,
-     141,     0,     0,     0,   100,     0,    94,     0,   133,     0,
-     122,     0,   116,     0,     0,    64,    69,    70,    68,    72,
-      30,    74,    76,    81,    81,   138,     0,     0,   158,   161,
-     156,   143,   110,     0,   108,    96,   132,   130,   118,    34,
-       0,    87,    86,     0,    82,    83,    85,     0,     0,   171,
-     173,   170,   168,   169,     0,   164,   166,   167,   179,     0,
-     177,     0,    45,     0,     0,    78,    80,   135,     0,     0,
-       0,   163,     0,     0,   176,   112,     0,    84,     0,     0,
-     165,   190,   195,     0,   193,   189,   187,   188,     0,   181,
-     183,   185,   186,   184,   178,    91,   172,   174,     0,     0,
-       0,     0,     0,   180,     0,     0,     0,   192,     0,   182,
-      88,   191,     0,   194,   199,     0,   197,     0,     0,   196,
-     208,     0,     0,     0,   213,     0,   201,   203,   204,   205,
-     206,   207,   198,     0,     0,     0,     0,     0,     0,   200,
-       0,   210,   211,   212,     0,   202,   209,   214
+      20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     1,    37,    30,    26,    25,    22,    23,    24,
+      29,     3,    27,    28,    44,     5,    48,     7,   147,     9,
+     139,    11,   100,    13,    92,    15,   122,    17,   116,    19,
+     186,    21,    39,    33,     0,     0,     0,   141,     0,    94,
+       0,     0,     0,    41,     0,    40,     0,     0,    34,    46,
+       0,    66,     0,     0,    70,    74,    76,    78,    80,    82,
+     137,   165,   178,   197,     0,    65,     0,    50,    52,    53,
+      54,    55,    56,    63,    64,    57,    58,    59,    60,    61,
+      62,   160,     0,   163,   158,   157,   155,   156,     0,   149,
+     151,   152,   153,   154,   145,     0,   142,   143,   112,   114,
+     110,   109,   107,   108,     0,   102,   104,   105,   106,    98,
+       0,    95,    96,   134,     0,   132,   131,   129,   130,     0,
+     124,   126,   127,   128,   120,     0,   118,   193,   195,   190,
+       0,   188,   191,   192,    38,     0,     0,    31,     0,     0,
+      45,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    43,     0,    49,     0,     0,     0,
+       0,     0,   148,     0,   140,     0,     0,     0,     0,     0,
+     101,     0,    93,     0,     0,     0,     0,     0,   123,     0,
+       0,   117,     0,     0,     0,   187,    42,    35,     0,     0,
+       0,    68,    69,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    51,     0,   162,     0,     0,   150,     0,
+     144,     0,     0,     0,   103,     0,    97,     0,   136,     0,
+     125,     0,   119,     0,     0,   189,     0,     0,    67,    72,
+      73,    71,    75,    32,    77,    79,    84,    84,   141,     0,
+     180,     0,   161,   164,   159,   146,   113,     0,   111,    99,
+     135,   133,   121,   194,   196,    36,     0,    90,    89,     0,
+      85,    86,    88,     0,     0,   174,   176,   173,   171,   172,
+       0,   167,   169,   170,   184,     0,   181,   182,   201,     0,
+     199,     0,    47,     0,     0,    81,    83,   138,     0,     0,
+       0,   166,     0,   179,     0,     0,     0,   198,   115,     0,
+      87,     0,     0,   168,     0,   183,   212,   217,     0,   215,
+     211,   209,   210,     0,   203,   205,   207,   208,   206,   200,
+      94,   175,   177,   185,     0,     0,     0,     0,     0,   202,
+       0,     0,     0,   214,     0,   204,    91,   213,     0,   216,
+     221,     0,   219,     0,     0,   218,   230,     0,     0,     0,
+     235,     0,   223,   225,   226,   227,   228,   229,   220,     0,
+       0,     0,     0,     0,     0,   222,     0,   232,   233,   234,
+       0,   224,   231,   236
   };
 
-  const signed char
+  const short
   D2Parser::yypgoto_[] =
   {
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,   -37,   -80,    23,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -52,   -80,   -80,   -80,   -80,   -80,   -80,    13,
-      78,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -51,   -80,   -40,   -80,   -80,   -80,   -80,   -80,     5,   -80,
-     -31,   -80,   -80,   -80,   -80,   -61,   -80,    69,   -80,   -80,
-     -80,    72,    76,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
-     -80,    11,    66,   -80,   -80,   -80,    68,    71,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   -80,   -80,    20,   -80,    88,
-     -80,   -80,   -80,    91,    96,   -80,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   -15,   -80,   -80,   -80,   -80,
-     -80,   -80,   -80,   -17,   -80,   -80,   -45,   -80,   -80,   -80,
-     -80,   -80,   -80,   -80,   -80,   -60,   -80,   -80,   -79,   -80,
-     -80,   -80,   -80,   -80,   -80,   -80
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,   -41,  -208,  -207,  -208,   -19,  -208,  -208,  -208,
+    -208,  -208,  -208,   -56,  -208,  -208,  -208,  -208,  -208,  -208,
+      -5,    69,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,   -55,  -208,   -44,  -208,  -208,  -208,  -208,  -208,    -4,
+    -208,   -43,  -208,  -208,  -208,  -208,   -78,  -208,    70,  -208,
+    -208,  -208,    76,    75,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,     3,    77,  -208,  -208,  -208,    74,    72,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,    17,  -208,
+      91,  -208,  -208,  -208,   101,    99,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,   -32,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,   -33,  -208,  -208,  -208,   -26,
+      83,  -208,  -208,  -208,  -208,  -208,  -208,  -208,   -28,  -208,
+    -208,   -59,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+     -74,  -208,  -208,   -90,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208
   };
 
   const short
   D2Parser::yydefgoto_[] =
   {
-       0,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    28,    29,    30,    49,   231,    62,    63,    31,    48,
-      59,    60,    79,    33,    50,    65,   145,    35,    51,    80,
-      81,    82,   147,    83,    84,    85,   150,   228,    86,   151,
-      87,   152,    88,   153,    89,   154,    90,   155,   253,   254,
-     255,   256,   273,    43,    55,   123,   124,   125,   176,    41,
-      54,   117,   118,   119,   173,   120,   171,   121,   172,    47,
-      57,   138,   139,   184,    45,    56,   132,   133,   134,   181,
-     135,   179,   136,    91,   156,    39,    53,   108,   109,   110,
-     168,    37,    52,   101,   102,   103,   165,   104,   162,   105,
-     106,   164,    92,   157,   264,   265,   266,   278,   267,   279,
-      93,   158,   269,   270,   282,   298,   299,   300,   308,   301,
-     302,   311,   303,   309,   325,   326,   327,   335,   336,   337,
-     343,   338,   339,   340,   341,   347
+       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    30,    31,    32,    53,   254,    67,    68,    33,
+      52,    64,    65,    85,    35,    54,    70,   159,    37,    55,
+      86,    87,    88,   161,    89,    90,    91,   164,   251,    92,
+     165,    93,   166,    94,   167,    95,   168,    96,   169,   279,
+     280,   281,   282,   303,    45,    59,   130,   131,   132,   191,
+      43,    58,   124,   125,   126,   188,   127,   186,   128,   187,
+      49,    61,   145,   146,   199,    47,    60,   139,   140,   141,
+     196,   142,   194,   143,    97,   170,    41,    57,   115,   116,
+     117,   183,    39,    56,   108,   109,   110,   180,   111,   177,
+     112,   113,   179,    98,   171,   290,   291,   292,   308,   293,
+     309,    99,   172,   295,   296,   297,   312,    51,    62,   150,
+     151,   152,   202,   153,   203,   100,   173,   299,   300,   315,
+     333,   334,   335,   344,   336,   337,   347,   338,   345,   361,
+     362,   363,   371,   372,   373,   379,   374,   375,   376,   377,
+     383
   };
 
   const short
   D2Parser::yytable_[] =
   {
-      98,    99,   114,   115,   129,   130,    21,    20,    22,    32,
-      23,    58,   100,    64,   116,    34,   131,    66,    67,    68,
-      69,   126,   127,    70,    36,    71,    72,    73,    74,    71,
-      72,    38,   251,    75,    71,    72,   128,    76,    71,    72,
-      77,    40,   160,    94,    95,    96,   185,   161,   166,   186,
-      97,   259,   260,   167,    24,    25,    26,    27,    42,    78,
-      71,    72,    78,    78,   174,    71,    72,    44,    78,   175,
-     111,   112,    78,   182,   226,   227,   291,   292,   183,   293,
-     294,   113,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    46,   330,    61,    78,   331,   332,   333,   334,    78,
-     107,   166,   174,   182,   187,   188,   241,   245,   248,   283,
-     122,   137,   284,   160,    98,    99,    98,    99,   272,   140,
-     141,   144,   114,   115,   114,   115,   100,   142,   100,   143,
-     129,   130,   129,   130,   116,   274,   116,   146,   274,   169,
-     275,   280,   131,   276,   131,   312,   281,   348,   185,   170,
-     313,   285,   349,   328,   177,   148,   329,   149,   159,   163,
-     178,   189,   180,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   204,   206,   205,   207,
-     211,   252,   252,   212,   261,   262,   249,   213,   217,   219,
-     218,   223,   225,   224,   232,   229,   263,    22,   233,   234,
-     235,   236,   237,   243,   286,   238,   268,   277,   288,   239,
-     289,   320,   305,   310,   240,   242,   315,   316,   318,   230,
-     322,   344,   252,   324,   345,   346,   350,   244,   261,   262,
-     295,   296,   317,   246,   247,   306,   354,   250,   203,   257,
-     263,   307,   297,   287,   314,   351,   321,   216,   215,   323,
-     214,   222,   221,   220,   271,   258,   352,   353,   210,   209,
-     295,   296,   208,   356,   357,   290,   304,   319,   342,   355,
-       0,     0,   297
+     105,   106,   121,   122,   136,   137,   149,    34,   253,    76,
+      77,    63,   107,    23,   123,    24,   138,    25,    71,    72,
+      73,    74,   285,   286,    75,   277,    76,    77,    78,    79,
+     200,   133,   134,   201,    80,    76,    77,   253,    81,    76,
+      77,    82,    76,    77,    83,    22,   135,    84,    36,   147,
+     148,   101,   102,   103,   326,   327,    38,   328,   329,    84,
+     316,   104,    42,   317,    84,    26,    27,    28,    29,    76,
+      77,    84,    40,    84,   118,   119,   200,    84,   366,   318,
+      84,   367,   368,   369,   370,    44,   147,   148,   120,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,   175,
+     181,   189,    46,   197,   176,   182,   190,    84,   198,   249,
+     250,   204,   181,   189,   206,   207,   205,   265,   269,   197,
+     364,    50,    66,   365,   272,   105,   106,   105,   106,    48,
+      69,   155,   114,   121,   122,   121,   122,   107,   129,   107,
+     144,   136,   137,   136,   137,   123,   175,   123,   154,   304,
+     158,   302,   304,   138,   305,   138,   310,   306,   204,   348,
+     384,   311,   156,   343,   349,   385,   162,   157,   160,   163,
+     174,   178,   185,   211,   184,   193,   192,   195,   208,   209,
+     210,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   224,   225,   226,   227,   231,   232,   233,   237,
+     278,   278,   238,   287,   288,   275,   239,   243,   244,   246,
+     353,   248,   258,   247,   252,   289,    24,   256,   255,   257,
+     259,   260,   261,   267,   314,   274,   294,   298,   262,   307,
+     313,   263,   319,   321,   264,   322,   356,   340,   346,   351,
+     352,   354,   276,   358,   223,   380,   266,   360,   278,   381,
+     382,   386,   390,   283,   287,   288,   149,   268,   270,   330,
+     331,   320,   350,   236,   234,   271,   289,   235,   273,   240,
+     301,   332,   341,   241,   387,   284,   230,   242,   323,   342,
+     228,   325,   357,   359,   229,   388,   324,   245,   339,   355,
+     378,   389,   330,   331,   391,     0,   392,     0,     0,   393,
+       0,     0,     0,     0,   332
   };
 
   const short
   D2Parser::yycheck_[] =
   {
-      52,    52,    54,    54,    56,    56,     5,     0,     7,     7,
-       9,    48,    52,    10,    54,     7,    56,    11,    12,    13,
-      14,    11,    12,    17,     7,    19,    20,    21,    22,    19,
-      20,     5,    23,    27,    19,    20,    26,    31,    19,    20,
-      34,     7,     3,    28,    29,    30,     3,     8,     3,     6,
-      35,    32,    33,     8,    53,    54,    55,    56,     5,    53,
-      19,    20,    53,    53,     3,    19,    20,     7,    53,     8,
-      24,    25,    53,     3,    15,    16,    35,    36,     8,    38,
-      39,    35,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,     5,    37,    53,    53,    40,    41,    42,    43,    53,
-       7,     3,     3,     3,   141,   142,     8,     8,     8,     3,
-       7,     7,     6,     3,   166,   166,   168,   168,     8,     6,
-       3,     3,   174,   174,   176,   176,   166,     4,   168,     8,
-     182,   182,   184,   184,   174,     3,   176,     8,     3,     6,
-       8,     3,   182,     8,   184,     3,     8,     3,     3,     3,
-       8,     6,     8,     3,     6,     4,     6,     4,     4,     4,
-       3,    53,     4,     4,     4,    54,    54,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,     4,    54,     4,
-       4,   233,   234,     4,   236,   236,   223,     4,     4,     4,
-      54,     4,    53,     7,    53,    18,   236,     7,     7,     7,
-       5,     7,     5,     5,     4,    53,     7,     6,     4,    53,
-       4,     6,     5,     4,    53,    53,     4,     4,     4,   196,
-       5,     4,   274,     7,     4,     4,     4,    53,   280,   280,
-     282,   282,    54,    53,    53,    53,     4,   224,   160,   234,
-     280,    53,   282,   274,   305,    56,    53,   178,   176,    53,
-     174,   185,   184,   182,   243,   235,    54,    54,   170,   168,
-     312,   312,   166,    53,    53,   280,   283,   312,   328,   348,
-      -1,    -1,   312
+      56,    56,    58,    58,    60,    60,    62,     7,   215,    19,
+      20,    52,    56,     5,    58,     7,    60,     9,    11,    12,
+      13,    14,    32,    33,    17,    23,    19,    20,    21,    22,
+       3,    11,    12,     6,    27,    19,    20,   244,    31,    19,
+      20,    34,    19,    20,    37,     0,    26,    57,     7,    35,
+      36,    28,    29,    30,    38,    39,     7,    41,    42,    57,
+       3,    38,     7,     6,    57,    57,    58,    59,    60,    19,
+      20,    57,     5,    57,    24,    25,     3,    57,    40,     6,
+      57,    43,    44,    45,    46,     5,    35,    36,    38,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,     3,
+       3,     3,     7,     3,     8,     8,     8,    57,     8,    15,
+      16,     3,     3,     3,   155,   156,     8,     8,     8,     3,
+       3,     7,    57,     6,     8,   181,   181,   183,   183,     5,
+      10,     3,     7,   189,   189,   191,   191,   181,     7,   183,
+       7,   197,   197,   199,   199,   189,     3,   191,     6,     3,
+       3,     8,     3,   197,     8,   199,     3,     8,     3,     3,
+       3,     8,     4,     8,     8,     8,     4,     8,     8,     4,
+       4,     4,     3,    58,     6,     3,     6,     4,    57,     4,
+       4,    58,     4,     4,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,    58,     4,     4,     4,     4,     4,     4,
+     256,   257,    58,   259,   259,   246,     4,     4,     4,     4,
+      58,    57,     5,     7,    18,   259,     7,     7,    57,     7,
+       7,     5,     5,     5,     3,   244,     7,     7,    57,     6,
+       6,    57,     4,     4,    57,     4,     6,     5,     4,     4,
+       4,     4,   247,     5,   175,     4,    57,     7,   304,     4,
+       4,     4,     4,   257,   310,   310,   312,    57,    57,   315,
+     315,   304,   340,   193,   189,    57,   310,   191,    57,   197,
+     267,   315,    57,   199,    60,   258,   185,   200,   310,    57,
+     181,   314,    57,    57,   183,    58,   312,   204,   316,   348,
+     364,    58,   348,   348,   384,    -1,    57,    -1,    -1,    57,
+      -1,    -1,    -1,    -1,   348
   };
 
   const unsigned char
   D2Parser::yystos_[] =
   {
-       0,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-       0,     5,     7,     9,    53,    54,    55,    56,    68,    69,
-      70,    75,     7,    80,     7,    84,     7,   148,     5,   142,
-       7,   116,     5,   110,     7,   131,     5,   126,    76,    71,
-      81,    85,   149,   143,   117,   111,   132,   127,    68,    77,
-      78,    53,    73,    74,    10,    82,    11,    12,    13,    14,
-      17,    19,    20,    21,    22,    27,    31,    34,    53,    79,
-      86,    87,    88,    90,    91,    92,    95,    97,    99,   101,
-     103,   140,   159,   167,    28,    29,    30,    35,    79,    97,
-      99,   150,   151,   152,   154,   156,   157,     7,   144,   145,
-     146,    24,    25,    35,    79,    97,    99,   118,   119,   120,
-     122,   124,     7,   112,   113,   114,    11,    12,    26,    79,
-      97,    99,   133,   134,   135,   137,   139,     7,   128,   129,
-       6,     3,     4,     8,     3,    83,     8,    89,     4,     4,
-      93,    96,    98,   100,   102,   104,   141,   160,   168,     4,
-       3,     8,   155,     4,   158,   153,     3,     8,   147,     6,
-       3,   123,   125,   121,     3,     8,   115,     6,     3,   138,
-       4,   136,     3,     8,   130,     3,     6,    68,    68,    53,
-       4,     4,    54,    54,     4,     4,     4,     4,     4,     4,
-       4,     4,     4,    87,     4,    54,     4,     4,   151,   150,
-     146,     4,     4,     4,   119,   118,   114,     4,    54,     4,
-     134,   133,   129,     4,     7,    53,    15,    16,    94,    18,
-      70,    72,    53,     7,     7,     5,     7,     5,    53,    53,
-      53,     8,    53,     5,    53,     8,    53,    53,     8,    68,
-      86,    23,    79,   105,   106,   107,   108,   105,   144,    32,
-      33,    79,    97,    99,   161,   162,   163,   165,     7,   169,
-     170,   128,     8,   109,     3,     8,     8,     6,   164,   166,
-       3,     8,   171,     3,     6,     6,     4,   107,     4,     4,
-     162,    35,    36,    38,    39,    79,    97,    99,   172,   173,
-     174,   176,   177,   179,   170,     5,    53,    53,   175,   180,
-       4,   178,     3,     8,   112,     4,     4,    54,     4,   173,
-       6,    53,     5,    53,     7,   181,   182,   183,     3,     6,
-      37,    40,    41,    42,    43,   184,   185,   186,   188,   189,
-     190,   191,   182,   187,     4,     4,     4,   192,     3,     8,
-       4,    56,    54,    54,     4,   185,    53,    53
+       0,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,     0,     5,     7,     9,    57,    58,    59,    60,
+      73,    74,    75,    80,     7,    85,     7,    89,     7,   153,
+       5,   147,     7,   121,     5,   115,     7,   136,     5,   131,
+       7,   178,    81,    76,    86,    90,   154,   148,   122,   116,
+     137,   132,   179,    73,    82,    83,    57,    78,    79,    10,
+      87,    11,    12,    13,    14,    17,    19,    20,    21,    22,
+      27,    31,    34,    37,    57,    84,    91,    92,    93,    95,
+      96,    97,   100,   102,   104,   106,   108,   145,   164,   172,
+     186,    28,    29,    30,    38,    84,   102,   104,   155,   156,
+     157,   159,   161,   162,     7,   149,   150,   151,    24,    25,
+      38,    84,   102,   104,   123,   124,   125,   127,   129,     7,
+     117,   118,   119,    11,    12,    26,    84,   102,   104,   138,
+     139,   140,   142,   144,     7,   133,   134,    35,    36,    84,
+     180,   181,   182,   184,     6,     3,     4,     8,     3,    88,
+       8,    94,     4,     4,    98,   101,   103,   105,   107,   109,
+     146,   165,   173,   187,     4,     3,     8,   160,     4,   163,
+     158,     3,     8,   152,     6,     3,   128,   130,   126,     3,
+       8,   120,     6,     3,   143,     4,   141,     3,     8,   135,
+       3,     6,   183,   185,     3,     8,    73,    73,    57,     4,
+       4,    58,    58,     4,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,    92,     4,    58,     4,     4,   156,   155,
+     151,     4,     4,     4,   124,   123,   119,     4,    58,     4,
+     139,   138,   134,     4,     4,   181,     4,     7,    57,    15,
+      16,    99,    18,    75,    77,    57,     7,     7,     5,     7,
+       5,     5,    57,    57,    57,     8,    57,     5,    57,     8,
+      57,    57,     8,    57,    77,    73,    91,    23,    84,   110,
+     111,   112,   113,   110,   149,    32,    33,    84,   102,   104,
+     166,   167,   168,   170,     7,   174,   175,   176,     7,   188,
+     189,   133,     8,   114,     3,     8,     8,     6,   169,   171,
+       3,     8,   177,     6,     3,   190,     3,     6,     6,     4,
+     112,     4,     4,   167,   180,   176,    38,    39,    41,    42,
+      84,   102,   104,   191,   192,   193,   195,   196,   198,   189,
+       5,    57,    57,     8,   194,   199,     4,   197,     3,     8,
+     117,     4,     4,    58,     4,   192,     6,    57,     5,    57,
+       7,   200,   201,   202,     3,     6,    40,    43,    44,    45,
+      46,   203,   204,   205,   207,   208,   209,   210,   201,   206,
+       4,     4,     4,   211,     3,     8,     4,    60,    58,    58,
+       4,   204,    57,    57
   };
 
   const unsigned char
   D2Parser::yyr1_[] =
   {
-       0,    57,    59,    58,    60,    58,    61,    58,    62,    58,
-      63,    58,    64,    58,    65,    58,    66,    58,    67,    58,
-      68,    68,    68,    68,    68,    68,    68,    69,    71,    70,
-      72,    73,    73,    74,    74,    76,    75,    77,    77,    78,
-      78,    79,    81,    80,    83,    82,    85,    84,    86,    86,
-      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
-      87,    87,    87,    89,    88,    90,    91,    93,    92,    94,
-      94,    96,    95,    98,    97,   100,    99,   102,   101,   104,
-     103,   105,   105,   106,   106,   107,   107,   109,   108,   111,
-     110,   112,   112,   113,   113,   115,   114,   117,   116,   118,
-     118,   119,   119,   119,   119,   119,   119,   121,   120,   123,
-     122,   125,   124,   127,   126,   128,   128,   130,   129,   132,
-     131,   133,   133,   134,   134,   134,   134,   134,   134,   136,
-     135,   138,   137,   139,   141,   140,   143,   142,   144,   144,
-     145,   145,   147,   146,   149,   148,   150,   150,   151,   151,
-     151,   151,   151,   151,   151,   153,   152,   155,   154,   156,
-     158,   157,   160,   159,   161,   161,   162,   162,   162,   162,
-     162,   164,   163,   166,   165,   168,   167,   169,   169,   171,
-     170,   172,   172,   173,   173,   173,   173,   173,   173,   173,
-     175,   174,   176,   178,   177,   180,   179,   181,   181,   183,
-     182,   184,   184,   185,   185,   185,   185,   185,   187,   186,
-     188,   189,   190,   192,   191
+       0,    61,    63,    62,    64,    62,    65,    62,    66,    62,
+      67,    62,    68,    62,    69,    62,    70,    62,    71,    62,
+      72,    62,    73,    73,    73,    73,    73,    73,    73,    74,
+      76,    75,    77,    78,    78,    79,    79,    81,    80,    82,
+      82,    83,    83,    84,    86,    85,    88,    87,    90,    89,
+      91,    91,    92,    92,    92,    92,    92,    92,    92,    92,
+      92,    92,    92,    92,    92,    92,    94,    93,    95,    96,
+      98,    97,    99,    99,   101,   100,   103,   102,   105,   104,
+     107,   106,   109,   108,   110,   110,   111,   111,   112,   112,
+     114,   113,   116,   115,   117,   117,   118,   118,   120,   119,
+     122,   121,   123,   123,   124,   124,   124,   124,   124,   124,
+     126,   125,   128,   127,   130,   129,   132,   131,   133,   133,
+     135,   134,   137,   136,   138,   138,   139,   139,   139,   139,
+     139,   139,   141,   140,   143,   142,   144,   146,   145,   148,
+     147,   149,   149,   150,   150,   152,   151,   154,   153,   155,
+     155,   156,   156,   156,   156,   156,   156,   156,   158,   157,
+     160,   159,   161,   163,   162,   165,   164,   166,   166,   167,
+     167,   167,   167,   167,   169,   168,   171,   170,   173,   172,
+     174,   174,   175,   175,   177,   176,   179,   178,   180,   180,
+     180,   181,   181,   183,   182,   185,   184,   187,   186,   188,
+     188,   190,   189,   191,   191,   192,   192,   192,   192,   192,
+     192,   192,   194,   193,   195,   197,   196,   199,   198,   200,
+     200,   202,   201,   203,   203,   204,   204,   204,   204,   204,
+     206,   205,   207,   208,   209,   211,   210
   };
 
   const signed char
@@ -2420,26 +2548,28 @@ namespace isc { namespace d2 {
   {
        0,     2,     0,     3,     0,     3,     0,     3,     0,     3,
        0,     3,     0,     3,     0,     3,     0,     3,     0,     3,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
-       1,     0,     1,     3,     5,     0,     4,     0,     1,     1,
-       3,     2,     0,     4,     0,     6,     0,     4,     1,     3,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     4,     3,     3,     0,     4,     1,
-       1,     0,     4,     0,     4,     0,     4,     0,     6,     0,
-       6,     0,     1,     1,     3,     1,     1,     0,     6,     0,
+       0,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     4,     1,     0,     1,     3,     5,     0,     4,     0,
+       1,     1,     3,     2,     0,     4,     0,     6,     0,     4,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     0,     4,     3,     3,
+       0,     4,     1,     1,     0,     4,     0,     4,     0,     4,
+       0,     6,     0,     6,     0,     1,     1,     3,     1,     1,
+       0,     6,     0,     4,     0,     1,     1,     3,     0,     4,
+       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
+       0,     4,     0,     4,     0,     6,     0,     4,     1,     3,
+       0,     4,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     0,     4,     0,     4,     3,     0,     6,     0,
        4,     0,     1,     1,     3,     0,     4,     0,     4,     1,
-       3,     1,     1,     1,     1,     1,     1,     0,     4,     0,
-       4,     0,     6,     0,     4,     1,     3,     0,     4,     0,
-       4,     1,     3,     1,     1,     1,     1,     1,     1,     0,
-       4,     0,     4,     3,     0,     6,     0,     4,     0,     1,
-       1,     3,     0,     4,     0,     4,     1,     3,     1,     1,
-       1,     1,     1,     1,     1,     0,     4,     0,     4,     3,
-       0,     4,     0,     6,     1,     3,     1,     1,     1,     1,
-       1,     0,     4,     0,     4,     0,     6,     1,     3,     0,
-       4,     1,     3,     1,     1,     1,     1,     1,     1,     1,
-       0,     4,     3,     0,     4,     0,     6,     1,     3,     0,
-       4,     1,     3,     1,     1,     1,     1,     1,     0,     4,
-       3,     3,     3,     0,     4
+       3,     1,     1,     1,     1,     1,     1,     1,     0,     4,
+       0,     4,     3,     0,     4,     0,     6,     1,     3,     1,
+       1,     1,     1,     1,     0,     4,     0,     4,     0,     6,
+       0,     1,     1,     3,     0,     4,     0,     4,     1,     3,
+       1,     1,     1,     0,     4,     0,     4,     0,     6,     1,
+       3,     0,     4,     1,     3,     1,     1,     1,     1,     1,
+       1,     1,     0,     4,     3,     0,     4,     0,     6,     1,
+       3,     0,     4,     1,     3,     1,     1,     1,     1,     1,
+       0,     4,     3,     3,     3,     0,     4
   };
 
 
@@ -2457,41 +2587,46 @@ namespace isc { namespace d2 {
   "\"reverse-ddns\"", "\"ddns-domains\"", "\"key-name\"",
   "\"dns-servers\"", "\"hostname\"", "\"tsig-keys\"", "\"algorithm\"",
   "\"digest-bits\"", "\"secret\"", "\"control-socket\"", "\"socket-type\"",
-  "\"socket-name\"", "\"loggers\"", "\"name\"", "\"output_options\"",
+  "\"socket-name\"", "\"hooks-libraries\"", "\"library\"",
+  "\"parameters\"", "\"loggers\"", "\"name\"", "\"output_options\"",
   "\"output\"", "\"debuglevel\"", "\"severity\"", "\"flush\"",
   "\"maxsize\"", "\"maxver\"", "\"pattern\"", "TOPLEVEL_JSON",
   "TOPLEVEL_DHCPDDNS", "SUB_DHCPDDNS", "SUB_TSIG_KEY", "SUB_TSIG_KEYS",
   "SUB_DDNS_DOMAIN", "SUB_DDNS_DOMAINS", "SUB_DNS_SERVER",
-  "SUB_DNS_SERVERS", "\"constant string\"", "\"integer\"",
-  "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2",
-  "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "value", "sub_json",
-  "map2", "$@10", "map_value", "map_content", "not_empty_map",
-  "list_generic", "$@11", "list_content", "not_empty_list",
-  "unknown_map_entry", "syntax_map", "$@12", "global_object", "$@13",
-  "sub_dhcpddns", "$@14", "dhcpddns_params", "dhcpddns_param",
-  "ip_address", "$@15", "port", "dns_server_timeout", "ncr_protocol",
-  "$@16", "ncr_protocol_value", "ncr_format", "$@17", "user_context",
-  "$@18", "comment", "$@19", "forward_ddns", "$@20", "reverse_ddns",
-  "$@21", "ddns_mgr_params", "not_empty_ddns_mgr_params", "ddns_mgr_param",
-  "ddns_domains", "$@22", "sub_ddns_domains", "$@23", "ddns_domain_list",
-  "not_empty_ddns_domain_list", "ddns_domain", "$@24", "sub_ddns_domain",
-  "$@25", "ddns_domain_params", "ddns_domain_param", "ddns_domain_name",
-  "$@26", "ddns_domain_key_name", "$@27", "dns_servers", "$@28",
-  "sub_dns_servers", "$@29", "dns_server_list", "dns_server", "$@30",
-  "sub_dns_server", "$@31", "dns_server_params", "dns_server_param",
-  "dns_server_hostname", "$@32", "dns_server_ip_address", "$@33",
-  "dns_server_port", "tsig_keys", "$@34", "sub_tsig_keys", "$@35",
-  "tsig_keys_list", "not_empty_tsig_keys_list", "tsig_key", "$@36",
-  "sub_tsig_key", "$@37", "tsig_key_params", "tsig_key_param",
-  "tsig_key_name", "$@38", "tsig_key_algorithm", "$@39",
-  "tsig_key_digest_bits", "tsig_key_secret", "$@40", "control_socket",
-  "$@41", "control_socket_params", "control_socket_param",
-  "control_socket_type", "$@42", "control_socket_name", "$@43", "loggers",
-  "$@44", "loggers_entries", "logger_entry", "$@45", "logger_params",
-  "logger_param", "name", "$@46", "debuglevel", "severity", "$@47",
-  "output_options_list", "$@48", "output_options_list_content",
-  "output_entry", "$@49", "output_params_list", "output_params", "output",
-  "$@50", "flush", "maxsize", "maxver", "pattern", "$@51", YY_NULLPTR
+  "SUB_DNS_SERVERS", "SUB_HOOKS_LIBRARY", "\"constant string\"",
+  "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start",
+  "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10",
+  "value", "sub_json", "map2", "$@11", "map_value", "map_content",
+  "not_empty_map", "list_generic", "$@12", "list_content",
+  "not_empty_list", "unknown_map_entry", "syntax_map", "$@13",
+  "global_object", "$@14", "sub_dhcpddns", "$@15", "dhcpddns_params",
+  "dhcpddns_param", "ip_address", "$@16", "port", "dns_server_timeout",
+  "ncr_protocol", "$@17", "ncr_protocol_value", "ncr_format", "$@18",
+  "user_context", "$@19", "comment", "$@20", "forward_ddns", "$@21",
+  "reverse_ddns", "$@22", "ddns_mgr_params", "not_empty_ddns_mgr_params",
+  "ddns_mgr_param", "ddns_domains", "$@23", "sub_ddns_domains", "$@24",
+  "ddns_domain_list", "not_empty_ddns_domain_list", "ddns_domain", "$@25",
+  "sub_ddns_domain", "$@26", "ddns_domain_params", "ddns_domain_param",
+  "ddns_domain_name", "$@27", "ddns_domain_key_name", "$@28",
+  "dns_servers", "$@29", "sub_dns_servers", "$@30", "dns_server_list",
+  "dns_server", "$@31", "sub_dns_server", "$@32", "dns_server_params",
+  "dns_server_param", "dns_server_hostname", "$@33",
+  "dns_server_ip_address", "$@34", "dns_server_port", "tsig_keys", "$@35",
+  "sub_tsig_keys", "$@36", "tsig_keys_list", "not_empty_tsig_keys_list",
+  "tsig_key", "$@37", "sub_tsig_key", "$@38", "tsig_key_params",
+  "tsig_key_param", "tsig_key_name", "$@39", "tsig_key_algorithm", "$@40",
+  "tsig_key_digest_bits", "tsig_key_secret", "$@41", "control_socket",
+  "$@42", "control_socket_params", "control_socket_param",
+  "control_socket_type", "$@43", "control_socket_name", "$@44",
+  "hooks_libraries", "$@45", "hooks_libraries_list",
+  "not_empty_hooks_libraries_list", "hooks_library", "$@46",
+  "sub_hooks_library", "$@47", "hooks_params", "hooks_param", "library",
+  "$@48", "parameters", "$@49", "loggers", "$@50", "loggers_entries",
+  "logger_entry", "$@51", "logger_params", "logger_param", "name", "$@52",
+  "debuglevel", "severity", "$@53", "output_options_list", "$@54",
+  "output_options_list_content", "output_entry", "$@55",
+  "output_params_list", "output_params", "output", "$@56", "flush",
+  "maxsize", "maxver", "pattern", "$@57", YY_NULLPTR
   };
 #endif
 
@@ -2500,28 +2635,30 @@ namespace isc { namespace d2 {
   const short
   D2Parser::yyrline_[] =
   {
-       0,   120,   120,   120,   121,   121,   122,   122,   123,   123,
-     124,   124,   125,   125,   126,   126,   127,   127,   128,   128,
-     136,   137,   138,   139,   140,   141,   142,   145,   150,   150,
-     161,   164,   165,   168,   173,   181,   181,   188,   189,   192,
-     196,   207,   216,   216,   229,   229,   240,   240,   248,   249,
-     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
-     263,   264,   265,   268,   268,   277,   286,   296,   296,   305,
-     306,   309,   309,   318,   318,   343,   343,   370,   370,   381,
-     381,   392,   393,   396,   397,   400,   401,   406,   406,   417,
-     417,   424,   425,   428,   429,   432,   432,   440,   440,   447,
-     448,   451,   452,   453,   454,   455,   456,   460,   460,   473,
-     473,   486,   486,   497,   497,   504,   505,   508,   508,   516,
-     516,   523,   524,   527,   528,   529,   530,   531,   532,   535,
-     535,   548,   548,   557,   572,   572,   583,   583,   590,   591,
-     594,   595,   598,   598,   606,   606,   615,   616,   619,   620,
-     621,   622,   623,   624,   625,   628,   628,   641,   641,   653,
-     662,   662,   679,   679,   690,   691,   694,   695,   696,   697,
-     698,   701,   701,   710,   710,   721,   721,   734,   735,   739,
-     739,   747,   748,   751,   752,   753,   754,   755,   756,   757,
-     760,   760,   769,   775,   775,   784,   784,   795,   796,   799,
-     799,   807,   808,   811,   812,   813,   814,   815,   818,   818,
-     827,   833,   839,   845,   845
+       0,   125,   125,   125,   126,   126,   127,   127,   128,   128,
+     129,   129,   130,   130,   131,   131,   132,   132,   133,   133,
+     134,   134,   142,   143,   144,   145,   146,   147,   148,   151,
+     156,   156,   167,   170,   171,   174,   179,   187,   187,   194,
+     195,   198,   202,   213,   222,   222,   235,   235,   246,   246,
+     254,   255,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   275,   275,   284,   293,
+     303,   303,   312,   313,   316,   316,   325,   325,   350,   350,
+     377,   377,   388,   388,   399,   400,   403,   404,   407,   408,
+     413,   413,   424,   424,   431,   432,   435,   436,   439,   439,
+     447,   447,   454,   455,   458,   459,   460,   461,   462,   463,
+     467,   467,   480,   480,   493,   493,   504,   504,   511,   512,
+     515,   515,   523,   523,   530,   531,   534,   535,   536,   537,
+     538,   539,   542,   542,   555,   555,   564,   579,   579,   590,
+     590,   597,   598,   601,   602,   605,   605,   613,   613,   622,
+     623,   626,   627,   628,   629,   630,   631,   632,   635,   635,
+     648,   648,   660,   669,   669,   686,   686,   697,   698,   701,
+     702,   703,   704,   705,   708,   708,   717,   717,   728,   728,
+     739,   740,   743,   744,   747,   747,   757,   757,   767,   768,
+     769,   772,   773,   776,   776,   785,   785,   795,   795,   808,
+     809,   813,   813,   821,   822,   825,   826,   827,   828,   829,
+     830,   831,   834,   834,   843,   849,   849,   858,   858,   869,
+     870,   873,   873,   881,   882,   885,   886,   887,   888,   889,
+     892,   892,   901,   907,   913,   919,   919
   };
 
   void
@@ -2554,9 +2691,9 @@ namespace isc { namespace d2 {
 
 #line 14 "d2_parser.yy"
 } } // isc::d2
-#line 2558 "d2_parser.cc"
+#line 2695 "d2_parser.cc"
 
-#line 854 "d2_parser.yy"
+#line 928 "d2_parser.yy"
 
 
 void
index be50fbc2c3dcce9ef57840d3f638f68bceacba35..3a051e75160ad71c3c7fadfe885c3fe5e3b88ad7 100644 (file)
@@ -1,4 +1,4 @@
-// A Bison parser, made by GNU Bison 3.7.5.
+// A Bison parser, made by GNU Bison 3.7.6.
 
 // Skeleton interface for Bison LALR(1) parsers in C++
 
@@ -15,7 +15,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
@@ -512,29 +512,33 @@ namespace isc { namespace d2 {
     TOKEN_CONTROL_SOCKET = 286,    // "control-socket"
     TOKEN_SOCKET_TYPE = 287,       // "socket-type"
     TOKEN_SOCKET_NAME = 288,       // "socket-name"
-    TOKEN_LOGGERS = 289,           // "loggers"
-    TOKEN_NAME = 290,              // "name"
-    TOKEN_OUTPUT_OPTIONS = 291,    // "output_options"
-    TOKEN_OUTPUT = 292,            // "output"
-    TOKEN_DEBUGLEVEL = 293,        // "debuglevel"
-    TOKEN_SEVERITY = 294,          // "severity"
-    TOKEN_FLUSH = 295,             // "flush"
-    TOKEN_MAXSIZE = 296,           // "maxsize"
-    TOKEN_MAXVER = 297,            // "maxver"
-    TOKEN_PATTERN = 298,           // "pattern"
-    TOKEN_TOPLEVEL_JSON = 299,     // TOPLEVEL_JSON
-    TOKEN_TOPLEVEL_DHCPDDNS = 300, // TOPLEVEL_DHCPDDNS
-    TOKEN_SUB_DHCPDDNS = 301,      // SUB_DHCPDDNS
-    TOKEN_SUB_TSIG_KEY = 302,      // SUB_TSIG_KEY
-    TOKEN_SUB_TSIG_KEYS = 303,     // SUB_TSIG_KEYS
-    TOKEN_SUB_DDNS_DOMAIN = 304,   // SUB_DDNS_DOMAIN
-    TOKEN_SUB_DDNS_DOMAINS = 305,  // SUB_DDNS_DOMAINS
-    TOKEN_SUB_DNS_SERVER = 306,    // SUB_DNS_SERVER
-    TOKEN_SUB_DNS_SERVERS = 307,   // SUB_DNS_SERVERS
-    TOKEN_STRING = 308,            // "constant string"
-    TOKEN_INTEGER = 309,           // "integer"
-    TOKEN_FLOAT = 310,             // "floating point"
-    TOKEN_BOOLEAN = 311            // "boolean"
+    TOKEN_HOOKS_LIBRARIES = 289,   // "hooks-libraries"
+    TOKEN_LIBRARY = 290,           // "library"
+    TOKEN_PARAMETERS = 291,        // "parameters"
+    TOKEN_LOGGERS = 292,           // "loggers"
+    TOKEN_NAME = 293,              // "name"
+    TOKEN_OUTPUT_OPTIONS = 294,    // "output_options"
+    TOKEN_OUTPUT = 295,            // "output"
+    TOKEN_DEBUGLEVEL = 296,        // "debuglevel"
+    TOKEN_SEVERITY = 297,          // "severity"
+    TOKEN_FLUSH = 298,             // "flush"
+    TOKEN_MAXSIZE = 299,           // "maxsize"
+    TOKEN_MAXVER = 300,            // "maxver"
+    TOKEN_PATTERN = 301,           // "pattern"
+    TOKEN_TOPLEVEL_JSON = 302,     // TOPLEVEL_JSON
+    TOKEN_TOPLEVEL_DHCPDDNS = 303, // TOPLEVEL_DHCPDDNS
+    TOKEN_SUB_DHCPDDNS = 304,      // SUB_DHCPDDNS
+    TOKEN_SUB_TSIG_KEY = 305,      // SUB_TSIG_KEY
+    TOKEN_SUB_TSIG_KEYS = 306,     // SUB_TSIG_KEYS
+    TOKEN_SUB_DDNS_DOMAIN = 307,   // SUB_DDNS_DOMAIN
+    TOKEN_SUB_DDNS_DOMAINS = 308,  // SUB_DDNS_DOMAINS
+    TOKEN_SUB_DNS_SERVER = 309,    // SUB_DNS_SERVER
+    TOKEN_SUB_DNS_SERVERS = 310,   // SUB_DNS_SERVERS
+    TOKEN_SUB_HOOKS_LIBRARY = 311, // SUB_HOOKS_LIBRARY
+    TOKEN_STRING = 312,            // "constant string"
+    TOKEN_INTEGER = 313,           // "integer"
+    TOKEN_FLOAT = 314,             // "floating point"
+    TOKEN_BOOLEAN = 315            // "boolean"
       };
       /// Backward compatibility alias (Bison 3.6).
       typedef token_kind_type yytokentype;
@@ -551,7 +555,7 @@ namespace isc { namespace d2 {
     {
       enum symbol_kind_type
       {
-        YYNTOKENS = 57, ///< Number of tokens.
+        YYNTOKENS = 61, ///< Number of tokens.
         S_YYEMPTY = -2,
         S_YYEOF = 0,                             // "end of file"
         S_YYerror = 1,                           // error
@@ -587,165 +591,184 @@ namespace isc { namespace d2 {
         S_CONTROL_SOCKET = 31,                   // "control-socket"
         S_SOCKET_TYPE = 32,                      // "socket-type"
         S_SOCKET_NAME = 33,                      // "socket-name"
-        S_LOGGERS = 34,                          // "loggers"
-        S_NAME = 35,                             // "name"
-        S_OUTPUT_OPTIONS = 36,                   // "output_options"
-        S_OUTPUT = 37,                           // "output"
-        S_DEBUGLEVEL = 38,                       // "debuglevel"
-        S_SEVERITY = 39,                         // "severity"
-        S_FLUSH = 40,                            // "flush"
-        S_MAXSIZE = 41,                          // "maxsize"
-        S_MAXVER = 42,                           // "maxver"
-        S_PATTERN = 43,                          // "pattern"
-        S_TOPLEVEL_JSON = 44,                    // TOPLEVEL_JSON
-        S_TOPLEVEL_DHCPDDNS = 45,                // TOPLEVEL_DHCPDDNS
-        S_SUB_DHCPDDNS = 46,                     // SUB_DHCPDDNS
-        S_SUB_TSIG_KEY = 47,                     // SUB_TSIG_KEY
-        S_SUB_TSIG_KEYS = 48,                    // SUB_TSIG_KEYS
-        S_SUB_DDNS_DOMAIN = 49,                  // SUB_DDNS_DOMAIN
-        S_SUB_DDNS_DOMAINS = 50,                 // SUB_DDNS_DOMAINS
-        S_SUB_DNS_SERVER = 51,                   // SUB_DNS_SERVER
-        S_SUB_DNS_SERVERS = 52,                  // SUB_DNS_SERVERS
-        S_STRING = 53,                           // "constant string"
-        S_INTEGER = 54,                          // "integer"
-        S_FLOAT = 55,                            // "floating point"
-        S_BOOLEAN = 56,                          // "boolean"
-        S_YYACCEPT = 57,                         // $accept
-        S_start = 58,                            // start
-        S_59_1 = 59,                             // $@1
-        S_60_2 = 60,                             // $@2
-        S_61_3 = 61,                             // $@3
-        S_62_4 = 62,                             // $@4
-        S_63_5 = 63,                             // $@5
-        S_64_6 = 64,                             // $@6
-        S_65_7 = 65,                             // $@7
-        S_66_8 = 66,                             // $@8
-        S_67_9 = 67,                             // $@9
-        S_value = 68,                            // value
-        S_sub_json = 69,                         // sub_json
-        S_map2 = 70,                             // map2
-        S_71_10 = 71,                            // $@10
-        S_map_value = 72,                        // map_value
-        S_map_content = 73,                      // map_content
-        S_not_empty_map = 74,                    // not_empty_map
-        S_list_generic = 75,                     // list_generic
+        S_HOOKS_LIBRARIES = 34,                  // "hooks-libraries"
+        S_LIBRARY = 35,                          // "library"
+        S_PARAMETERS = 36,                       // "parameters"
+        S_LOGGERS = 37,                          // "loggers"
+        S_NAME = 38,                             // "name"
+        S_OUTPUT_OPTIONS = 39,                   // "output_options"
+        S_OUTPUT = 40,                           // "output"
+        S_DEBUGLEVEL = 41,                       // "debuglevel"
+        S_SEVERITY = 42,                         // "severity"
+        S_FLUSH = 43,                            // "flush"
+        S_MAXSIZE = 44,                          // "maxsize"
+        S_MAXVER = 45,                           // "maxver"
+        S_PATTERN = 46,                          // "pattern"
+        S_TOPLEVEL_JSON = 47,                    // TOPLEVEL_JSON
+        S_TOPLEVEL_DHCPDDNS = 48,                // TOPLEVEL_DHCPDDNS
+        S_SUB_DHCPDDNS = 49,                     // SUB_DHCPDDNS
+        S_SUB_TSIG_KEY = 50,                     // SUB_TSIG_KEY
+        S_SUB_TSIG_KEYS = 51,                    // SUB_TSIG_KEYS
+        S_SUB_DDNS_DOMAIN = 52,                  // SUB_DDNS_DOMAIN
+        S_SUB_DDNS_DOMAINS = 53,                 // SUB_DDNS_DOMAINS
+        S_SUB_DNS_SERVER = 54,                   // SUB_DNS_SERVER
+        S_SUB_DNS_SERVERS = 55,                  // SUB_DNS_SERVERS
+        S_SUB_HOOKS_LIBRARY = 56,                // SUB_HOOKS_LIBRARY
+        S_STRING = 57,                           // "constant string"
+        S_INTEGER = 58,                          // "integer"
+        S_FLOAT = 59,                            // "floating point"
+        S_BOOLEAN = 60,                          // "boolean"
+        S_YYACCEPT = 61,                         // $accept
+        S_start = 62,                            // start
+        S_63_1 = 63,                             // $@1
+        S_64_2 = 64,                             // $@2
+        S_65_3 = 65,                             // $@3
+        S_66_4 = 66,                             // $@4
+        S_67_5 = 67,                             // $@5
+        S_68_6 = 68,                             // $@6
+        S_69_7 = 69,                             // $@7
+        S_70_8 = 70,                             // $@8
+        S_71_9 = 71,                             // $@9
+        S_72_10 = 72,                            // $@10
+        S_value = 73,                            // value
+        S_sub_json = 74,                         // sub_json
+        S_map2 = 75,                             // map2
         S_76_11 = 76,                            // $@11
-        S_list_content = 77,                     // list_content
-        S_not_empty_list = 78,                   // not_empty_list
-        S_unknown_map_entry = 79,                // unknown_map_entry
-        S_syntax_map = 80,                       // syntax_map
+        S_map_value = 77,                        // map_value
+        S_map_content = 78,                      // map_content
+        S_not_empty_map = 79,                    // not_empty_map
+        S_list_generic = 80,                     // list_generic
         S_81_12 = 81,                            // $@12
-        S_global_object = 82,                    // global_object
-        S_83_13 = 83,                            // $@13
-        S_sub_dhcpddns = 84,                     // sub_dhcpddns
-        S_85_14 = 85,                            // $@14
-        S_dhcpddns_params = 86,                  // dhcpddns_params
-        S_dhcpddns_param = 87,                   // dhcpddns_param
-        S_ip_address = 88,                       // ip_address
-        S_89_15 = 89,                            // $@15
-        S_port = 90,                             // port
-        S_dns_server_timeout = 91,               // dns_server_timeout
-        S_ncr_protocol = 92,                     // ncr_protocol
-        S_93_16 = 93,                            // $@16
-        S_ncr_protocol_value = 94,               // ncr_protocol_value
-        S_ncr_format = 95,                       // ncr_format
-        S_96_17 = 96,                            // $@17
-        S_user_context = 97,                     // user_context
-        S_98_18 = 98,                            // $@18
-        S_comment = 99,                          // comment
-        S_100_19 = 100,                          // $@19
-        S_forward_ddns = 101,                    // forward_ddns
-        S_102_20 = 102,                          // $@20
-        S_reverse_ddns = 103,                    // reverse_ddns
-        S_104_21 = 104,                          // $@21
-        S_ddns_mgr_params = 105,                 // ddns_mgr_params
-        S_not_empty_ddns_mgr_params = 106,       // not_empty_ddns_mgr_params
-        S_ddns_mgr_param = 107,                  // ddns_mgr_param
-        S_ddns_domains = 108,                    // ddns_domains
+        S_list_content = 82,                     // list_content
+        S_not_empty_list = 83,                   // not_empty_list
+        S_unknown_map_entry = 84,                // unknown_map_entry
+        S_syntax_map = 85,                       // syntax_map
+        S_86_13 = 86,                            // $@13
+        S_global_object = 87,                    // global_object
+        S_88_14 = 88,                            // $@14
+        S_sub_dhcpddns = 89,                     // sub_dhcpddns
+        S_90_15 = 90,                            // $@15
+        S_dhcpddns_params = 91,                  // dhcpddns_params
+        S_dhcpddns_param = 92,                   // dhcpddns_param
+        S_ip_address = 93,                       // ip_address
+        S_94_16 = 94,                            // $@16
+        S_port = 95,                             // port
+        S_dns_server_timeout = 96,               // dns_server_timeout
+        S_ncr_protocol = 97,                     // ncr_protocol
+        S_98_17 = 98,                            // $@17
+        S_ncr_protocol_value = 99,               // ncr_protocol_value
+        S_ncr_format = 100,                      // ncr_format
+        S_101_18 = 101,                          // $@18
+        S_user_context = 102,                    // user_context
+        S_103_19 = 103,                          // $@19
+        S_comment = 104,                         // comment
+        S_105_20 = 105,                          // $@20
+        S_forward_ddns = 106,                    // forward_ddns
+        S_107_21 = 107,                          // $@21
+        S_reverse_ddns = 108,                    // reverse_ddns
         S_109_22 = 109,                          // $@22
-        S_sub_ddns_domains = 110,                // sub_ddns_domains
-        S_111_23 = 111,                          // $@23
-        S_ddns_domain_list = 112,                // ddns_domain_list
-        S_not_empty_ddns_domain_list = 113,      // not_empty_ddns_domain_list
-        S_ddns_domain = 114,                     // ddns_domain
-        S_115_24 = 115,                          // $@24
-        S_sub_ddns_domain = 116,                 // sub_ddns_domain
-        S_117_25 = 117,                          // $@25
-        S_ddns_domain_params = 118,              // ddns_domain_params
-        S_ddns_domain_param = 119,               // ddns_domain_param
-        S_ddns_domain_name = 120,                // ddns_domain_name
-        S_121_26 = 121,                          // $@26
-        S_ddns_domain_key_name = 122,            // ddns_domain_key_name
-        S_123_27 = 123,                          // $@27
-        S_dns_servers = 124,                     // dns_servers
-        S_125_28 = 125,                          // $@28
-        S_sub_dns_servers = 126,                 // sub_dns_servers
-        S_127_29 = 127,                          // $@29
-        S_dns_server_list = 128,                 // dns_server_list
-        S_dns_server = 129,                      // dns_server
-        S_130_30 = 130,                          // $@30
-        S_sub_dns_server = 131,                  // sub_dns_server
-        S_132_31 = 132,                          // $@31
-        S_dns_server_params = 133,               // dns_server_params
-        S_dns_server_param = 134,                // dns_server_param
-        S_dns_server_hostname = 135,             // dns_server_hostname
-        S_136_32 = 136,                          // $@32
-        S_dns_server_ip_address = 137,           // dns_server_ip_address
-        S_138_33 = 138,                          // $@33
-        S_dns_server_port = 139,                 // dns_server_port
-        S_tsig_keys = 140,                       // tsig_keys
-        S_141_34 = 141,                          // $@34
-        S_sub_tsig_keys = 142,                   // sub_tsig_keys
-        S_143_35 = 143,                          // $@35
-        S_tsig_keys_list = 144,                  // tsig_keys_list
-        S_not_empty_tsig_keys_list = 145,        // not_empty_tsig_keys_list
-        S_tsig_key = 146,                        // tsig_key
-        S_147_36 = 147,                          // $@36
-        S_sub_tsig_key = 148,                    // sub_tsig_key
-        S_149_37 = 149,                          // $@37
-        S_tsig_key_params = 150,                 // tsig_key_params
-        S_tsig_key_param = 151,                  // tsig_key_param
-        S_tsig_key_name = 152,                   // tsig_key_name
-        S_153_38 = 153,                          // $@38
-        S_tsig_key_algorithm = 154,              // tsig_key_algorithm
-        S_155_39 = 155,                          // $@39
-        S_tsig_key_digest_bits = 156,            // tsig_key_digest_bits
-        S_tsig_key_secret = 157,                 // tsig_key_secret
-        S_158_40 = 158,                          // $@40
-        S_control_socket = 159,                  // control_socket
-        S_160_41 = 160,                          // $@41
-        S_control_socket_params = 161,           // control_socket_params
-        S_control_socket_param = 162,            // control_socket_param
-        S_control_socket_type = 163,             // control_socket_type
-        S_164_42 = 164,                          // $@42
-        S_control_socket_name = 165,             // control_socket_name
-        S_166_43 = 166,                          // $@43
-        S_loggers = 167,                         // loggers
-        S_168_44 = 168,                          // $@44
-        S_loggers_entries = 169,                 // loggers_entries
-        S_logger_entry = 170,                    // logger_entry
-        S_171_45 = 171,                          // $@45
-        S_logger_params = 172,                   // logger_params
-        S_logger_param = 173,                    // logger_param
-        S_name = 174,                            // name
-        S_175_46 = 175,                          // $@46
-        S_debuglevel = 176,                      // debuglevel
-        S_severity = 177,                        // severity
-        S_178_47 = 178,                          // $@47
-        S_output_options_list = 179,             // output_options_list
-        S_180_48 = 180,                          // $@48
-        S_output_options_list_content = 181,     // output_options_list_content
-        S_output_entry = 182,                    // output_entry
-        S_183_49 = 183,                          // $@49
-        S_output_params_list = 184,              // output_params_list
-        S_output_params = 185,                   // output_params
-        S_output = 186,                          // output
+        S_ddns_mgr_params = 110,                 // ddns_mgr_params
+        S_not_empty_ddns_mgr_params = 111,       // not_empty_ddns_mgr_params
+        S_ddns_mgr_param = 112,                  // ddns_mgr_param
+        S_ddns_domains = 113,                    // ddns_domains
+        S_114_23 = 114,                          // $@23
+        S_sub_ddns_domains = 115,                // sub_ddns_domains
+        S_116_24 = 116,                          // $@24
+        S_ddns_domain_list = 117,                // ddns_domain_list
+        S_not_empty_ddns_domain_list = 118,      // not_empty_ddns_domain_list
+        S_ddns_domain = 119,                     // ddns_domain
+        S_120_25 = 120,                          // $@25
+        S_sub_ddns_domain = 121,                 // sub_ddns_domain
+        S_122_26 = 122,                          // $@26
+        S_ddns_domain_params = 123,              // ddns_domain_params
+        S_ddns_domain_param = 124,               // ddns_domain_param
+        S_ddns_domain_name = 125,                // ddns_domain_name
+        S_126_27 = 126,                          // $@27
+        S_ddns_domain_key_name = 127,            // ddns_domain_key_name
+        S_128_28 = 128,                          // $@28
+        S_dns_servers = 129,                     // dns_servers
+        S_130_29 = 130,                          // $@29
+        S_sub_dns_servers = 131,                 // sub_dns_servers
+        S_132_30 = 132,                          // $@30
+        S_dns_server_list = 133,                 // dns_server_list
+        S_dns_server = 134,                      // dns_server
+        S_135_31 = 135,                          // $@31
+        S_sub_dns_server = 136,                  // sub_dns_server
+        S_137_32 = 137,                          // $@32
+        S_dns_server_params = 138,               // dns_server_params
+        S_dns_server_param = 139,                // dns_server_param
+        S_dns_server_hostname = 140,             // dns_server_hostname
+        S_141_33 = 141,                          // $@33
+        S_dns_server_ip_address = 142,           // dns_server_ip_address
+        S_143_34 = 143,                          // $@34
+        S_dns_server_port = 144,                 // dns_server_port
+        S_tsig_keys = 145,                       // tsig_keys
+        S_146_35 = 146,                          // $@35
+        S_sub_tsig_keys = 147,                   // sub_tsig_keys
+        S_148_36 = 148,                          // $@36
+        S_tsig_keys_list = 149,                  // tsig_keys_list
+        S_not_empty_tsig_keys_list = 150,        // not_empty_tsig_keys_list
+        S_tsig_key = 151,                        // tsig_key
+        S_152_37 = 152,                          // $@37
+        S_sub_tsig_key = 153,                    // sub_tsig_key
+        S_154_38 = 154,                          // $@38
+        S_tsig_key_params = 155,                 // tsig_key_params
+        S_tsig_key_param = 156,                  // tsig_key_param
+        S_tsig_key_name = 157,                   // tsig_key_name
+        S_158_39 = 158,                          // $@39
+        S_tsig_key_algorithm = 159,              // tsig_key_algorithm
+        S_160_40 = 160,                          // $@40
+        S_tsig_key_digest_bits = 161,            // tsig_key_digest_bits
+        S_tsig_key_secret = 162,                 // tsig_key_secret
+        S_163_41 = 163,                          // $@41
+        S_control_socket = 164,                  // control_socket
+        S_165_42 = 165,                          // $@42
+        S_control_socket_params = 166,           // control_socket_params
+        S_control_socket_param = 167,            // control_socket_param
+        S_control_socket_type = 168,             // control_socket_type
+        S_169_43 = 169,                          // $@43
+        S_control_socket_name = 170,             // control_socket_name
+        S_171_44 = 171,                          // $@44
+        S_hooks_libraries = 172,                 // hooks_libraries
+        S_173_45 = 173,                          // $@45
+        S_hooks_libraries_list = 174,            // hooks_libraries_list
+        S_not_empty_hooks_libraries_list = 175,  // not_empty_hooks_libraries_list
+        S_hooks_library = 176,                   // hooks_library
+        S_177_46 = 177,                          // $@46
+        S_sub_hooks_library = 178,               // sub_hooks_library
+        S_179_47 = 179,                          // $@47
+        S_hooks_params = 180,                    // hooks_params
+        S_hooks_param = 181,                     // hooks_param
+        S_library = 182,                         // library
+        S_183_48 = 183,                          // $@48
+        S_parameters = 184,                      // parameters
+        S_185_49 = 185,                          // $@49
+        S_loggers = 186,                         // loggers
         S_187_50 = 187,                          // $@50
-        S_flush = 188,                           // flush
-        S_maxsize = 189,                         // maxsize
-        S_maxver = 190,                          // maxver
-        S_pattern = 191,                         // pattern
-        S_192_51 = 192                           // $@51
+        S_loggers_entries = 188,                 // loggers_entries
+        S_logger_entry = 189,                    // logger_entry
+        S_190_51 = 190,                          // $@51
+        S_logger_params = 191,                   // logger_params
+        S_logger_param = 192,                    // logger_param
+        S_name = 193,                            // name
+        S_194_52 = 194,                          // $@52
+        S_debuglevel = 195,                      // debuglevel
+        S_severity = 196,                        // severity
+        S_197_53 = 197,                          // $@53
+        S_output_options_list = 198,             // output_options_list
+        S_199_54 = 199,                          // $@54
+        S_output_options_list_content = 200,     // output_options_list_content
+        S_output_entry = 201,                    // output_entry
+        S_202_55 = 202,                          // $@55
+        S_output_params_list = 203,              // output_params_list
+        S_output_params = 204,                   // output_params
+        S_output = 205,                          // output
+        S_206_56 = 206,                          // $@56
+        S_flush = 207,                           // flush
+        S_maxsize = 208,                         // maxsize
+        S_maxver = 209,                          // maxver
+        S_pattern = 210,                         // pattern
+        S_211_57 = 211                           // $@57
       };
     };
 
@@ -1036,7 +1059,7 @@ switch (yykind)
 #endif
       {
         D2_PARSER__ASSERT (tok == token::TOKEN_END
-                   || (token::TOKEN_D2_PARSER_error <= tok && tok <= token::TOKEN_SUB_DNS_SERVERS));
+                   || (token::TOKEN_D2_PARSER_error <= tok && tok <= token::TOKEN_SUB_HOOKS_LIBRARY));
       }
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, bool v, location_type l)
@@ -1636,6 +1659,51 @@ switch (yykind)
         return symbol_type (token::TOKEN_SOCKET_NAME, l);
       }
 #endif
+#if 201103L <= YY_CPLUSPLUS
+      static
+      symbol_type
+      make_HOOKS_LIBRARIES (location_type l)
+      {
+        return symbol_type (token::TOKEN_HOOKS_LIBRARIES, std::move (l));
+      }
+#else
+      static
+      symbol_type
+      make_HOOKS_LIBRARIES (const location_type& l)
+      {
+        return symbol_type (token::TOKEN_HOOKS_LIBRARIES, l);
+      }
+#endif
+#if 201103L <= YY_CPLUSPLUS
+      static
+      symbol_type
+      make_LIBRARY (location_type l)
+      {
+        return symbol_type (token::TOKEN_LIBRARY, std::move (l));
+      }
+#else
+      static
+      symbol_type
+      make_LIBRARY (const location_type& l)
+      {
+        return symbol_type (token::TOKEN_LIBRARY, l);
+      }
+#endif
+#if 201103L <= YY_CPLUSPLUS
+      static
+      symbol_type
+      make_PARAMETERS (location_type l)
+      {
+        return symbol_type (token::TOKEN_PARAMETERS, std::move (l));
+      }
+#else
+      static
+      symbol_type
+      make_PARAMETERS (const location_type& l)
+      {
+        return symbol_type (token::TOKEN_PARAMETERS, l);
+      }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       static
       symbol_type
@@ -1921,6 +1989,21 @@ switch (yykind)
         return symbol_type (token::TOKEN_SUB_DNS_SERVERS, l);
       }
 #endif
+#if 201103L <= YY_CPLUSPLUS
+      static
+      symbol_type
+      make_SUB_HOOKS_LIBRARY (location_type l)
+      {
+        return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, std::move (l));
+      }
+#else
+      static
+      symbol_type
+      make_SUB_HOOKS_LIBRARY (const location_type& l)
+      {
+        return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, l);
+      }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       static
       symbol_type
@@ -2033,7 +2116,7 @@ switch (yykind)
     /// \param yyvalue   the value to check
     static bool yy_table_value_is_error_ (int yyvalue);
 
-    static const signed char yypact_ninf_;
+    static const short yypact_ninf_;
     static const signed char yytable_ninf_;
 
     /// Convert a scanner token kind \a t to a symbol kind.
@@ -2059,7 +2142,7 @@ switch (yykind)
     static const unsigned char yydefact_[];
 
     // YYPGOTO[NTERM-NUM].
-    static const signed char yypgoto_[];
+    static const short yypgoto_[];
 
     // YYDEFGOTO[NTERM-NUM].
     static const short yydefgoto_[];
@@ -2311,9 +2394,9 @@ switch (yykind)
     /// Constants.
     enum
     {
-      yylast_ = 272,     ///< Last index in yytable_.
-      yynnts_ = 136,  ///< Number of nonterminal symbols.
-      yyfinal_ = 20 ///< Termination state number.
+      yylast_ = 304,     ///< Last index in yytable_.
+      yynnts_ = 151,  ///< Number of nonterminal symbols.
+      yyfinal_ = 22 ///< Termination state number.
     };
 
 
@@ -2363,10 +2446,10 @@ switch (yykind)
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56
+      55,    56,    57,    58,    59,    60
     };
     // Last valid token kind.
-    const int code_max = 311;
+    const int code_max = 315;
 
     if (t <= 0)
       return symbol_kind::S_YYEOF;
@@ -2521,7 +2604,7 @@ switch (yykind)
 
 #line 14 "d2_parser.yy"
 } } // isc::d2
-#line 2525 "d2_parser.h"
+#line 2608 "d2_parser.h"
 
 
 
index b8c2f1130766431f088f6716688eed3aa083aafc..60ccd7b255b2b81874903e552738edf5278e7be3 100644 (file)
@@ -1,4 +1,5 @@
-// A Bison parser, made by GNU Bison 3.7.5.
+// Generated 202105262010
+// A Bison parser, made by GNU Bison 3.7.6.
 
 // Locations for Bison parsers in C++
 
@@ -15,7 +16,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
index 2d3317f224c004167e6f0879b37c2dac31d081d6..5bc8f3188d446eb3986057c27531ae020e45fee0 100644 (file)
@@ -1,4 +1,5 @@
-// A Bison parser, made by GNU Bison 3.7.5.
+// Generated 202105262010
+// A Bison parser, made by GNU Bison 3.7.6.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined in "location.hh".
index fe7f93f75b37d0a396f0aa7ba7a81e72e61b5d9d..91a0fb0213e607bd522bb2c12429d3ca14b244fe 100644 (file)
@@ -1,4 +1,5 @@
-// A Bison parser, made by GNU Bison 3.7.5.
+// Generated 202105262010
+// A Bison parser, made by GNU Bison 3.7.6.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined with the parser itself.