]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#665,!460] Implemented support in agent
authorThomas Markwalder <tmark@isc.org>
Thu, 8 Aug 2019 17:50:02 +0000 (13:50 -0400)
committerTomek Mrugalski <tomasz@isc.org>
Wed, 14 Aug 2019 08:57:56 +0000 (10:57 +0200)
doc/examples/agent/simple.json

src/bin/agent/agent_lexer.ll
src/bin/agent/agent_parser.yy

src/bin/agent/agent_lexer.cc
src/bin/agent/agent_parser.cc
src/bin/agent/agent_parser.h
src/bin/agent/location.hh
src/bin/agent/position.hh
src/bin/agent/stack.hh

doc/examples/agent/simple.json
src/bin/agent/agent_lexer.cc
src/bin/agent/agent_lexer.ll
src/bin/agent/agent_parser.cc
src/bin/agent/agent_parser.h
src/bin/agent/agent_parser.yy
src/bin/agent/location.hh
src/bin/agent/position.hh
src/bin/agent/stack.hh

index 7a531c931757880b3217dbc0e5e7daf171e13744..bcdd131fe040abe5ce7686f631f7f8bad235b103 100644 (file)
@@ -83,7 +83,9 @@
                         // kept.
                         "flush": true,
                         "maxsize": 204800,
-                        "maxver": 4
+                        "maxver": 4,
+                        // We use pattern to specify custom log message layout
+                        "pattern": "%d{%y.%m.%d %H:%M:%S.%q} %-5p [%c/%i] %m\n"
                     }
                 ],
                 "severity": "INFO",
index 64f6f3a30fcc065619efaf6ce4ad448695c57d3e..cc1f5e54ed36f00c2c7e0f185e3a6a9b0a367209 100644 (file)
@@ -1,6 +1,6 @@
-#line 1 "agent_lexer.cc"
+#line 2 "agent_lexer.cc"
 
-#line 3 "agent_lexer.cc"
+#line 4 "agent_lexer.cc"
 
 #define  YY_INT_ALIGNED short int
 
@@ -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 58
-#define YY_END_OF_BUFFER 59
+#define YY_NUM_RULES 59
+#define YY_END_OF_BUFFER 60
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,43 +700,44 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[320] =
+static const flex_int16_t yy_accept[326] =
     {   0,
-       51,   51,    0,    0,    0,    0,    0,    0,    0,    0,
-       59,   57,   10,   11,   57,    1,   51,   48,   51,   51,
-       57,   50,   49,   57,   57,   57,   57,   57,   44,   45,
-       57,   57,   57,   46,   47,    5,    5,    5,   57,   57,
-       57,   10,   11,    0,    0,   40,    0,    0,    0,    0,
+       52,   52,    0,    0,    0,    0,    0,    0,    0,    0,
+       60,   58,   10,   11,   58,    1,   52,   49,   52,   52,
+       58,   51,   50,   58,   58,   58,   58,   58,   45,   46,
+       58,   58,   58,   47,   48,    5,    5,    5,   58,   58,
+       58,   10,   11,    0,    0,   41,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    1,   51,   51,    0,   50,   51,    3,    2,    6,
-        0,   51,    0,    0,    0,    0,    0,    0,    4,    0,
-        0,    9,    0,   41,    0,    0,    0,    0,    0,   43,
+        0,    1,   52,   52,    0,   51,   52,    3,    2,    6,
+        0,   52,    0,    0,    0,    0,    0,    0,    4,    0,
+        0,    9,    0,   42,    0,    0,    0,    0,    0,   44,
         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,   42,    0,    0,    0,   20,    0,    0,    0,
+        0,    0,   43,    0,    0,    0,   20,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   56,   54,    0,   53,   52,    0,    0,
+        0,    0,    0,    0,   57,   55,    0,   54,   53,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   55,   52,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   56,   53,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   29,    0,    0,    0,    0,   23,
-
-        0,    0,    0,    0,   37,   38,    0,    0,    0,    0,
-        0,   18,   19,   32,    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,   34,
-       31,    0,    0,    0,    0,    0,    0,    0,   27,   16,
-        0,    0,    0,    0,    0,   25,   28,   33,    0,    0,
-        0,    0,    0,    0,    0,   39,    0,    0,    0,    0,
-        0,    0,    0,   36,    0,    0,    0,    0,    0,    0,
-        0,   13,   14,    0,    0,    0,    0,    0,    0,    0,
-       35,    0,    0,   26,    0,    0,    0,    0,    0,    0,
-
-        0,   21,   22,    0,    0,    0,    0,    0,   15,   12,
-        0,    0,    0,    0,    0,   30,   17,   24,    0
+        0,    0,    0,    0,    0,    0,   29,    0,    0,    0,
+
+        0,    0,   23,    0,    0,    0,    0,   38,   39,    0,
+        0,    0,    0,    0,   18,   19,   32,    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,   34,   31,    0,    0,    0,    0,    0,
+        0,    0,    0,   27,   16,    0,    0,    0,    0,    0,
+       25,   28,   33,    0,    0,   35,    0,    0,    0,    0,
+        0,   40,    0,    0,    0,    0,    0,    0,    0,   37,
+        0,    0,    0,    0,    0,    0,    0,   13,   14,    0,
+        0,    0,    0,    0,    0,    0,   36,    0,    0,   26,
+
+        0,    0,    0,    0,    0,    0,    0,   21,   22,    0,
+        0,    0,    0,    0,   15,   12,    0,    0,    0,    0,
+        0,   30,   17,   24,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -782,89 +783,89 @@ static const YY_CHAR yy_meta[63] =
         3,    3
     } ;
 
-static const flex_int16_t yy_base[332] =
+static const flex_int16_t yy_base[338] =
     {   0,
         0,    0,   61,   64,   67,    0,   65,   69,   49,   66,
-      277, 2102,   86,  269,  129,    0,  124, 2102,  172,  129,
-       84,  178, 2102,  250,   91,   76,   71,   89, 2102, 2102,
-       96,   91,   95, 2102, 2102, 2102,   87,  250,  196,    0,
-      222,  119,  236,  114,  199, 2102,  205,  215,  222,  209,
+      277, 2165,   86,  269,  129,    0,  124, 2165,  172,  129,
+       84,  178, 2165,  250,   91,   76,   71,   89, 2165, 2165,
+       96,   91,   95, 2165, 2165, 2165,   87,  250,  196,    0,
+      222,  119,  236,  114,  199, 2165,  205,  215,  222,  209,
       235,  252,  273,  279,  287,  297,  304,  310,  317,  323,
-      345,    0,  345,  367,  361,  374,  387, 2102,    0, 2102,
-      144,  215,  128,  134,  119,  171,  185,  135, 2102,  172,
-      204, 2102,  161, 2102,  392,  405,  416,  422,  203,  435,
+      345,    0,  345,  367,  361,  374,  387, 2165,    0, 2165,
+      144,  215,  128,  134,  119,  171,  185,  135, 2165,  172,
+      204, 2165,  161, 2165,  392,  405,  416,  422,  203,  435,
       457,  457,  484,  502,  508,  514,  520,  526,  533,  544,
 
       550,  556,  563,  572,  581,  591,  598,  608,    0,  172,
-      199,  209,  212,  221,  219,  149, 2102,    0,  618,  626,
-      633,  167, 2102,  665,  661,  639, 2102,  696,  710,  716,
-      722,  731,  737,  747,  753,  762,  773,  783,  792,  800,
-      810,  827,  242, 2102, 2102,  275, 2102, 2102,  109,    0,
-      835,  847,  854,  887,  873,  884,  915,  930,  937,  950,
-      960,  967,  973,  985,  991,  997, 1008, 1016, 1022, 1034,
-     1043, 1052, 2102, 2102,  122,    0, 1065, 1071, 1078, 1087,
-     1095, 1132, 1101, 1109, 1117, 1131, 1161, 1175, 1181, 1187,
-     1196, 1202, 1211, 1217, 2102, 1223, 1232, 1241, 1258, 2102,
-
-     1279,  109,    0, 1288, 2102, 2102, 1294, 1302, 1314, 1324,
-     1332, 2102, 2102, 2102, 1349, 1355, 1374, 1380, 1386, 1392,
-     1398, 1410, 1416, 1429, 1435, 1447, 2102, 1454, 1460, 1466,
-     1472, 1485, 1491, 1503, 1509, 1515, 1521, 1527, 1534, 2102,
-     2102, 1540, 1551, 1564, 1570, 1576, 1586, 1594, 2102, 2102,
-     1600, 1606, 1612, 1630, 1636, 2102, 2102, 2102, 1643, 1654,
-     1661, 1667, 1673, 1680, 1698, 2102, 1708, 1691, 1715, 1721,
-     1728, 1735, 1743, 2102, 1751, 1759, 1770, 1778, 1786, 1800,
-     1813, 2102, 2102, 1821, 1827, 1835, 1841, 1851, 1857, 1863,
-     2102, 1878, 1887, 2102, 1893, 1899, 1913, 1923, 1934, 1940,
-
-     1948, 2102, 2102, 1954, 1960, 1971, 1978, 1990, 2102, 2102,
-     1998, 2006, 2013, 2021, 2028, 2102, 2102, 2102, 2102, 2063,
-     2068, 2073, 2078, 2083, 2088, 2093, 2096,  132,  128,  121,
-      111
+      199,  209,  212,  221,  219,  149, 2165,    0,  618,  633,
+      639,  167, 2165,  672,  655,  645, 2165,  700,  715,  722,
+      728,  735,  742,  758,  777,  783,  795,  802,  808,  814,
+      820,  826,  851,  242, 2165, 2165,  275, 2165, 2165,  109,
+        0,  863,  871,  877,  910,  912,  937,  954,  960,  967,
+      978,  985,  991,  998, 1004, 1013, 1021, 1035, 1041, 1051,
+     1057, 1063, 1071, 1077, 2165, 2165,  122,    0, 1093, 1101,
+     1112, 1118, 1128, 1165, 1136, 1148, 1163, 1194, 1211, 1217,
+     1224, 1230, 1236, 1242, 1248, 1261, 2165, 1255, 1267, 1278,
+
+     1291, 1285, 2165, 1298,  109,    0, 1315, 2165, 2165, 1321,
+     1333, 1340, 1346, 1356, 2165, 2165, 2165, 1364, 1381, 1387,
+     1399, 1405, 1412, 1418, 1425, 1440, 1449, 1462, 1468, 1475,
+     2165, 1485, 1499, 1505, 1512, 1521, 1527, 1535, 1542, 1548,
+     1557, 1563, 1570, 2165, 2165, 1584, 1601, 1607, 1614, 1620,
+     1626, 1644, 1650, 2165, 2165, 1656, 1662, 1686, 1692, 1699,
+     2165, 2165, 2165, 1705, 1711, 2165, 1717, 1727, 1735, 1742,
+     1757, 2165, 1765, 1772, 1778, 1784, 1802, 1808, 1820, 2165,
+     1826, 1832, 1838, 1844, 1850, 1856, 1863, 2165, 2165, 1875,
+     1891, 1901, 1910, 1916, 1922, 1928, 2165, 1936, 1947, 2165,
+
+     1953, 1959, 1967, 1975, 1984, 1990, 1998, 2165, 2165, 2005,
+     2011, 2026, 2036, 2048, 2165, 2165, 2054, 2061, 2071, 2084,
+     2091, 2165, 2165, 2165, 2165, 2126, 2131, 2136, 2141, 2146,
+     2151, 2156, 2159,  132,  128,  121,  111
     } ;
 
-static const flex_int16_t yy_def[332] =
+static const flex_int16_t yy_def[338] =
     {   0,
-      319,    1,  320,  320,    1,    5,    5,    5,    5,    5,
-      319,  319,  319,  319,  321,  322,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  323,
-      319,  319,  319,  324,  321,  319,  321,  321,  321,  325,
-      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
-      321,  322,  319,  319,  319,  319,  319,  319,  326,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      323,  319,  324,  319,  319,  321,  321,  321,  327,  321,
-      325,  321,  321,  321,  321,  321,  321,  321,  321,  321,
-
-      321,  321,  321,  321,  321,  321,  321,  321,  326,  319,
-      319,  319,  319,  319,  319,  319,  319,  328,  321,  321,
-      321,  327,  319,  325,  321,  321,  319,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
-      321,  321,  319,  319,  319,  319,  319,  319,  319,  329,
-      321,  321,  321,  325,  321,  321,  321,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
-      321,  321,  319,  319,  319,  330,  321,  321,  321,  321,
-      321,  325,  321,  321,  321,  321,  321,  321,  321,  321,
-      321,  321,  321,  321,  319,  321,  321,  321,  321,  319,
-
-      321,  319,  331,  321,  319,  319,  321,  321,  321,  321,
-      321,  319,  319,  319,  321,  321,  321,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  319,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  321,  321,  321,  319,
-      319,  321,  321,  321,  321,  321,  321,  321,  319,  319,
-      321,  321,  321,  321,  321,  319,  319,  319,  321,  321,
-      321,  321,  321,  321,  321,  319,  321,  321,  321,  321,
-      321,  321,  321,  319,  321,  321,  321,  321,  321,  321,
-      321,  319,  319,  321,  321,  321,  321,  321,  321,  321,
-      319,  321,  321,  319,  321,  321,  321,  321,  321,  321,
-
-      321,  319,  319,  321,  321,  321,  321,  321,  319,  319,
-      321,  321,  321,  321,  321,  319,  319,  319,    0,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319
+      325,    1,  326,  326,    1,    5,    5,    5,    5,    5,
+      325,  325,  325,  325,  327,  328,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  329,
+      325,  325,  325,  330,  327,  325,  327,  327,  327,  331,
+      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      327,  328,  325,  325,  325,  325,  325,  325,  332,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      329,  325,  330,  325,  325,  327,  327,  327,  333,  327,
+      331,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+
+      327,  327,  327,  327,  327,  327,  327,  327,  332,  325,
+      325,  325,  325,  325,  325,  325,  325,  334,  327,  327,
+      327,  333,  325,  331,  327,  327,  325,  327,  327,  327,
+      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      327,  327,  327,  325,  325,  325,  325,  325,  325,  325,
+      335,  327,  327,  327,  331,  327,  327,  327,  327,  327,
+      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      327,  327,  327,  327,  325,  325,  325,  336,  327,  327,
+      327,  327,  327,  331,  327,  327,  327,  327,  327,  327,
+      327,  327,  327,  327,  327,  327,  325,  327,  327,  327,
+
+      327,  327,  325,  327,  325,  337,  327,  325,  325,  327,
+      327,  327,  327,  327,  325,  325,  325,  327,  327,  327,
+      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      325,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      327,  327,  327,  325,  325,  327,  327,  327,  327,  327,
+      327,  327,  327,  325,  325,  327,  327,  327,  327,  327,
+      325,  325,  325,  327,  327,  325,  327,  327,  327,  327,
+      327,  325,  327,  327,  327,  327,  327,  327,  327,  325,
+      327,  327,  327,  327,  327,  327,  327,  325,  325,  327,
+      327,  327,  327,  327,  327,  327,  325,  327,  327,  325,
+
+      327,  327,  327,  327,  327,  327,  327,  325,  325,  327,
+      327,  327,  327,  327,  325,  325,  327,  327,  327,  327,
+      327,  325,  325,  325,    0,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325
     } ;
 
-static const flex_int16_t yy_nxt[2165] =
+static const flex_int16_t yy_nxt[2228] =
     {   0,
        12,   13,   14,   13,   12,   15,   16,   12,   17,   18,
        19,   20,   21,   22,   22,   22,   22,   23,   24,   12,
@@ -879,234 +880,241 @@ static const flex_int16_t yy_nxt[2165] =
 
        12,   71,   12,   74,   72,   72,   72,   72,   12,   12,
        12,   12,   39,   73,   12,   83,   12,   73,   75,   84,
-       42,   12,   42,   74,   75,  203,   74,   12,   12,   44,
-       44,   44,  176,   76,   46,   63,  150,   64,   64,   64,
+       42,   12,   42,   74,   75,  206,   74,   12,   12,   44,
+       44,   44,  178,   76,   46,   63,  151,   64,   64,   64,
        64,   75,   67,   67,   67,   67,   77,   78,   85,   65,
-      227,  112,   47,   48,   65,  110,   49,   72,   72,   72,
-       72,  111,  202,   50,  175,   65,   84,  112,   51,   52,
+      231,  112,   47,   48,   65,  110,   49,   72,   72,   72,
+       72,  111,  205,   50,  177,   65,   84,  112,   51,   52,
        65,   53,  123,   54,  112,  110,   55,   56,   57,   58,
        59,  111,   60,   63,   61,   66,   66,   66,   66,   63,
-      115,   66,   66,   66,   66,   85,  149,   65,  110,   44,
+      115,   66,   66,   66,   66,   85,  150,   65,  110,   44,
 
-       44,   44,  143,   65,   46,   44,   44,   44,  123,  117,
+       44,   44,  144,   65,   46,   44,   44,   44,  123,  117,
        46,  116,  111,   65,   90,   44,   44,   44,  113,   65,
-       46,   45,   44,   44,   44,  143,  144,   46,   72,   72,
-       72,   72,  114,   50,  145,   44,   44,   44,   43,   50,
-       46,   82,  143,   45,  145,   80,  144,   45,  144,   50,
-      145,   45,   44,   44,   44,   86,   50,   46,   45,   87,
-      148,   45,   79,   45,   91,  146,   93,  173,  147,   50,
-       70,   43,   88,   44,   44,   44,  319,  319,   46,   44,
-       44,   44,  319,  173,   46,   92,   50,   44,   44,   44,
-      319,  319,   46,   94,  319,  319,   95,   44,   44,   44,
-
-      173,  319,   46,  319,   44,   44,   44,   50,  319,   46,
-       44,   44,   44,   50,  319,   46,  174,   44,   44,   44,
-       96,   50,   46,   44,   44,   44,  319,  319,   46,   97,
-      319,   50,   99,   98,  101,  319,  319,  100,   50,  319,
-      319,  102,  319,  319,   50,   44,   44,   44,  319,  319,
-       46,   50,  319,  319,  104,  319,  319,   50,   67,   67,
-       67,   67,  319,  319,  105,  103,  319,  319,  319,   71,
-       65,   71,  319,  106,   72,   72,   72,   72,   63,   50,
-       64,   64,   64,   64,  319,   63,   65,   66,   66,   66,
-       66,  319,   65,  319,  107,  319,  319,   83,  108,   65,
-
-       67,   67,   67,   67,   83,   44,   44,   44,   65,  319,
-       46,  319,   65,  319,  319,   65,   44,   44,   44,  319,
-      319,   46,   44,   44,   44,  319,   83,   46,   65,  319,
-       83,  319,  319,  319,   83,   44,   44,   44,  319,   50,
-       46,   83,  319,  319,   83,  319,   83,  118,  319,  319,
-       50,  319,  319,  319,  119,  120,   50,   44,   44,   44,
-      319,  319,   46,  319,  319,  121,  319,  319,  319,   50,
-      124,  124,  124,  124,  319,  319,  319,  319,  124,  124,
-      124,  124,  124,  124,   44,   44,   44,  319,  319,  127,
-      319,   50,  319,  319,  124,  124,  124,  124,  124,  124,
-
-      319,  319,   44,   44,   44,  125,  126,   46,   44,   44,
-       44,  319,  319,   46,   44,   44,   44,  319,   50,   46,
-       44,   44,   44,  319,  319,   46,   44,   44,   44,  319,
-      319,   46,  319,   44,   44,   44,   50,  319,   46,  319,
-      128,  319,   50,  319,   44,   44,   44,  129,   50,   46,
-       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
-       50,   46,  319,   44,   44,   44,  319,   50,   46,  130,
-      131,  133,   44,   44,   44,  319,  319,   46,   50,  319,
-      132,   44,   44,   44,   50,  319,   46,  134,  319,  319,
-       50,   44,   44,   44,  319,  319,   46,   50,   44,   44,
-
-       44,  319,  319,   46,  136,  319,   50,  135,   44,   44,
-       44,  319,  319,   46,  319,   50,  319,  137,   44,   44,
-       44,  319,  319,   46,  138,   50,   44,   44,   44,  319,
-      140,   46,   50,   44,   44,   44,  319,  139,   46,   44,
-       44,   44,   50,  141,   46,  319,  319,  319,  319,  142,
-      319,  319,   50,  319,  319,  319,  319,  319,  319,  319,
-       50,   44,   44,   44,  319,  319,   46,   50,  319,  319,
-      319,  319,  151,   50,  319,  319,  153,  152,  154,  154,
-      154,  154,  319,  319,  319,  319,  154,  154,  154,  154,
-      154,  154,  319,  156,  319,   50,   44,   44,   44,  319,
-
-      319,   46,  154,  154,  154,  154,  154,  154,  319,  155,
-       44,   44,   44,  319,  319,   46,   44,   44,   44,  319,
-      319,   46,   44,   44,   44,  319,  319,   46,  319,  319,
-       50,   44,   44,   44,  319,  319,   46,   44,   44,   44,
-      319,  319,   46,  319,   50,  319,  319,   44,   44,   44,
-       50,  157,   46,   44,   44,   44,   50,  319,   46,  319,
-      319,  158,   44,   44,   44,   50,  319,   46,  160,  159,
-      319,   50,  319,   44,   44,   44,  319,  319,   46,  319,
-      319,   50,  161,   44,   44,   44,  319,   50,   46,  162,
-      163,  319,   44,   44,   44,  319,   50,   46,  319,  319,
-
-       44,   44,   44,  166,  319,   46,  164,   50,  319,  165,
-       44,   44,   44,  319,  319,   46,  319,   50,  319,  319,
-      168,  319,  319,  319,  167,  319,   50,   44,   44,   44,
-      319,  319,   46,  169,   50,   44,   44,   44,  319,  319,
-       46,  319,  319,  319,   50,  319,  170,   44,   44,   44,
-      319,  319,   46,  319,   44,   44,   44,  319,  319,   46,
-      319,   50,  178,  179,  319,  319,  319,  171,  319,   50,
-      319,  180,  319,   44,   44,   44,  319,  319,   46,  172,
-      319,   50,  319,  319,   44,   44,   44,  177,   50,   46,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  181,
-
-      182,  182,  182,  182,  319,  319,  319,   50,  182,  182,
-      182,  182,  182,  182,  183,   44,   44,   44,   50,  319,
-       46,  319,  319,  319,  182,  182,  182,  182,  182,  182,
-       44,   44,   44,  319,  319,   46,  184,   44,   44,   44,
-      319,  319,   46,  319,  319,  186,  187,  319,  319,   50,
-       44,   44,   44,  319,  319,   46,  319,  319,  185,  319,
-       44,   44,   44,  319,   50,   46,  319,   44,   44,   44,
-      190,   50,   46,   44,   44,   44,  319,  319,   46,  319,
-      319,  188,  319,  319,   50,   44,   44,   44,  319,  319,
-       46,   44,   44,   44,   50,  319,   46,   44,   44,   44,
-
-      319,   50,  195,  189,  191,  319,  319,   50,   44,   44,
-       44,  319,  319,   46,  192,  319,   44,   44,   44,   50,
-      319,   46,   44,   44,   44,   50,  319,   46,  319,  319,
-      193,   50,  194,  319,   44,   44,   44,  319,  319,   46,
-      319,  319,   50,   44,   44,   44,  319,  319,  200,  319,
-       50,  319,   44,   44,   44,  319,   50,   46,  319,  319,
-      319,  319,  201,  196,  197,   44,   44,   44,   50,  319,
-       46,   44,   44,   44,  198,  199,  205,   50,   44,   44,
-       44,  319,  319,  206,  319,  319,   50,   44,   44,   44,
-      319,  319,   46,  319,  319,   44,   44,   44,  319,   50,
-
-       46,   44,   44,   44,  319,   50,   46,  319,  319,   44,
-       44,   44,   50,  319,   46,  204,  319,   44,   44,   44,
-      319,   50,   46,  319,  319,  319,  319,  207,  319,   50,
-      319,   44,   44,   44,  319,   50,  212,  319,  319,  319,
-      319,  319,  319,   50,  208,   45,   45,   45,   45,  319,
-      209,   50,  319,   45,   45,   45,   45,   45,   45,  210,
-      319,   44,   44,   44,  211,   50,  213,  319,  319,   45,
-       45,   45,   45,   45,   45,   44,   44,   44,  319,  319,
-      214,   44,   44,   44,  319,  319,   46,   44,   44,   44,
-      319,  215,   46,  319,  319,   50,   44,   44,   44,  319,
-
-      319,   46,   44,   44,   44,  319,  319,   46,  319,   50,
-      319,   44,   44,   44,  319,   50,   46,   44,   44,   44,
-      319,   50,   46,   44,   44,   44,  319,  319,   46,  319,
-       50,  216,   44,   44,   44,  319,   50,   46,  217,  319,
-      319,   44,   44,   44,  319,   50,   46,  319,  218,  319,
-      319,   50,  319,  319,  219,  319,  319,   50,   44,   44,
-       44,  319,  319,   46,  319,  319,   50,  319,  319,  221,
-      220,  319,  319,  223,  319,   50,  319,  222,  319,   44,
-       44,   44,  319,  319,   46,  319,  224,  319,   44,   44,
-       44,  319,   50,   46,   44,   44,   44,  319,  319,   46,
-
-      319,  319,   44,   44,   44,  319,  319,   46,  319,  319,
-      319,  319,  225,   50,   44,   44,   44,  319,  226,   46,
-      319,  319,   50,  319,   44,   44,   44,  319,   50,   46,
-      319,  319,   44,   44,   44,  228,   50,   46,  319,  319,
-      319,  319,  319,  229,  319,  230,  319,  319,   50,   44,
-       44,   44,  319,  319,   46,   44,   44,   44,   50,  319,
-       46,  319,  319,  319,  319,  319,   50,  319,  231,  319,
-      319,  232,  319,  233,   44,   44,   44,  319,  319,   46,
-       44,   44,   44,   50,  319,   46,   44,   44,   44,   50,
-      319,   46,   44,   44,   44,  319,  234,   46,   44,   44,
-
-       44,  319,  319,  240,  319,  235,  319,  319,   50,  319,
-       44,   44,   44,  319,   50,  241,   44,   44,   44,  319,
-       50,   46,  319,  319,  236,  319,   50,  319,  319,   44,
-       44,   44,   50,  239,   46,   44,   44,   44,  237,  238,
-       46,  319,  319,  319,   50,  245,  242,   44,   44,   44,
-       50,  319,   46,  319,   44,   44,   44,  319,  319,   46,
-       44,   44,   44,   50,  247,   46,   44,   44,   44,   50,
-      243,  249,   44,   44,   44,  319,  319,  250,  319,  319,
-      319,   50,  319,  244,  319,   44,   44,   44,   50,  319,
-       46,   44,   44,   44,   50,  251,   46,  246,  319,  319,
-
-       50,  319,  319,   44,   44,   44,   50,  319,   46,   44,
-       44,   44,  319,  248,   46,   44,   44,   44,  319,   50,
-       46,   44,   44,   44,  319,   50,  256,   44,   44,   44,
-      319,  319,  257,  319,   44,   44,   44,   50,  319,  258,
-       44,   44,   44,   50,  319,   46,  319,  252,  253,   50,
-      319,   44,   44,   44,  319,   50,   46,  319,  319,  319,
-      319,   50,  254,  319,   44,   44,   44,  255,   50,   46,
-       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
-      319,   46,  319,  319,  319,   50,   44,   44,   44,  319,
-      259,   46,  260,  319,   44,   44,   44,  319,   50,  266,
-
-       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
-       50,   46,   44,   44,   44,  319,  319,   46,  319,  262,
-       50,  319,  261,  265,  263,  264,  319,  319,   50,  319,
-       44,   44,   44,  319,   50,   46,   44,   44,   44,  319,
-       50,   46,  319,   44,   44,   44,   50,  268,   46,  319,
-      269,  319,  319,  267,   44,   44,   44,  319,  319,   46,
-      319,   44,   44,   44,   50,  319,  274,   44,   44,   44,
-       50,  319,   46,   44,   44,   44,  319,   50,   46,  319,
-       44,   44,   44,  319,  270,   46,  319,  319,   50,  319,
-      271,   44,   44,   44,  272,   50,   46,  319,   44,   44,
-
-       44,   50,  319,   46,  275,  319,  273,   50,   44,   44,
-       44,  319,  319,   46,   50,   44,   44,   44,  319,  319,
-       46,   44,   44,   44,  319,   50,  282,  319,   44,   44,
-       44,  276,   50,  283,  277,   44,   44,   44,  280,  319,
-       46,  278,   50,   44,   44,   44,  319,  319,   46,   50,
-      319,   44,   44,   44,  319,   50,   46,  319,  279,   44,
-       44,   44,   50,  319,   46,  319,  319,  281,  319,   50,
-       44,   44,   44,  319,  319,   46,  319,   50,   44,   44,
-       44,  319,  319,   46,  319,   50,   44,   44,   44,  284,
-      319,   46,  319,   50,  319,  319,  285,  319,  319,  286,
-
-       44,   44,   44,  319,   50,  291,  319,  319,  319,  319,
-      287,  288,   50,   44,   44,   44,  319,  319,   46,  289,
-       50,   44,   44,   44,  319,  290,   46,   44,   44,   44,
-      319,  319,  294,  319,   50,   44,   44,   44,  319,  319,
-       46,   44,   44,   44,  319,  319,   46,   50,  319,  319,
-      292,   44,   44,   44,  319,   50,   46,   44,   44,   44,
-      319,   50,   46,   44,   44,   44,  293,  319,   46,   50,
-      319,  319,  319,  319,  319,   50,  295,  319,   44,   44,
-       44,  319,  296,   46,  319,   50,  319,   44,   44,   44,
-      319,   50,   46,   44,   44,   44,  319,   50,  302,   44,
-
-       44,   44,  319,  319,  303,  319,  298,  319,  297,  299,
-      319,  319,   50,   44,   44,   44,  319,  319,   46,  319,
-      319,   50,  319,   44,   44,   44,  319,   50,   46,  319,
-      300,  319,  319,   50,   44,   44,   44,  301,  319,   46,
-       44,   44,   44,  319,  319,   46,  319,   50,   44,   44,
-       44,  319,  319,   46,   44,   44,   44,   50,  319,  309,
-       44,   44,   44,  319,  319,  310,  319,  304,   50,  319,
-      319,   44,   44,   44,   50,  306,   46,  305,   44,   44,
-       44,  319,   50,   46,  319,  307,  319,  319,   50,  319,
-       44,   44,   44,  319,   50,   46,  319,  308,   44,   44,
-
-       44,  319,  319,   46,  319,   50,   44,   44,   44,  319,
-      319,   46,   50,   44,   44,   44,  319,  319,  316,  312,
-      319,   44,   44,   44,   50,  311,  317,  319,   44,   44,
-       44,  319,   50,  318,  319,  319,  319,  319,  319,  319,
-       50,  319,  319,  313,  319,  319,  319,   50,  319,  319,
-      319,  314,  319,  319,  319,   50,  319,  319,  319,  315,
-      319,  319,   50,   36,   36,   36,   36,   36,   45,   45,
-       45,   45,   45,   62,  319,   62,   62,   62,   81,  319,
-       81,  319,   81,   83,   83,   83,   83,   83,   89,   89,
-       89,   89,   89,  109,  319,  109,  109,  109,  122,  122,
-
-      122,   11,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319
+       46,   45,   44,   44,   44,  144,  145,   46,   72,   72,
+       72,   72,  114,   50,  146,   44,   44,   44,   43,   50,
+       46,   82,  144,   45,  146,   80,  145,   45,  145,   50,
+      146,   45,   44,   44,   44,   86,   50,   46,   45,   87,
+      149,   45,   79,   45,   91,  147,   93,  175,  148,   50,
+       70,   43,   88,   44,   44,   44,  325,  325,   46,   44,
+       44,   44,  325,  175,   46,   92,   50,   44,   44,   44,
+      325,  325,   46,   94,  325,  325,   95,   44,   44,   44,
+
+      175,  325,   46,  325,   44,   44,   44,   50,  325,   46,
+       44,   44,   44,   50,  325,   46,  176,   44,   44,   44,
+       96,   50,   46,   44,   44,   44,  325,  325,   46,   97,
+      325,   50,   99,   98,  101,  325,  325,  100,   50,  325,
+      325,  102,  325,  325,   50,   44,   44,   44,  325,  325,
+       46,   50,  325,  325,  104,  325,  325,   50,   67,   67,
+       67,   67,  325,  325,  105,  103,  325,  325,  325,   71,
+       65,   71,  325,  106,   72,   72,   72,   72,   63,   50,
+       64,   64,   64,   64,  325,   63,   65,   66,   66,   66,
+       66,  325,   65,  325,  107,  325,  325,   83,  108,   65,
+
+       67,   67,   67,   67,   83,   44,   44,   44,   65,  325,
+       46,  325,   65,  325,  325,   65,   44,   44,   44,  325,
+      325,   46,   44,   44,   44,  325,   83,   46,   65,  325,
+       83,  325,  325,  325,   83,   44,   44,   44,  325,   50,
+       46,   83,  325,  325,   83,  325,   83,  118,  325,  325,
+       50,  325,  325,  325,  119,  120,   50,   44,   44,   44,
+      325,  325,   46,  325,  325,  121,  325,  325,  325,   50,
+      124,  124,  124,  124,  325,  325,  325,  325,  124,  124,
+      124,  124,  124,  124,   44,   44,   44,  325,  325,  127,
+      325,   50,  325,  325,  124,  124,  124,  124,  124,  124,
+
+      325,  325,   44,   44,   44,  125,  126,   46,   44,   44,
+       44,  325,  325,   46,   44,   44,   44,  325,   50,   46,
+       44,   44,   44,  325,  325,   46,   44,   44,   44,  325,
+      325,   46,  325,   44,   44,   44,   50,  325,   46,  325,
+      128,  325,   50,  325,   44,   44,   44,  129,   50,   46,
+       44,   44,   44,  325,   50,   46,   44,   44,   44,  325,
+       50,   46,  325,   44,   44,   44,  325,   50,   46,  130,
+      131,  133,   44,   44,   44,  325,  325,   46,   50,  325,
+      132,   44,   44,   44,   50,  325,   46,  134,  325,  325,
+       50,   44,   44,   44,  325,  325,   46,   50,   44,   44,
+
+       44,  325,  325,   46,  136,  325,   50,  135,   44,   44,
+       44,  325,  325,   46,  325,   50,  325,  137,   44,   44,
+       44,  325,  325,   46,  138,   50,  139,  325,  325,  325,
+      141,  325,   50,   44,   44,   44,  325,  140,   46,   44,
+       44,   44,   50,  142,   46,   44,   44,   44,  325,  143,
+       46,  325,   50,  325,  325,   44,   44,   44,  325,  325,
+       46,  325,  325,  325,  325,  325,  325,   50,  325,  325,
+      325,  325,  152,   50,  325,  325,  325,  325,  325,   50,
+      325,  325,  154,  325,  153,  155,  155,  155,  155,   50,
+      325,  325,  325,  155,  155,  155,  155,  155,  155,  157,
+
+       44,   44,   44,  156,  325,   46,  325,  325,  325,  155,
+      155,  155,  155,  155,  155,   44,   44,   44,  325,  325,
+       46,  325,   44,   44,   44,  325,  325,   46,   44,   44,
+       44,  325,  325,   46,   50,   44,   44,   44,  325,  325,
+       46,  325,   44,   44,   44,  325,  325,   46,  325,   50,
+      325,  325,  325,  325,  325,  158,   50,  325,   44,   44,
+       44,  325,   50,   46,  325,  325,  159,  325,  325,   50,
+      325,  325,  325,  325,  161,  160,   50,   44,   44,   44,
+      325,  325,   46,   44,   44,   44,  162,  325,   46,  325,
+      325,  325,   50,  325,  163,   44,   44,   44,  325,  325,
+
+       46,  164,   44,   44,   44,  325,  325,   46,   44,   44,
+       44,   50,  325,   46,   44,   44,   44,   50,  325,   46,
+       44,   44,   44,  325,  167,   46,   44,   44,   44,   50,
+      165,   46,  325,  166,  325,  325,   50,  325,  325,  169,
+      325,  325,   50,  325,  325,  325,  168,  325,   50,  325,
+      325,   44,   44,   44,   50,  171,   46,  325,  325,  325,
+       50,  325,  170,   44,   44,   44,  172,  325,   46,  325,
+      325,   44,   44,   44,  325,  325,   46,   44,   44,   44,
+      325,  325,   46,  173,  325,   50,  180,  181,  325,  325,
+      325,  325,  325,  325,  325,  182,  325,   50,  325,  325,
+
+      325,  325,  325,  174,  325,   50,  325,  325,  325,  325,
+      325,   50,   44,   44,   44,  179,  325,   46,  325,  325,
+      325,  325,  183,  184,  184,  184,  184,  325,  325,  325,
+      325,  184,  184,  184,  184,  184,  184,   44,   44,   44,
+      325,  325,   46,  325,  325,  325,   50,  184,  184,  184,
+      184,  184,  184,  185,   44,   44,   44,  325,  325,   46,
+       44,   44,   44,  325,  325,   46,  325,   44,   44,   44,
+      325,   50,   46,  325,  325,  188,  189,  325,   44,   44,
+       44,  325,  325,   46,  325,   44,   44,   44,   50,  186,
+       46,   44,   44,   44,   50,  192,   46,  187,   44,   44,
+
+       44,   50,  325,   46,   44,   44,   44,  325,  325,   46,
+      325,  190,   50,   44,   44,   44,  325,  325,   46,   50,
+      325,   44,   44,   44,  325,   50,  197,  325,  193,  325,
+      325,  191,   50,  325,  325,   44,   44,   44,   50,  194,
+       46,   44,   44,   44,  325,  325,   46,   50,  325,  195,
+      325,   44,   44,   44,  196,   50,   46,   44,   44,   44,
+      325,  325,   46,   44,   44,   44,  325,  325,   46,   50,
+      325,   44,   44,   44,  325,   50,  203,   44,   44,   44,
+      325,  325,   46,  325,  325,   50,  325,  204,  325,  199,
+      198,   50,  200,   44,   44,   44,  325,   50,   46,  325,
+
+      325,   44,   44,   44,  202,   50,  208,  325,  325,  201,
+      325,   50,   44,   44,   44,  325,  325,  209,   44,   44,
+       44,  325,  325,   46,  325,  325,  325,   50,   44,   44,
+       44,  325,  325,   46,  325,   50,   44,   44,   44,  325,
+      325,   46,  325,  207,  325,  325,   50,  325,   44,   44,
+       44,  325,   50,   46,  325,  325,  325,  325,  210,  325,
+      325,  325,   50,   44,   44,   44,  325,  325,   46,  325,
+       50,  325,  325,  325,  325,  325,  325,  211,   45,   45,
+       45,   45,   50,  325,  325,  212,   45,   45,   45,   45,
+       45,   45,  325,  325,   44,   44,   44,   50,  213,  215,
+
+      325,  325,   45,   45,   45,   45,   45,   45,  325,  325,
+      214,   44,   44,   44,  325,  325,  216,   44,   44,   44,
+      325,  325,  217,  325,   44,   44,   44,  325,   50,   46,
+       44,   44,   44,  325,  218,   46,   44,   44,   44,  325,
+      325,   46,   44,   44,   44,   50,  325,   46,   44,   44,
+       44,   50,  325,   46,  325,   44,   44,   44,   50,  325,
+       46,   44,   44,   44,   50,  325,   46,   44,   44,   44,
+       50,  325,   46,  325,  219,  325,   50,  325,   44,   44,
+       44,  220,   50,   46,  325,   44,   44,   44,  221,   50,
+       46,   44,   44,   44,  222,   50,   46,  325,   44,   44,
+
+       44,   50,  325,   46,  325,  325,  325,  223,  226,  225,
+      325,  325,   50,  224,  325,   44,   44,   44,  325,   50,
+       46,   44,   44,   44,  325,   50,   46,  325,  325,  325,
+      227,  325,   50,   44,   44,   44,  228,  230,   46,  229,
+       44,   44,   44,  325,  325,   46,   44,   44,   44,   50,
+      325,   46,  325,  325,  325,   50,   44,   44,   44,  325,
+      325,   46,  232,  325,   44,   44,   44,   50,  325,   46,
+      233,  325,  325,  325,   50,  325,  234,  325,  325,  325,
+       50,   44,   44,   44,  325,  325,   46,   44,   44,   44,
+       50,  325,   46,  236,  235,  325,  325,  237,   50,   44,
+
+       44,   44,  325,  325,   46,   44,   44,   44,  325,  325,
+       46,  238,   44,   44,   44,   50,  325,   46,   44,   44,
+       44,   50,  325,  244,  325,   44,   44,   44,  325,  325,
+      245,  239,  325,   50,  325,  325,  325,  240,  325,   50,
+       44,   44,   44,  325,  325,   46,   50,  325,  325,   44,
+       44,   44,   50,  243,   46,  325,  325,  241,  242,   50,
+      325,  246,   44,   44,   44,  325,  325,   46,   44,   44,
+       44,  325,  325,   46,   50,   44,   44,   44,  250,  325,
+       46,  325,  325,   50,  325,   44,   44,   44,  325,  325,
+       46,  325,  325,  325,  247,  252,   50,  325,  248,   44,
+
+       44,   44,   50,  325,   46,   44,   44,   44,  325,   50,
+      254,  325,   44,   44,   44,  325,  249,  255,  325,   50,
+      325,   44,   44,   44,  325,  251,   46,   44,   44,   44,
+      325,  256,   46,   50,  325,   44,   44,   44,  325,   50,
+       46,  325,   44,   44,   44,  325,   50,   46,   44,   44,
+       44,  325,  253,   46,  325,   50,  325,   44,   44,   44,
+      325,   50,  261,   44,   44,   44,  325,  325,  262,   50,
+       44,   44,   44,  325,  325,  263,   50,  325,  325,  325,
+      258,  325,   50,  257,   44,   44,   44,  325,  325,   46,
+      325,   50,  325,  325,  325,  259,  325,   50,  325,  325,
+
+      260,   44,   44,   44,   50,  325,   46,   44,   44,   44,
+      325,  325,  266,  325,   44,   44,   44,  325,   50,   46,
+       44,   44,   44,  325,  325,   46,   44,   44,   44,  325,
+      325,   46,  325,  325,  264,   50,  325,  325,  325,  325,
+      325,   50,  265,  325,   44,   44,   44,  325,   50,   46,
+       44,   44,   44,  325,   50,  272,   44,   44,   44,  325,
+       50,   46,   44,   44,   44,  325,  325,   46,  325,  268,
+      325,  325,  267,  325,  269,  270,  325,  325,   50,  325,
+      325,  271,  325,  325,   50,  325,   44,   44,   44,  325,
+       50,   46,   44,   44,   44,  325,   50,   46,  325,   44,
+
+       44,   44,  325,  274,   46,   44,   44,   44,  325,  273,
+       46,   44,   44,   44,  325,  325,   46,   44,   44,   44,
+       50,  325,  280,  325,  275,  325,   50,   44,   44,   44,
+      325,  325,   46,   50,  325,   44,   44,   44,  325,   50,
+       46,  325,   44,   44,   44,   50,  276,   46,  325,  325,
+      325,   50,  325,  277,  325,  325,  278,   44,   44,   44,
+      325,   50,   46,  279,  281,   44,   44,   44,  325,   50,
+       46,  325,   44,   44,   44,  325,   50,   46,   44,   44,
+       44,  325,  325,   46,   44,   44,   44,  325,  325,  288,
+      325,   50,  325,  282,  325,  325,  283,  325,  325,   50,
+
+      284,  325,   44,   44,   44,  325,   50,  289,   44,   44,
+       44,  325,   50,   46,  325,  285,  325,  325,   50,  286,
+       44,   44,   44,  325,  325,   46,   44,   44,   44,  325,
+      287,   46,   44,   44,   44,  325,   50,   46,   44,   44,
+       44,  325,   50,   46,   44,   44,   44,  325,  325,   46,
+       44,   44,   44,  325,   50,   46,   44,   44,   44,  325,
+       50,  297,  290,   44,   44,   44,   50,  325,   46,  325,
+      325,  325,   50,  291,  292,   44,   44,   44,   50,  294,
+       46,  325,  325,  293,   50,  295,  325,  325,  325,  296,
+       50,   44,   44,   44,  325,  325,  300,   50,  325,  325,
+
+      298,   44,   44,   44,  325,  325,   46,  325,  325,   50,
+       44,   44,   44,  325,  325,   46,   44,   44,   44,  325,
+      299,   46,   44,   44,   44,   50,  325,   46,   44,   44,
+       44,  325,  325,   46,  325,   50,   44,   44,   44,  325,
+      325,   46,  301,  325,   50,  325,  325,   44,   44,   44,
+       50,  302,   46,   44,   44,   44,   50,  325,  308,   44,
+       44,   44,   50,  325,  309,  325,  325,   44,   44,   44,
+       50,  304,   46,  303,  305,   44,   44,   44,  325,  325,
+       46,   50,  325,  325,   44,   44,   44,   50,  306,   46,
+       44,   44,   44,   50,  325,   46,  325,  307,   44,   44,
+
+       44,   50,  325,   46,  325,   44,   44,   44,  325,   50,
+      315,   44,   44,   44,  325,  325,  316,  325,   50,  325,
+      325,  310,  325,  325,   50,  312,   44,   44,   44,  311,
+      325,   46,   50,  325,  325,  313,   44,   44,   44,   50,
+      325,   46,  325,  325,  325,   50,  325,  314,   44,   44,
+       44,  325,  325,   46,   44,   44,   44,  325,  325,   46,
+       50,   44,   44,   44,  325,  325,   46,  325,  325,  325,
+       50,   44,   44,   44,  325,  325,  322,  318,  325,  325,
+      317,  325,   50,  325,   44,   44,   44,  325,   50,  323,
+      325,   44,   44,   44,  325,   50,  324,  325,  325,  325,
+
+      325,  319,  325,  325,  325,   50,  325,  320,  325,  325,
+      325,  325,  325,  325,  321,  325,  325,  325,   50,  325,
+      325,  325,  325,  325,  325,   50,   36,   36,   36,   36,
+       36,   45,   45,   45,   45,   45,   62,  325,   62,   62,
+       62,   81,  325,   81,  325,   81,   83,   83,   83,   83,
+       83,   89,   89,   89,   89,   89,  109,  325,  109,  109,
+      109,  122,  122,  122,   11,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325
     } ;
 
-static const flex_int16_t yy_chk[2165] =
+static const flex_int16_t yy_chk[2228] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1120,12 +1128,12 @@ static const flex_int16_t yy_chk[2165] =
        37,   21,    5,    5,    9,    5,   21,   26,    5,   25,
 
         5,   25,    5,   27,   25,   25,   25,   25,    5,    5,
-        7,   10,    5,   26,    8,  331,    5,   31,   28,   44,
-       42,    5,   42,   32,   33,  330,   27,    5,    5,   15,
-       15,   15,  329,   31,   15,   17,  328,   17,   17,   17,
+        7,   10,    5,   26,    8,  337,    5,   31,   28,   44,
+       42,    5,   42,   32,   33,  336,   27,    5,    5,   15,
+       15,   15,  335,   31,   15,   17,  334,   17,   17,   17,
        17,   28,   20,   20,   20,   20,   32,   33,   44,   17,
-      202,   75,   15,   15,   20,   73,   15,   71,   71,   71,
-       71,   74,  175,   15,  149,   17,   83,   78,   15,   15,
+      205,   75,   15,   15,   20,   73,   15,   71,   71,   71,
+       71,   74,  177,   15,  150,   17,   83,   78,   15,   15,
        20,   15,  122,   15,   75,   73,   15,   15,   15,   15,
        15,   74,   15,   19,   15,   19,   19,   19,   19,   22,
        78,   22,   22,   22,   22,   83,  116,   19,   76,   45,
@@ -1136,13 +1144,13 @@ static const flex_int16_t yy_chk[2165] =
        72,   72,   77,   45,  112,   51,   51,   51,   43,   47,
        51,   41,  113,   50,  115,   39,  111,   50,  114,   48,
       112,   50,   52,   52,   52,   47,   49,   52,   50,   48,
-      115,   50,   38,   50,   50,  113,   52,  143,  114,   51,
+      115,   50,   38,   50,   50,  113,   52,  144,  114,   51,
        24,   14,   49,   53,   53,   53,   11,    0,   53,   54,
-       54,   54,    0,  143,   54,   51,   52,   55,   55,   55,
+       54,   54,    0,  144,   54,   51,   52,   55,   55,   55,
         0,    0,   55,   52,    0,    0,   52,   56,   56,   56,
 
-      146,    0,   56,    0,   57,   57,   57,   53,    0,   57,
-       58,   58,   58,   54,    0,   58,  146,   59,   59,   59,
+      147,    0,   56,    0,   57,   57,   57,   53,    0,   57,
+       58,   58,   58,   54,    0,   58,  147,   59,   59,   59,
        53,   55,   59,   60,   60,   60,    0,    0,   60,   54,
         0,   56,   55,   54,   56,    0,    0,   55,   57,    0,
         0,   57,    0,    0,   58,   61,   61,   61,    0,    0,
@@ -1176,176 +1184,183 @@ static const flex_int16_t yy_chk[2165] =
 
       107,    0,    0,  107,  102,    0,  104,  101,  108,  108,
       108,    0,    0,  108,    0,  105,    0,  103,  119,  119,
-      119,    0,    0,  119,  104,  106,  120,  120,  120,    0,
-      106,  120,  107,  121,  121,  121,    0,  105,  121,  126,
-      126,  126,  108,  107,  126,    0,    0,    0,    0,  108,
-        0,    0,  119,    0,    0,    0,    0,    0,    0,    0,
-      120,  125,  125,  125,    0,    0,  125,  121,    0,    0,
-        0,    0,  119,  126,    0,    0,  121,  120,  124,  124,
-      124,  124,    0,    0,    0,    0,  124,  124,  124,  124,
-      124,  124,    0,  126,    0,  125,  128,  128,  128,    0,
-
-        0,  128,  124,  124,  124,  124,  124,  124,    0,  125,
-      129,  129,  129,    0,    0,  129,  130,  130,  130,    0,
-        0,  130,  131,  131,  131,    0,    0,  131,    0,    0,
-      128,  132,  132,  132,    0,    0,  132,  133,  133,  133,
-        0,    0,  133,    0,  129,    0,    0,  134,  134,  134,
-      130,  128,  134,  135,  135,  135,  131,    0,  135,    0,
-        0,  129,  136,  136,  136,  132,    0,  136,  131,  130,
-        0,  133,    0,  137,  137,  137,    0,    0,  137,    0,
-        0,  134,  132,  138,  138,  138,    0,  135,  138,  133,
-      134,    0,  139,  139,  139,    0,  136,  139,    0,    0,
-
-      140,  140,  140,  136,    0,  140,  135,  137,    0,  135,
-      141,  141,  141,    0,    0,  141,    0,  138,    0,    0,
-      138,    0,    0,    0,  137,    0,  139,  142,  142,  142,
-        0,    0,  142,  139,  140,  151,  151,  151,    0,    0,
-      151,    0,    0,    0,  141,    0,  140,  152,  152,  152,
-        0,    0,  152,    0,  153,  153,  153,    0,    0,  153,
-        0,  142,  152,  152,    0,    0,    0,  141,    0,  151,
-        0,  152,    0,  155,  155,  155,    0,    0,  155,  142,
-        0,  152,    0,    0,  156,  156,  156,  151,  153,  156,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  153,
-
-      154,  154,  154,  154,    0,    0,    0,  155,  154,  154,
-      154,  154,  154,  154,  155,  157,  157,  157,  156,    0,
-      157,    0,    0,    0,  154,  154,  154,  154,  154,  154,
-      158,  158,  158,    0,    0,  158,  156,  159,  159,  159,
-        0,    0,  159,    0,    0,  158,  158,    0,    0,  157,
-      160,  160,  160,    0,    0,  160,    0,    0,  157,    0,
-      161,  161,  161,    0,  158,  161,    0,  162,  162,  162,
-      161,  159,  162,  163,  163,  163,    0,    0,  163,    0,
-        0,  159,    0,    0,  160,  164,  164,  164,    0,    0,
-      164,  165,  165,  165,  161,    0,  165,  166,  166,  166,
-
-        0,  162,  166,  160,  162,    0,    0,  163,  167,  167,
-      167,    0,    0,  167,  163,    0,  168,  168,  168,  164,
-        0,  168,  169,  169,  169,  165,    0,  169,    0,    0,
-      164,  166,  165,    0,  170,  170,  170,    0,    0,  170,
-        0,    0,  167,  171,  171,  171,    0,    0,  171,    0,
-      168,    0,  172,  172,  172,    0,  169,  172,    0,    0,
-        0,    0,  172,  167,  168,  177,  177,  177,  170,    0,
-      177,  178,  178,  178,  169,  170,  178,  171,  179,  179,
-      179,    0,    0,  179,    0,    0,  172,  180,  180,  180,
-        0,    0,  180,    0,    0,  181,  181,  181,    0,  177,
-
-      181,  183,  183,  183,    0,  178,  183,    0,    0,  184,
-      184,  184,  179,    0,  184,  177,    0,  185,  185,  185,
-        0,  180,  185,    0,    0,    0,    0,  180,    0,  181,
-        0,  186,  186,  186,    0,  183,  186,    0,    0,    0,
-        0,    0,    0,  184,  181,  182,  182,  182,  182,    0,
-      183,  185,    0,  182,  182,  182,  182,  182,  182,  184,
-        0,  187,  187,  187,  185,  186,  187,    0,    0,  182,
-      182,  182,  182,  182,  182,  188,  188,  188,    0,    0,
-      188,  189,  189,  189,    0,    0,  189,  190,  190,  190,
-        0,  189,  190,    0,    0,  187,  191,  191,  191,    0,
-
-        0,  191,  192,  192,  192,    0,    0,  192,    0,  188,
-        0,  193,  193,  193,    0,  189,  193,  194,  194,  194,
-        0,  190,  194,  196,  196,  196,    0,    0,  196,    0,
-      191,  190,  197,  197,  197,    0,  192,  197,  190,    0,
-        0,  198,  198,  198,    0,  193,  198,    0,  191,    0,
-        0,  194,    0,    0,  192,    0,    0,  196,  199,  199,
-      199,    0,    0,  199,    0,    0,  197,    0,    0,  194,
-      193,    0,    0,  197,    0,  198,    0,  196,    0,  201,
-      201,  201,    0,    0,  201,    0,  198,    0,  204,  204,
-      204,    0,  199,  204,  207,  207,  207,    0,    0,  207,
-
-        0,    0,  208,  208,  208,    0,    0,  208,    0,    0,
-        0,    0,  199,  201,  209,  209,  209,    0,  201,  209,
-        0,    0,  204,    0,  210,  210,  210,    0,  207,  210,
-        0,    0,  211,  211,  211,  204,  208,  211,    0,    0,
-        0,    0,    0,  207,    0,  208,    0,    0,  209,  215,
-      215,  215,    0,    0,  215,  216,  216,  216,  210,    0,
-      216,    0,    0,    0,    0,    0,  211,    0,  209,    0,
-        0,  210,    0,  211,  217,  217,  217,    0,    0,  217,
-      218,  218,  218,  215,    0,  218,  219,  219,  219,  216,
-        0,  219,  220,  220,  220,    0,  215,  220,  221,  221,
-
-      221,    0,    0,  221,    0,  216,    0,    0,  217,    0,
-      222,  222,  222,    0,  218,  222,  223,  223,  223,    0,
-      219,  223,    0,    0,  217,    0,  220,    0,    0,  224,
-      224,  224,  221,  220,  224,  225,  225,  225,  218,  219,
-      225,    0,    0,    0,  222,  225,  222,  226,  226,  226,
-      223,    0,  226,    0,  228,  228,  228,    0,    0,  228,
-      229,  229,  229,  224,  228,  229,  230,  230,  230,  225,
-      223,  230,  231,  231,  231,    0,    0,  231,    0,    0,
-        0,  226,    0,  224,    0,  232,  232,  232,  228,    0,
-      232,  233,  233,  233,  229,  232,  233,  226,    0,    0,
-
-      230,    0,    0,  234,  234,  234,  231,    0,  234,  235,
-      235,  235,    0,  229,  235,  236,  236,  236,    0,  232,
-      236,  237,  237,  237,    0,  233,  237,  238,  238,  238,
-        0,    0,  238,    0,  239,  239,  239,  234,    0,  239,
-      242,  242,  242,  235,    0,  242,    0,  233,  234,  236,
-        0,  243,  243,  243,    0,  237,  243,    0,    0,    0,
-        0,  238,  235,    0,  244,  244,  244,  236,  239,  244,
-      245,  245,  245,    0,  242,  245,  246,  246,  246,    0,
-        0,  246,    0,    0,    0,  243,  247,  247,  247,    0,
-      242,  247,  243,    0,  248,  248,  248,    0,  244,  248,
-
-      251,  251,  251,    0,  245,  251,  252,  252,  252,    0,
-      246,  252,  253,  253,  253,    0,    0,  253,    0,  245,
-      247,    0,  244,  247,  245,  246,    0,    0,  248,    0,
-      254,  254,  254,    0,  251,  254,  255,  255,  255,    0,
-      252,  255,    0,  259,  259,  259,  253,  252,  259,    0,
-      253,    0,    0,  251,  260,  260,  260,    0,    0,  260,
-        0,  261,  261,  261,  254,    0,  261,  262,  262,  262,
-      255,    0,  262,  263,  263,  263,    0,  259,  263,    0,
-      264,  264,  264,    0,  254,  264,    0,    0,  260,    0,
-      255,  268,  268,  268,  259,  261,  268,    0,  265,  265,
-
-      265,  262,    0,  265,  262,    0,  260,  263,  267,  267,
-      267,    0,    0,  267,  264,  269,  269,  269,    0,    0,
-      269,  270,  270,  270,    0,  268,  270,    0,  271,  271,
-      271,  263,  265,  271,  264,  272,  272,  272,  268,    0,
-      272,  265,  267,  273,  273,  273,    0,    0,  273,  269,
-        0,  275,  275,  275,    0,  270,  275,    0,  267,  276,
-      276,  276,  271,    0,  276,    0,    0,  269,    0,  272,
-      277,  277,  277,    0,    0,  277,    0,  273,  278,  278,
-      278,    0,    0,  278,    0,  275,  279,  279,  279,  272,
-        0,  279,    0,  276,    0,    0,  273,    0,    0,  275,
-
-      280,  280,  280,    0,  277,  280,    0,    0,    0,    0,
-      276,  277,  278,  281,  281,  281,    0,    0,  281,  278,
-      279,  284,  284,  284,    0,  279,  284,  285,  285,  285,
-        0,    0,  285,    0,  280,  286,  286,  286,    0,    0,
-      286,  287,  287,  287,    0,    0,  287,  281,    0,    0,
-      281,  288,  288,  288,    0,  284,  288,  289,  289,  289,
-        0,  285,  289,  290,  290,  290,  284,    0,  290,  286,
-        0,    0,    0,    0,    0,  287,  286,    0,  292,  292,
-      292,    0,  287,  292,    0,  288,    0,  293,  293,  293,
-        0,  289,  293,  295,  295,  295,    0,  290,  295,  296,
-
-      296,  296,    0,    0,  296,    0,  289,    0,  288,  290,
-        0,    0,  292,  297,  297,  297,    0,    0,  297,    0,
-        0,  293,    0,  298,  298,  298,    0,  295,  298,    0,
-      292,    0,    0,  296,  299,  299,  299,  293,    0,  299,
-      300,  300,  300,    0,    0,  300,    0,  297,  301,  301,
-      301,    0,    0,  301,  304,  304,  304,  298,    0,  304,
-      305,  305,  305,    0,    0,  305,    0,  297,  299,    0,
-        0,  306,  306,  306,  300,  299,  306,  298,  307,  307,
-      307,    0,  301,  307,    0,  300,    0,    0,  304,    0,
-      308,  308,  308,    0,  305,  308,    0,  301,  311,  311,
-
-      311,    0,    0,  311,    0,  306,  312,  312,  312,    0,
-        0,  312,  307,  313,  313,  313,    0,    0,  313,  307,
-        0,  314,  314,  314,  308,  306,  314,    0,  315,  315,
-      315,    0,  311,  315,    0,    0,    0,    0,    0,    0,
-      312,    0,    0,  308,    0,    0,    0,  313,    0,    0,
-        0,  311,    0,    0,    0,  314,    0,    0,    0,  312,
-        0,    0,  315,  320,  320,  320,  320,  320,  321,  321,
-      321,  321,  321,  322,    0,  322,  322,  322,  323,    0,
-      323,    0,  323,  324,  324,  324,  324,  324,  325,  325,
-      325,  325,  325,  326,    0,  326,  326,  326,  327,  327,
-
-      327,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      319,  319,  319,  319
+      119,    0,    0,  119,  104,  106,  104,    0,    0,    0,
+      106,    0,  107,  120,  120,  120,    0,  105,  120,  121,
+      121,  121,  108,  107,  121,  126,  126,  126,    0,  108,
+      126,    0,  119,    0,    0,  125,  125,  125,    0,    0,
+      125,    0,    0,    0,    0,    0,    0,  120,    0,    0,
+        0,    0,  119,  121,    0,    0,    0,    0,    0,  126,
+        0,    0,  121,    0,  120,  124,  124,  124,  124,  125,
+        0,    0,    0,  124,  124,  124,  124,  124,  124,  126,
+
+      128,  128,  128,  125,    0,  128,    0,    0,    0,  124,
+      124,  124,  124,  124,  124,  129,  129,  129,    0,    0,
+      129,    0,  130,  130,  130,    0,    0,  130,  131,  131,
+      131,    0,    0,  131,  128,  132,  132,  132,    0,    0,
+      132,    0,  133,  133,  133,    0,    0,  133,    0,  129,
+        0,    0,    0,    0,    0,  128,  130,    0,  134,  134,
+      134,    0,  131,  134,    0,    0,  129,    0,    0,  132,
+        0,    0,    0,    0,  131,  130,  133,  135,  135,  135,
+        0,    0,  135,  136,  136,  136,  132,    0,  136,    0,
+        0,    0,  134,    0,  133,  137,  137,  137,    0,    0,
+
+      137,  134,  138,  138,  138,    0,    0,  138,  139,  139,
+      139,  135,    0,  139,  140,  140,  140,  136,    0,  140,
+      141,  141,  141,    0,  136,  141,  142,  142,  142,  137,
+      135,  142,    0,  135,    0,    0,  138,    0,    0,  138,
+        0,    0,  139,    0,    0,    0,  137,    0,  140,    0,
+        0,  143,  143,  143,  141,  140,  143,    0,    0,    0,
+      142,    0,  139,  152,  152,  152,  141,    0,  152,    0,
+        0,  153,  153,  153,    0,    0,  153,  154,  154,  154,
+        0,    0,  154,  142,    0,  143,  153,  153,    0,    0,
+        0,    0,    0,    0,    0,  153,    0,  152,    0,    0,
+
+        0,    0,    0,  143,    0,  153,    0,    0,    0,    0,
+        0,  154,  156,  156,  156,  152,    0,  156,    0,    0,
+        0,    0,  154,  155,  155,  155,  155,    0,    0,    0,
+        0,  155,  155,  155,  155,  155,  155,  157,  157,  157,
+        0,    0,  157,    0,    0,    0,  156,  155,  155,  155,
+      155,  155,  155,  156,  158,  158,  158,    0,    0,  158,
+      159,  159,  159,    0,    0,  159,    0,  160,  160,  160,
+        0,  157,  160,    0,    0,  159,  159,    0,  161,  161,
+      161,    0,    0,  161,    0,  162,  162,  162,  158,  157,
+      162,  163,  163,  163,  159,  162,  163,  158,  164,  164,
+
+      164,  160,    0,  164,  165,  165,  165,    0,    0,  165,
+        0,  160,  161,  166,  166,  166,    0,    0,  166,  162,
+        0,  167,  167,  167,    0,  163,  167,    0,  163,    0,
+        0,  161,  164,    0,    0,  168,  168,  168,  165,  164,
+      168,  169,  169,  169,    0,    0,  169,  166,    0,  165,
+        0,  170,  170,  170,  166,  167,  170,  171,  171,  171,
+        0,    0,  171,  172,  172,  172,    0,    0,  172,  168,
+        0,  173,  173,  173,    0,  169,  173,  174,  174,  174,
+        0,    0,  174,    0,    0,  170,    0,  174,    0,  169,
+      168,  171,  170,  179,  179,  179,    0,  172,  179,    0,
+
+        0,  180,  180,  180,  172,  173,  180,    0,    0,  171,
+        0,  174,  181,  181,  181,    0,    0,  181,  182,  182,
+      182,    0,    0,  182,    0,    0,    0,  179,  183,  183,
+      183,    0,    0,  183,    0,  180,  185,  185,  185,    0,
+        0,  185,    0,  179,    0,    0,  181,    0,  186,  186,
+      186,    0,  182,  186,    0,    0,    0,    0,  182,    0,
+        0,    0,  183,  187,  187,  187,    0,    0,  187,    0,
+      185,    0,    0,    0,    0,    0,    0,  183,  184,  184,
+      184,  184,  186,    0,    0,  185,  184,  184,  184,  184,
+      184,  184,    0,    0,  188,  188,  188,  187,  186,  188,
+
+        0,    0,  184,  184,  184,  184,  184,  184,    0,    0,
+      187,  189,  189,  189,    0,    0,  189,  190,  190,  190,
+        0,    0,  190,    0,  191,  191,  191,    0,  188,  191,
+      192,  192,  192,    0,  191,  192,  193,  193,  193,    0,
+        0,  193,  194,  194,  194,  189,    0,  194,  195,  195,
+      195,  190,    0,  195,    0,  198,  198,  198,  191,    0,
+      198,  196,  196,  196,  192,    0,  196,  199,  199,  199,
+      193,    0,  199,    0,  192,    0,  194,    0,  200,  200,
+      200,  192,  195,  200,    0,  202,  202,  202,  193,  198,
+      202,  201,  201,  201,  194,  196,  201,    0,  204,  204,
+
+      204,  199,    0,  204,    0,    0,    0,  195,  199,  198,
+        0,    0,  200,  196,    0,  207,  207,  207,    0,  202,
+      207,  210,  210,  210,    0,  201,  210,    0,    0,    0,
+      200,    0,  204,  211,  211,  211,  201,  204,  211,  202,
+      212,  212,  212,    0,    0,  212,  213,  213,  213,  207,
+        0,  213,    0,    0,    0,  210,  214,  214,  214,    0,
+        0,  214,  207,    0,  218,  218,  218,  211,    0,  218,
+      210,    0,    0,    0,  212,    0,  211,    0,    0,    0,
+      213,  219,  219,  219,    0,    0,  219,  220,  220,  220,
+      214,    0,  220,  213,  212,    0,    0,  214,  218,  221,
+
+      221,  221,    0,    0,  221,  222,  222,  222,    0,    0,
+      222,  218,  223,  223,  223,  219,    0,  223,  224,  224,
+      224,  220,    0,  224,    0,  225,  225,  225,    0,    0,
+      225,  219,    0,  221,    0,    0,    0,  220,    0,  222,
+      226,  226,  226,    0,    0,  226,  223,    0,    0,  227,
+      227,  227,  224,  223,  227,    0,    0,  221,  222,  225,
+        0,  225,  228,  228,  228,    0,    0,  228,  229,  229,
+      229,    0,    0,  229,  226,  230,  230,  230,  229,    0,
+      230,    0,    0,  227,    0,  232,  232,  232,    0,    0,
+      232,    0,    0,    0,  226,  232,  228,    0,  227,  233,
+
+      233,  233,  229,    0,  233,  234,  234,  234,    0,  230,
+      234,    0,  235,  235,  235,    0,  228,  235,    0,  232,
+        0,  236,  236,  236,    0,  230,  236,  237,  237,  237,
+        0,  236,  237,  233,    0,  238,  238,  238,    0,  234,
+      238,    0,  239,  239,  239,    0,  235,  239,  240,  240,
+      240,    0,  233,  240,    0,  236,    0,  241,  241,  241,
+        0,  237,  241,  242,  242,  242,    0,    0,  242,  238,
+      243,  243,  243,    0,    0,  243,  239,    0,    0,    0,
+      238,    0,  240,  237,  246,  246,  246,    0,    0,  246,
+        0,  241,    0,    0,    0,  239,    0,  242,    0,    0,
+
+      240,  247,  247,  247,  243,    0,  247,  248,  248,  248,
+        0,    0,  248,    0,  249,  249,  249,    0,  246,  249,
+      250,  250,  250,    0,    0,  250,  251,  251,  251,    0,
+        0,  251,    0,    0,  246,  247,    0,    0,    0,    0,
+        0,  248,  247,    0,  252,  252,  252,    0,  249,  252,
+      253,  253,  253,    0,  250,  253,  256,  256,  256,    0,
+      251,  256,  257,  257,  257,    0,    0,  257,    0,  250,
+        0,    0,  249,    0,  250,  251,    0,    0,  252,    0,
+        0,  252,    0,    0,  253,    0,  258,  258,  258,    0,
+      256,  258,  259,  259,  259,    0,  257,  259,    0,  260,
+
+      260,  260,    0,  257,  260,  264,  264,  264,    0,  256,
+      264,  265,  265,  265,    0,    0,  265,  267,  267,  267,
+      258,    0,  267,    0,  258,    0,  259,  268,  268,  268,
+        0,    0,  268,  260,    0,  269,  269,  269,    0,  264,
+      269,    0,  270,  270,  270,  265,  259,  270,    0,    0,
+        0,  267,    0,  260,    0,    0,  264,  271,  271,  271,
+        0,  268,  271,  265,  268,  273,  273,  273,    0,  269,
+      273,    0,  274,  274,  274,    0,  270,  274,  275,  275,
+      275,    0,    0,  275,  276,  276,  276,    0,    0,  276,
+        0,  271,    0,  269,    0,    0,  270,    0,    0,  273,
+
+      271,    0,  277,  277,  277,    0,  274,  277,  278,  278,
+      278,    0,  275,  278,    0,  273,    0,    0,  276,  274,
+      279,  279,  279,    0,    0,  279,  281,  281,  281,    0,
+      275,  281,  282,  282,  282,    0,  277,  282,  283,  283,
+      283,    0,  278,  283,  284,  284,  284,    0,    0,  284,
+      285,  285,  285,    0,  279,  285,  286,  286,  286,    0,
+      281,  286,  278,  287,  287,  287,  282,    0,  287,    0,
+        0,    0,  283,  279,  281,  290,  290,  290,  284,  283,
+      290,    0,    0,  282,  285,  284,    0,    0,    0,  285,
+      286,  291,  291,  291,    0,    0,  291,  287,    0,    0,
+
+      287,  292,  292,  292,    0,    0,  292,    0,    0,  290,
+      293,  293,  293,    0,    0,  293,  294,  294,  294,    0,
+      290,  294,  295,  295,  295,  291,    0,  295,  296,  296,
+      296,    0,    0,  296,    0,  292,  298,  298,  298,    0,
+        0,  298,  292,    0,  293,    0,    0,  299,  299,  299,
+      294,  293,  299,  301,  301,  301,  295,    0,  301,  302,
+      302,  302,  296,    0,  302,    0,    0,  303,  303,  303,
+      298,  295,  303,  294,  296,  304,  304,  304,    0,    0,
+      304,  299,    0,    0,  305,  305,  305,  301,  298,  305,
+      306,  306,  306,  302,    0,  306,    0,  299,  307,  307,
+
+      307,  303,    0,  307,    0,  310,  310,  310,    0,  304,
+      310,  311,  311,  311,    0,    0,  311,    0,  305,    0,
+        0,  303,    0,    0,  306,  305,  312,  312,  312,  304,
+        0,  312,  307,    0,    0,  306,  313,  313,  313,  310,
+        0,  313,    0,    0,    0,  311,    0,  307,  314,  314,
+      314,    0,    0,  314,  317,  317,  317,    0,    0,  317,
+      312,  318,  318,  318,    0,    0,  318,    0,    0,    0,
+      313,  319,  319,  319,    0,    0,  319,  313,    0,    0,
+      312,    0,  314,    0,  320,  320,  320,    0,  317,  320,
+        0,  321,  321,  321,    0,  318,  321,    0,    0,    0,
+
+        0,  314,    0,    0,    0,  319,    0,  317,    0,    0,
+        0,    0,    0,    0,  318,    0,    0,    0,  320,    0,
+        0,    0,    0,    0,    0,  321,  326,  326,  326,  326,
+      326,  327,  327,  327,  327,  327,  328,    0,  328,  328,
+      328,  329,    0,  329,    0,  329,  330,  330,  330,  330,
+      330,  331,  331,  331,  331,  331,  332,    0,  332,  332,
+      332,  333,  333,  333,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1354,14 +1369,14 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[58] =
+static const flex_int16_t yy_rule_linenum[59] =
     {   0,
       133,  135,  137,  142,  143,  148,  149,  150,  162,  165,
       170,  177,  186,  195,  204,  215,  226,  235,  244,  253,
       262,  271,  280,  289,  298,  307,  316,  325,  335,  344,
       353,  362,  371,  380,  389,  398,  407,  416,  425,  434,
-      533,  538,  543,  548,  549,  550,  551,  552,  553,  555,
-      573,  586,  591,  595,  597,  599,  601
+      443,  542,  547,  552,  557,  558,  559,  560,  561,  562,
+      564,  582,  595,  600,  604,  606,  608,  610
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1416,7 +1431,7 @@ using isc::agent::AgentParser;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg)
-#line 1419 "agent_lexer.cc"
+#line 1435 "agent_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
@@ -1442,8 +1457,8 @@ using isc::agent::AgentParser;
    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 1445 "agent_lexer.cc"
-#line 1446 "agent_lexer.cc"
+#line 1461 "agent_lexer.cc"
+#line 1462 "agent_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -1757,7 +1772,7 @@ YY_DECL
     }
 
 
-#line 1760 "agent_lexer.cc"
+#line 1776 "agent_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -1786,13 +1801,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 >= 320 )
+                               if ( yy_current_state >= 326 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 319 );
+               while ( yy_current_state != 325 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -1811,13 +1826,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 < 58 )
+                       else if ( yy_act < 59 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 58 )
+                       else if ( yy_act == 59 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 59 )
+                       else if ( yy_act == 60 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -2205,6 +2220,18 @@ YY_RULE_SETUP
 case 35:
 YY_RULE_SETUP
 #line 389 "agent_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case ParserContext::OUTPUT_OPTIONS:
+        return AgentParser::make_PATTERN(driver.loc_);
+    default:
+        return AgentParser::make_STRING("pattern", driver.loc_);
+    }
+}
+       YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 398 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2214,9 +2241,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 36:
+case 37:
 YY_RULE_SETUP
-#line 398 "agent_lexer.ll"
+#line 407 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
@@ -2226,9 +2253,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 37:
+case 38:
 YY_RULE_SETUP
-#line 407 "agent_lexer.ll"
+#line 416 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2238,9 +2265,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 38:
+case 39:
 YY_RULE_SETUP
-#line 416 "agent_lexer.ll"
+#line 425 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2250,9 +2277,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 39:
+case 40:
 YY_RULE_SETUP
-#line 425 "agent_lexer.ll"
+#line 434 "agent_lexer.ll"
 {
     switch(driver.ctx_) {
     case ParserContext::CONFIG:
@@ -2262,9 +2289,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 40:
+case 41:
 YY_RULE_SETUP
-#line 434 "agent_lexer.ll"
+#line 443 "agent_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.
@@ -2364,65 +2391,65 @@ YY_RULE_SETUP
     return AgentParser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 41:
-/* rule 41 can match eol */
+case 42:
+/* rule 42 can match eol */
 YY_RULE_SETUP
-#line 533 "agent_lexer.ll"
+#line 542 "agent_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
 }
        YY_BREAK
-case 42:
-/* rule 42 can match eol */
+case 43:
+/* rule 43 can match eol */
 YY_RULE_SETUP
-#line 538 "agent_lexer.ll"
+#line 547 "agent_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
 }
        YY_BREAK
-case 43:
+case 44:
 YY_RULE_SETUP
-#line 543 "agent_lexer.ll"
+#line 552 "agent_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
 }
        YY_BREAK
-case 44:
+case 45:
 YY_RULE_SETUP
-#line 548 "agent_lexer.ll"
+#line 557 "agent_lexer.ll"
 { return AgentParser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 45:
+case 46:
 YY_RULE_SETUP
-#line 549 "agent_lexer.ll"
+#line 558 "agent_lexer.ll"
 { return AgentParser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 46:
+case 47:
 YY_RULE_SETUP
-#line 550 "agent_lexer.ll"
+#line 559 "agent_lexer.ll"
 { return AgentParser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 47:
+case 48:
 YY_RULE_SETUP
-#line 551 "agent_lexer.ll"
+#line 560 "agent_lexer.ll"
 { return AgentParser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 48:
+case 49:
 YY_RULE_SETUP
-#line 552 "agent_lexer.ll"
+#line 561 "agent_lexer.ll"
 { return AgentParser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 49:
+case 50:
 YY_RULE_SETUP
-#line 553 "agent_lexer.ll"
+#line 562 "agent_lexer.ll"
 { return AgentParser::make_COLON(driver.loc_); }
        YY_BREAK
-case 50:
+case 51:
 YY_RULE_SETUP
-#line 555 "agent_lexer.ll"
+#line 564 "agent_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -2441,9 +2468,9 @@ YY_RULE_SETUP
     return AgentParser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 51:
+case 52:
 YY_RULE_SETUP
-#line 573 "agent_lexer.ll"
+#line 582 "agent_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -2457,43 +2484,43 @@ YY_RULE_SETUP
     return AgentParser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 52:
+case 53:
 YY_RULE_SETUP
-#line 586 "agent_lexer.ll"
+#line 595 "agent_lexer.ll"
 {
     string tmp(yytext);
     return AgentParser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 53:
+case 54:
 YY_RULE_SETUP
-#line 591 "agent_lexer.ll"
+#line 600 "agent_lexer.ll"
 {
    return AgentParser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 54:
+case 55:
 YY_RULE_SETUP
-#line 595 "agent_lexer.ll"
+#line 604 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 55:
+case 56:
 YY_RULE_SETUP
-#line 597 "agent_lexer.ll"
+#line 606 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 56:
+case 57:
 YY_RULE_SETUP
-#line 599 "agent_lexer.ll"
+#line 608 "agent_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 57:
+case 58:
 YY_RULE_SETUP
-#line 601 "agent_lexer.ll"
+#line 610 "agent_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 603 "agent_lexer.ll"
+#line 612 "agent_lexer.ll"
 {
     if (driver.states_.empty()) {
         return AgentParser::make_END(driver.loc_);
@@ -2517,12 +2544,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 58:
+case 59:
 YY_RULE_SETUP
-#line 626 "agent_lexer.ll"
+#line 635 "agent_lexer.ll"
 ECHO;
        YY_BREAK
-#line 2525 "agent_lexer.cc"
+#line 2553 "agent_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -2841,7 +2868,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 >= 320 )
+                       if ( yy_current_state >= 326 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2874,11 +2901,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 >= 320 )
+               if ( yy_current_state >= 326 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 319);
+       yy_is_jam = (yy_current_state == 325);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3627,7 +3654,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 626 "agent_lexer.ll"
+#line 635 "agent_lexer.ll"
 
 
 using namespace isc::dhcp;
index e7d56b06490ac198180e15a6c6add839fc2b4da2..e96227224c7445b3251527fc1382a4eb3caf508f 100644 (file)
@@ -385,6 +385,15 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"pattern\" {
+    switch(driver.ctx_) {
+    case ParserContext::OUTPUT_OPTIONS:
+        return AgentParser::make_PATTERN(driver.loc_);
+    default:
+        return AgentParser::make_STRING("pattern", driver.loc_);
+    }
+}
+
 \"debuglevel\" {
     switch(driver.ctx_) {
     case ParserContext::LOGGERS:
index b5fa05529640b6799845b3a2f227566740e15499..3c7a44856397e22167a032e0a3d822fe6a8332d2 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.4.1.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Skeleton implementation for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 
 
 // Unqualified %code blocks.
-#line 33 "agent_parser.yy"
+#line 33 "agent_parser.yy" // lalr1.cc:438
 
 #include <agent/parser_context.h>
 
-#line 51 "agent_parser.cc"
+#line 51 "agent_parser.cc" // lalr1.cc:438
 
 
 #ifndef YY_
@@ -88,7 +88,7 @@
         {                                                               \
           (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \
         }                                                               \
-    while (false)
+    while (/*CONSTCOND*/ false)
 # endif
 
 
 #define YYERROR         goto yyerrorlab
 #define YYRECOVERING()  (!!yyerrstatus_)
 
-#line 14 "agent_parser.yy"
+#line 14 "agent_parser.yy" // lalr1.cc:513
 namespace isc { namespace agent {
-#line 146 "agent_parser.cc"
-
+#line 146 "agent_parser.cc" // lalr1.cc:513
 
   /* Return YYSTR after stripping away unnecessary quotes and
      backslashes, so that it's suitable for yyerror.  The heuristic is
@@ -155,7 +154,7 @@ namespace isc { namespace agent {
   {
     if (*yystr == '"')
       {
-        std::string yyr;
+        std::string yyr = "";
         char const *yyp = yystr;
 
         for (;;)
@@ -168,10 +167,7 @@ namespace isc { namespace agent {
             case '\\':
               if (*++yyp != '\\')
                 goto do_not_strip_quotes;
-              else
-                goto append;
-
-            append:
+              // Fall through.
             default:
               yyr += *yyp;
               break;
@@ -199,8 +195,6 @@ namespace isc { namespace agent {
   AgentParser::~AgentParser ()
   {}
 
-  AgentParser::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
-  {}
 
   /*---------------.
   | Symbol types.  |
@@ -209,16 +203,16 @@ namespace isc { namespace agent {
 
 
   // by_state.
-  AgentParser::by_state::by_state () YY_NOEXCEPT
+  AgentParser::by_state::by_state ()
     : state (empty_state)
   {}
 
-  AgentParser::by_state::by_state (const by_state& that) YY_NOEXCEPT
-    : state (that.state)
+  AgentParser::by_state::by_state (const by_state& other)
+    : state (other.state)
   {}
 
   void
-  AgentParser::by_state::clear () YY_NOEXCEPT
+  AgentParser::by_state::clear ()
   {
     state = empty_state;
   }
@@ -230,12 +224,12 @@ namespace isc { namespace agent {
     that.clear ();
   }
 
-  AgentParser::by_state::by_state (state_type s) YY_NOEXCEPT
+  AgentParser::by_state::by_state (state_type s)
     : state (s)
   {}
 
   AgentParser::symbol_number_type
-  AgentParser::by_state::type_get () const YY_NOEXCEPT
+  AgentParser::by_state::type_get () const
   {
     if (state == empty_state)
       return empty_symbol;
@@ -251,25 +245,25 @@ namespace isc { namespace agent {
   {
     switch (that.type_get ())
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
         value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (that.value));
         break;
 
-      case 44: // "boolean"
+      case 45: // "boolean"
         value.YY_MOVE_OR_COPY< bool > (YY_MOVE (that.value));
         break;
 
-      case 43: // "floating point"
+      case 44: // "floating point"
         value.YY_MOVE_OR_COPY< double > (YY_MOVE (that.value));
         break;
 
-      case 42: // "integer"
+      case 43: // "integer"
         value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (that.value));
         break;
 
-      case 41: // "constant string"
+      case 42: // "constant string"
         value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (that.value));
         break;
 
@@ -277,7 +271,7 @@ namespace isc { namespace agent {
         break;
     }
 
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
     // that is emptied.
     that.state = empty_state;
 #endif
@@ -288,25 +282,25 @@ namespace isc { namespace agent {
   {
     switch (that.type_get ())
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
         value.move< ElementPtr > (YY_MOVE (that.value));
         break;
 
-      case 44: // "boolean"
+      case 45: // "boolean"
         value.move< bool > (YY_MOVE (that.value));
         break;
 
-      case 43: // "floating point"
+      case 44: // "floating point"
         value.move< double > (YY_MOVE (that.value));
         break;
 
-      case 42: // "integer"
+      case 43: // "integer"
         value.move< int64_t > (YY_MOVE (that.value));
         break;
 
-      case 41: // "constant string"
+      case 42: // "constant string"
         value.move< std::string > (YY_MOVE (that.value));
         break;
 
@@ -318,32 +312,32 @@ namespace isc { namespace agent {
     that.type = empty_symbol;
   }
 
-#if YY_CPLUSPLUS < 201103L
+#if !defined __cplusplus || __cplusplus < 201103L
   AgentParser::stack_symbol_type&
   AgentParser::stack_symbol_type::operator= (stack_symbol_type& that)
   {
     state = that.state;
     switch (that.type_get ())
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
         value.move< ElementPtr > (that.value);
         break;
 
-      case 44: // "boolean"
+      case 45: // "boolean"
         value.move< bool > (that.value);
         break;
 
-      case 43: // "floating point"
+      case 44: // "floating point"
         value.move< double > (that.value);
         break;
 
-      case 42: // "integer"
+      case 43: // "integer"
         value.move< int64_t > (that.value);
         break;
 
-      case 41: // "constant string"
+      case 42: // "constant string"
         value.move< std::string > (that.value);
         break;
 
@@ -375,59 +369,65 @@ namespace isc { namespace agent {
     std::ostream& yyoutput = yyo;
     YYUSE (yyoutput);
     symbol_number_type yytype = yysym.type_get ();
-#if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ * 100 + __GNUC_MINOR__ <= 408
     // Avoid a (spurious) G++ 4.8 warning about "array subscript is
     // below array bounds".
     if (yysym.empty ())
       std::abort ();
-#endif
     yyo << (yytype < yyntokens_ ? "token" : "nterm")
         << ' ' << yytname_[yytype] << " ("
         << yysym.location << ": ";
     switch (yytype)
     {
-      case 41: // "constant string"
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < std::string > (); }
-#line 393 "agent_parser.cc"
+            case 42: // "constant string"
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< std::string > (); }
+#line 386 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 42: // "integer"
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < int64_t > (); }
-#line 399 "agent_parser.cc"
+      case 43: // "integer"
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< int64_t > (); }
+#line 393 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 43: // "floating point"
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < double > (); }
-#line 405 "agent_parser.cc"
+      case 44: // "floating point"
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< double > (); }
+#line 400 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 44: // "boolean"
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < bool > (); }
-#line 411 "agent_parser.cc"
+      case 45: // "boolean"
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< bool > (); }
+#line 407 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 53: // value
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 417 "agent_parser.cc"
+      case 54: // value
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 414 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 56: // map_value
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 423 "agent_parser.cc"
+      case 57: // map_value
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 421 "agent_parser.cc" // lalr1.cc:672
         break;
 
-      case 107: // socket_type_value
-#line 103 "agent_parser.yy"
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 429 "agent_parser.cc"
+      case 108: // socket_type_value
+
+#line 104 "agent_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 428 "agent_parser.cc" // lalr1.cc:672
         break;
 
+
       default:
         break;
     }
@@ -446,7 +446,7 @@ namespace isc { namespace agent {
   void
   AgentParser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
   {
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
     yypush_ (m, stack_symbol_type (s, std::move (sym)));
 #else
     stack_symbol_type ss (s, sym);
@@ -550,22 +550,17 @@ namespace isc { namespace agent {
     yystack_.clear ();
     yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
 
-  /*-----------------------------------------------.
-  | yynewstate -- push a new symbol on the stack.  |
-  `-----------------------------------------------*/
+    // A new symbol was pushed on the stack.
   yynewstate:
     YYCDEBUG << "Entering state " << yystack_[0].state << '\n';
 
     // Accept?
     if (yystack_[0].state == yyfinal_)
-      YYACCEPT;
+      goto yyacceptlab;
 
     goto yybackup;
 
-
-  /*-----------.
-  | yybackup.  |
-  `-----------*/
+    // Backup.
   yybackup:
     // Try to take a decision without lookahead.
     yyn = yypact_[yystack_[0].state];
@@ -586,7 +581,6 @@ namespace isc { namespace agent {
 #if YY_EXCEPTIONS
         catch (const syntax_error& yyexc)
           {
-            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
             error (yyexc);
             goto yyerrlab1;
           }
@@ -618,7 +612,6 @@ namespace isc { namespace agent {
     yypush_ ("Shifting", yyn, YY_MOVE (yyla));
     goto yynewstate;
 
-
   /*-----------------------------------------------------------.
   | yydefault -- do the default action for the current state.  |
   `-----------------------------------------------------------*/
@@ -628,9 +621,8 @@ namespace isc { namespace agent {
       goto yyerrlab;
     goto yyreduce;
 
-
   /*-----------------------------.
-  | yyreduce -- do a reduction.  |
+  | yyreduce -- Do a reduction.  |
   `-----------------------------*/
   yyreduce:
     yylen = yyr2_[yyn];
@@ -642,25 +634,25 @@ namespace isc { namespace agent {
          when using variants.  */
       switch (yyr1_[yyn])
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
         yylhs.value.emplace< ElementPtr > ();
         break;
 
-      case 44: // "boolean"
+      case 45: // "boolean"
         yylhs.value.emplace< bool > ();
         break;
 
-      case 43: // "floating point"
+      case 44: // "floating point"
         yylhs.value.emplace< double > ();
         break;
 
-      case 42: // "integer"
+      case 43: // "integer"
         yylhs.value.emplace< int64_t > ();
         break;
 
-      case 41: // "constant string"
+      case 42: // "constant string"
         yylhs.value.emplace< std::string > ();
         break;
 
@@ -671,8 +663,8 @@ namespace isc { namespace agent {
 
       // Default location.
       {
-        stack_type::slice range (yystack_, yylen);
-        YYLLOC_DEFAULT (yylhs.location, range, yylen);
+        slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
+        YYLLOC_DEFAULT (yylhs.location, slice, yylen);
         yyerror_range[1].location = yylhs.location;
       }
 
@@ -685,206 +677,206 @@ namespace isc { namespace agent {
           switch (yyn)
             {
   case 2:
-#line 114 "agent_parser.yy"
+#line 115 "agent_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.NO_KEYWORDS; }
-#line 691 "agent_parser.cc"
+#line 683 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 4:
-#line 115 "agent_parser.yy"
+#line 116 "agent_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.CONFIG; }
-#line 697 "agent_parser.cc"
+#line 689 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 6:
-#line 116 "agent_parser.yy"
+#line 117 "agent_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.AGENT; }
-#line 703 "agent_parser.cc"
+#line 695 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 8:
-#line 124 "agent_parser.yy"
+#line 125 "agent_parser.yy" // lalr1.cc:907
     {
     // Parse the Control-agent map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 713 "agent_parser.cc"
+#line 705 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 9:
-#line 128 "agent_parser.yy"
+#line 129 "agent_parser.yy" // lalr1.cc:907
     {
     // parsing completed
 }
-#line 721 "agent_parser.cc"
+#line 713 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 10:
-#line 135 "agent_parser.yy"
+#line 136 "agent_parser.yy" // lalr1.cc:907
     {
     // Push back the JSON value on the stack
-    ctx.stack_.push_back(yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 730 "agent_parser.cc"
+#line 722 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 11:
-#line 141 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 736 "agent_parser.cc"
+#line 142 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
+#line 728 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 12:
-#line 142 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 742 "agent_parser.cc"
+#line 143 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
+#line 734 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 13:
-#line 143 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 748 "agent_parser.cc"
+#line 144 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
+#line 740 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 14:
-#line 144 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 754 "agent_parser.cc"
+#line 145 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
+#line 746 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 15:
-#line 145 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 760 "agent_parser.cc"
+#line 146 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
+#line 752 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 16:
-#line 146 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 766 "agent_parser.cc"
+#line 147 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 758 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 17:
-#line 147 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 772 "agent_parser.cc"
+#line 148 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 764 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 18:
-#line 151 "agent_parser.yy"
+#line 152 "agent_parser.yy" // lalr1.cc:907
     {
     // 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 783 "agent_parser.cc"
+#line 775 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 19:
-#line 156 "agent_parser.yy"
+#line 157 "agent_parser.yy" // lalr1.cc:907
     {
     // 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 793 "agent_parser.cc"
+#line 785 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 20:
-#line 162 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 799 "agent_parser.cc"
+#line 163 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 791 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 23:
-#line 176 "agent_parser.yy"
+#line 177 "agent_parser.yy" // lalr1.cc:907
     {
                   // map containing a single entry
-                  ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 808 "agent_parser.cc"
+#line 800 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 24:
-#line 180 "agent_parser.yy"
+#line 181 "agent_parser.yy" // lalr1.cc:907
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
-                  ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 818 "agent_parser.cc"
+#line 810 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 25:
-#line 187 "agent_parser.yy"
+#line 188 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 827 "agent_parser.cc"
+#line 819 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 26:
-#line 190 "agent_parser.yy"
+#line 191 "agent_parser.yy" // lalr1.cc:907
     {
 }
-#line 834 "agent_parser.cc"
+#line 826 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 29:
-#line 197 "agent_parser.yy"
+#line 198 "agent_parser.yy" // lalr1.cc:907
     {
                   // List consisting of a single element.
-                  ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 843 "agent_parser.cc"
+#line 835 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 30:
-#line 201 "agent_parser.yy"
+#line 202 "agent_parser.yy" // lalr1.cc:907
     {
                   // List ending with , and a value.
-                  ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 852 "agent_parser.cc"
+#line 844 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 31:
-#line 214 "agent_parser.yy"
+#line 215 "agent_parser.yy" // lalr1.cc:907
     {
     const std::string& where = ctx.contextName();
-    const std::string& keyword = yystack_[1].value.as < std::string > ();
+    const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 863 "agent_parser.cc"
+#line 855 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 32:
-#line 223 "agent_parser.yy"
+#line 224 "agent_parser.yy" // lalr1.cc:907
     {
     // 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 874 "agent_parser.cc"
+#line 866 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 33:
-#line 228 "agent_parser.yy"
+#line 229 "agent_parser.yy" // lalr1.cc:907
     {
     // 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 884 "agent_parser.cc"
+#line 876 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 42:
-#line 249 "agent_parser.yy"
+#line 250 "agent_parser.yy" // lalr1.cc:907
     {
 
     // Let's create a MapElement that will represent it, add it to the
@@ -896,60 +888,60 @@ namespace isc { namespace agent {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.AGENT);
 }
-#line 900 "agent_parser.cc"
+#line 892 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 43:
-#line 259 "agent_parser.yy"
+#line 260 "agent_parser.yy" // lalr1.cc:907
     {
     // Ok, we're done with parsing control-agent. Let's take the map
     // off the stack.
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 911 "agent_parser.cc"
+#line 903 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 54:
-#line 282 "agent_parser.yy"
+#line 283 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 919 "agent_parser.cc"
+#line 911 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 55:
-#line 284 "agent_parser.yy"
+#line 285 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr host(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("http-host", host);
     ctx.leave();
 }
-#line 929 "agent_parser.cc"
+#line 921 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 56:
-#line 290 "agent_parser.yy"
+#line 291 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("http-port", prf);
 }
-#line 938 "agent_parser.cc"
+#line 930 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 57:
-#line 295 "agent_parser.yy"
+#line 296 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 946 "agent_parser.cc"
+#line 938 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 58:
-#line 297 "agent_parser.yy"
+#line 298 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr parent = ctx.stack_.back();
-    ElementPtr user_context = yystack_[0].value.as < ElementPtr > ();
+    ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
     ConstElementPtr old = parent->get("user-context");
 
     // Handle already existing user context
@@ -969,23 +961,23 @@ namespace isc { namespace agent {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 973 "agent_parser.cc"
+#line 965 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 59:
-#line 320 "agent_parser.yy"
+#line 321 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 981 "agent_parser.cc"
+#line 973 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 60:
-#line 322 "agent_parser.yy"
+#line 323 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
-    ElementPtr comment(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr comment(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     user_context->set("comment", comment);
 
     // Handle already existing user context
@@ -1006,443 +998,460 @@ namespace isc { namespace agent {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 1010 "agent_parser.cc"
+#line 1002 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 61:
-#line 348 "agent_parser.yy"
+#line 349 "agent_parser.yy" // lalr1.cc:907
     {
     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 1021 "agent_parser.cc"
+#line 1013 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 62:
-#line 353 "agent_parser.yy"
+#line 354 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1030 "agent_parser.cc"
+#line 1022 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 67:
-#line 366 "agent_parser.yy"
+#line 367 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1040 "agent_parser.cc"
+#line 1032 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 68:
-#line 370 "agent_parser.yy"
+#line 371 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 1048 "agent_parser.cc"
+#line 1040 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 74:
-#line 383 "agent_parser.yy"
+#line 384 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1056 "agent_parser.cc"
+#line 1048 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 75:
-#line 385 "agent_parser.yy"
+#line 386 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr lib(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1066 "agent_parser.cc"
+#line 1058 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 76:
-#line 391 "agent_parser.yy"
+#line 392 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1074 "agent_parser.cc"
+#line 1066 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 77:
-#line 393 "agent_parser.yy"
+#line 394 "agent_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("parameters", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1083 "agent_parser.cc"
+#line 1075 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 78:
-#line 401 "agent_parser.yy"
+#line 402 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[2].location)));
     ctx.stack_.back()->set("control-sockets", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKETS);
 }
-#line 1094 "agent_parser.cc"
+#line 1086 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 79:
-#line 406 "agent_parser.yy"
+#line 407 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1103 "agent_parser.cc"
+#line 1095 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 86:
-#line 427 "agent_parser.yy"
+#line 428 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp4", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 1114 "agent_parser.cc"
+#line 1106 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 87:
-#line 432 "agent_parser.yy"
+#line 433 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1123 "agent_parser.cc"
+#line 1115 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 88:
-#line 438 "agent_parser.yy"
+#line 439 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp6", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 1134 "agent_parser.cc"
+#line 1126 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 89:
-#line 443 "agent_parser.yy"
+#line 444 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1143 "agent_parser.cc"
+#line 1135 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 90:
-#line 449 "agent_parser.yy"
+#line 450 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("d2", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER);
 }
-#line 1154 "agent_parser.cc"
+#line 1146 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 91:
-#line 454 "agent_parser.yy"
+#line 455 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1163 "agent_parser.cc"
+#line 1155 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 99:
-#line 473 "agent_parser.yy"
+#line 474 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1171 "agent_parser.cc"
+#line 1163 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 100:
-#line 475 "agent_parser.yy"
+#line 476 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr name(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("socket-name", name);
     ctx.leave();
 }
-#line 1181 "agent_parser.cc"
+#line 1173 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 101:
-#line 482 "agent_parser.yy"
+#line 483 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.SOCKET_TYPE);
 }
-#line 1189 "agent_parser.cc"
+#line 1181 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 102:
-#line 484 "agent_parser.yy"
+#line 485 "agent_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("socket-type", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("socket-type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1198 "agent_parser.cc"
+#line 1190 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 103:
-#line 490 "agent_parser.yy"
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
-#line 1204 "agent_parser.cc"
+#line 491 "agent_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
+#line 1196 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 104:
-#line 496 "agent_parser.yy"
+#line 497 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1212 "agent_parser.cc"
+#line 1204 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 105:
-#line 498 "agent_parser.yy"
+#line 499 "agent_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1221 "agent_parser.cc"
+#line 1213 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 106:
-#line 503 "agent_parser.yy"
+#line 504 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1229 "agent_parser.cc"
+#line 1221 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 107:
-#line 505 "agent_parser.yy"
+#line 506 "agent_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1238 "agent_parser.cc"
+#line 1230 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 108:
-#line 510 "agent_parser.yy"
+#line 511 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1246 "agent_parser.cc"
+#line 1238 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 109:
-#line 512 "agent_parser.yy"
+#line 513 "agent_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1255 "agent_parser.cc"
+#line 1247 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 110:
-#line 522 "agent_parser.yy"
+#line 523 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 1266 "agent_parser.cc"
+#line 1258 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 111:
-#line 527 "agent_parser.yy"
+#line 528 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1275 "agent_parser.cc"
+#line 1267 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 115:
-#line 544 "agent_parser.yy"
+#line 545 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 1286 "agent_parser.cc"
+#line 1278 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 116:
-#line 549 "agent_parser.yy"
+#line 550 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1295 "agent_parser.cc"
+#line 1287 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 119:
-#line 561 "agent_parser.yy"
+#line 562 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 1305 "agent_parser.cc"
+#line 1297 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 120:
-#line 565 "agent_parser.yy"
+#line 566 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 1313 "agent_parser.cc"
+#line 1305 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 130:
-#line 582 "agent_parser.yy"
+#line 583 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1321 "agent_parser.cc"
+#line 1313 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 131:
-#line 584 "agent_parser.yy"
+#line 585 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr name(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("name", name);
     ctx.leave();
 }
-#line 1331 "agent_parser.cc"
+#line 1323 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 132:
-#line 590 "agent_parser.yy"
+#line 591 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 1340 "agent_parser.cc"
+#line 1332 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 133:
-#line 595 "agent_parser.yy"
+#line 596 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1348 "agent_parser.cc"
+#line 1340 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 134:
-#line 597 "agent_parser.yy"
+#line 598 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 1358 "agent_parser.cc"
+#line 1350 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 135:
-#line 603 "agent_parser.yy"
+#line 604 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 1369 "agent_parser.cc"
+#line 1361 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 136:
-#line 608 "agent_parser.yy"
+#line 609 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1378 "agent_parser.cc"
+#line 1370 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 139:
-#line 617 "agent_parser.yy"
+#line 618 "agent_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1388 "agent_parser.cc"
+#line 1380 "agent_parser.cc" // lalr1.cc:907
     break;
 
   case 140:
-#line 621 "agent_parser.yy"
+#line 622 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 1396 "agent_parser.cc"
+#line 1388 "agent_parser.cc" // lalr1.cc:907
     break;
 
-  case 147:
-#line 635 "agent_parser.yy"
+  case 148:
+#line 637 "agent_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORDS);
 }
-#line 1404 "agent_parser.cc"
+#line 1396 "agent_parser.cc" // lalr1.cc:907
     break;
 
-  case 148:
-#line 637 "agent_parser.yy"
+  case 149:
+#line 639 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 1414 "agent_parser.cc"
+#line 1406 "agent_parser.cc" // lalr1.cc:907
     break;
 
-  case 149:
-#line 643 "agent_parser.yy"
+  case 150:
+#line 645 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 1423 "agent_parser.cc"
+#line 1415 "agent_parser.cc" // lalr1.cc:907
     break;
 
-  case 150:
-#line 648 "agent_parser.yy"
+  case 151:
+#line 650 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 1432 "agent_parser.cc"
+#line 1424 "agent_parser.cc" // lalr1.cc:907
     break;
 
-  case 151:
-#line 653 "agent_parser.yy"
+  case 152:
+#line 655 "agent_parser.yy" // lalr1.cc:907
     {
-    ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 1441 "agent_parser.cc"
+#line 1433 "agent_parser.cc" // lalr1.cc:907
     break;
 
+  case 153:
+#line 660 "agent_parser.yy" // lalr1.cc:907
+    {
+    ctx.enter(ctx.NO_KEYWORDS);
+}
+#line 1441 "agent_parser.cc" // lalr1.cc:907
+    break;
 
-#line 1445 "agent_parser.cc"
+  case 154:
+#line 662 "agent_parser.yy" // lalr1.cc:907
+    {
+    ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("pattern", sev);
+    ctx.leave();
+}
+#line 1451 "agent_parser.cc" // lalr1.cc:907
+    break;
 
+
+#line 1455 "agent_parser.cc" // lalr1.cc:907
             default:
               break;
             }
@@ -1450,7 +1459,6 @@ namespace isc { namespace agent {
 #if YY_EXCEPTIONS
       catch (const syntax_error& yyexc)
         {
-          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
           error (yyexc);
           YYERROR;
         }
@@ -1465,7 +1473,6 @@ namespace isc { namespace agent {
     }
     goto yynewstate;
 
-
   /*--------------------------------------.
   | yyerrlab -- here on detecting error.  |
   `--------------------------------------*/
@@ -1502,18 +1509,18 @@ namespace isc { namespace agent {
   | yyerrorlab -- error raised explicitly by YYERROR.  |
   `---------------------------------------------------*/
   yyerrorlab:
-    /* Pacify compilers when the user code never invokes YYERROR and
-       the label yyerrorlab therefore never appears in user code.  */
-    if (false)
-      YYERROR;
 
+    /* Pacify compilers like GCC when the user code never invokes
+       YYERROR and the label yyerrorlab therefore never appears in user
+       code.  */
+    if (false)
+      goto yyerrorlab;
     /* Do not reclaim the symbols of the rule whose action triggered
        this YYERROR.  */
     yypop_ (yylen);
     yylen = 0;
     goto yyerrlab1;
 
-
   /*-------------------------------------------------------------.
   | yyerrlab1 -- common code for both syntax error and YYERROR.  |
   `-------------------------------------------------------------*/
@@ -1554,26 +1561,16 @@ namespace isc { namespace agent {
     }
     goto yynewstate;
 
-
-  /*-------------------------------------.
-  | yyacceptlab -- YYACCEPT comes here.  |
-  `-------------------------------------*/
+    // Accept.
   yyacceptlab:
     yyresult = 0;
     goto yyreturn;
 
-
-  /*-----------------------------------.
-  | yyabortlab -- YYABORT comes here.  |
-  `-----------------------------------*/
+    // Abort.
   yyabortlab:
     yyresult = 1;
     goto yyreturn;
 
-
-  /*-----------------------------------------------------.
-  | yyreturn -- parsing is finished, return the result.  |
-  `-----------------------------------------------------*/
   yyreturn:
     if (!yyla.empty ())
       yy_destroy_ ("Cleanup: discarding lookahead", yyla);
@@ -1712,39 +1709,40 @@ namespace isc { namespace agent {
   }
 
 
-  const short AgentParser::yypact_ninf_ = -133;
+  const signed char AgentParser::yypact_ninf_ = -115;
 
   const signed char AgentParser::yytable_ninf_ = -1;
 
   const short
   AgentParser::yypact_[] =
   {
-      71,  -133,  -133,  -133,     7,     3,     2,     4,  -133,  -133,
-    -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,
-    -133,  -133,  -133,  -133,     3,   -28,    -8,     9,  -133,    20,
-      29,    54,    49,    76,  -133,  -133,  -133,  -133,  -133,    95,
-    -133,    22,  -133,  -133,  -133,  -133,  -133,  -133,  -133,   101,
-    -133,  -133,   103,  -133,  -133,  -133,    69,  -133,  -133,  -133,
-    -133,  -133,  -133,  -133,  -133,  -133,     3,     3,  -133,    63,
-     104,   108,   109,   110,   111,  -133,    -8,  -133,   112,    75,
-     114,   115,   113,   118,   120,     9,  -133,  -133,  -133,   121,
-     122,   123,     3,     3,     3,  -133,    91,  -133,   124,    96,
-    -133,   128,   129,  -133,     3,     9,   116,  -133,  -133,  -133,
-    -133,  -133,  -133,  -133,    -2,   131,   132,  -133,    70,    78,
-    -133,  -133,  -133,  -133,  -133,  -133,    82,  -133,  -133,  -133,
-    -133,  -133,   130,   137,  -133,  -133,    53,  -133,  -133,   116,
-    -133,   139,   140,   141,    -2,  -133,    -5,  -133,   131,    24,
-     132,  -133,  -133,   134,   142,   143,  -133,  -133,  -133,  -133,
-      84,  -133,  -133,  -133,  -133,  -133,  -133,   144,  -133,  -133,
-    -133,  -133,    86,  -133,  -133,  -133,  -133,  -133,  -133,    47,
-      47,    47,   147,   148,    17,  -133,   149,   150,   105,   151,
-      24,  -133,  -133,  -133,  -133,  -133,  -133,    90,  -133,  -133,
-    -133,    92,    93,   117,     3,  -133,   119,   152,  -133,   125,
-    -133,   155,   157,    47,  -133,  -133,  -133,  -133,  -133,  -133,
-     156,  -133,   133,   135,  -133,  -133,   100,  -133,  -133,  -133,
-    -133,    42,   156,  -133,  -133,   158,   160,   161,    94,  -133,
-    -133,  -133,  -133,  -133,  -133,   166,   102,   136,   145,    42,
-    -133,   138,  -133,  -133,  -133,  -133,  -133
+      71,  -115,  -115,  -115,     8,     2,    -5,     3,  -115,  -115,
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,
+    -115,  -115,  -115,  -115,     2,   -19,    12,    13,  -115,    15,
+      35,    48,    51,    74,  -115,  -115,  -115,  -115,  -115,    75,
+    -115,    28,  -115,  -115,  -115,  -115,  -115,  -115,  -115,    83,
+    -115,  -115,    84,  -115,  -115,  -115,    53,  -115,  -115,  -115,
+    -115,  -115,  -115,  -115,  -115,  -115,     2,     2,  -115,    65,
+     104,   109,   110,   111,   112,  -115,    12,  -115,   113,    76,
+     114,   116,   115,   120,   121,    13,  -115,  -115,  -115,   125,
+     123,   124,     2,     2,     2,  -115,    90,  -115,   126,    92,
+    -115,   130,   131,  -115,     2,    13,   117,  -115,  -115,  -115,
+    -115,  -115,  -115,  -115,    -2,   132,   133,  -115,    57,    70,
+    -115,  -115,  -115,  -115,  -115,  -115,    73,  -115,  -115,  -115,
+    -115,  -115,   135,   134,  -115,  -115,    14,  -115,  -115,   117,
+    -115,   138,   140,   141,    -2,  -115,     9,  -115,   132,    44,
+     133,  -115,  -115,   139,   142,   143,  -115,  -115,  -115,  -115,
+      82,  -115,  -115,  -115,  -115,  -115,  -115,   144,  -115,  -115,
+    -115,  -115,    93,  -115,  -115,  -115,  -115,  -115,  -115,    -1,
+      -1,    -1,   147,   148,     6,  -115,   149,   150,   118,   151,
+      44,  -115,  -115,  -115,  -115,  -115,  -115,    94,  -115,  -115,
+    -115,    95,    96,   105,     2,  -115,   122,   152,  -115,   128,
+    -115,   154,   155,    -1,  -115,  -115,  -115,  -115,  -115,  -115,
+     153,  -115,   129,   145,  -115,  -115,   103,  -115,  -115,  -115,
+    -115,    60,   153,  -115,  -115,   158,   159,   161,  -115,    97,
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,   168,   136,   146,
+     156,   169,    60,  -115,   137,  -115,  -115,  -115,   160,  -115,
+    -115,  -115
   };
 
   const unsigned char
@@ -1773,24 +1771,25 @@ namespace isc { namespace agent {
       95,     0,     0,     0,     0,    70,     0,     0,   132,     0,
      122,     0,     0,     0,    87,    89,    91,    75,    77,   131,
        0,   134,     0,     0,    93,   139,     0,   137,   100,   103,
-     102,     0,     0,   136,   147,     0,     0,     0,     0,   141,
-     143,   144,   145,   146,   138,     0,     0,     0,     0,     0,
-     140,     0,   149,   150,   151,   142,   148
+     102,     0,     0,   136,   148,     0,     0,     0,   153,     0,
+     141,   143,   144,   145,   146,   147,   138,     0,     0,     0,
+       0,     0,     0,   140,     0,   150,   151,   152,     0,   142,
+     149,   154
   };
 
-  const short
+  const signed char
   AgentParser::yypgoto_[] =
   {
-    -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,   -24,    37,
-    -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,   -23,  -133,
-    -133,  -133,    97,  -133,  -133,    66,    87,  -133,  -133,  -133,
-     -22,  -133,   -21,  -133,  -133,  -133,  -133,  -133,    27,  -133,
-    -133,    -7,  -133,  -133,  -133,  -133,  -133,  -133,  -133,    32,
-    -133,  -133,  -133,  -133,  -133,  -133,  -132,   -32,  -133,  -133,
-    -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,
-    -133,  -133,    43,  -105,  -133,  -133,    33,  -133,  -133,    -6,
-    -133,  -133,  -133,  -133,  -133,  -133,  -133,  -133,   -47,  -133,
-    -133,   -63,  -133,  -133,  -133,  -133,  -133
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,   -24,    40,
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,   -23,  -115,
+    -115,  -115,    80,  -115,  -115,    69,    91,  -115,  -115,  -115,
+     -22,  -115,   -21,  -115,  -115,  -115,  -115,  -115,    27,  -115,
+    -115,    -7,  -115,  -115,  -115,  -115,  -115,  -115,  -115,    34,
+    -115,  -115,  -115,  -115,  -115,  -115,  -114,   -31,  -115,  -115,
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,
+    -115,  -115,    45,  -105,  -115,  -115,    33,  -115,  -115,    -4,
+    -115,  -115,  -115,  -115,  -115,  -115,  -115,  -115,   -47,  -115,
+    -115,   -65,  -115,  -115,  -115,  -115,  -115,  -115,  -115
   };
 
   const short
@@ -1805,107 +1804,112 @@ namespace isc { namespace agent {
      200,   212,   230,    44,    72,    45,    73,    46,    74,    47,
       71,   119,   120,    64,    84,   136,   137,   149,   172,   173,
      174,   186,   175,   176,   189,   177,   187,   226,   227,   231,
-     238,   239,   240,   245,   241,   242,   243
+     239,   240,   241,   247,   242,   243,   244,   245,   251
   };
 
   const unsigned short
   AgentParser::yytable_[] =
   {
-      28,   121,    34,    40,    55,    60,    61,     8,     9,    20,
-      10,    22,    11,    31,   122,   123,   124,    35,   157,   158,
-      48,    49,    50,    51,    52,    76,    65,    36,    37,    38,
-      77,    53,    66,    39,   121,    54,    39,    50,    51,    39,
-     157,   158,    87,    88,    12,    13,    14,    15,   201,   202,
-      39,   165,   166,    40,   167,   168,   150,    68,    67,   151,
-      50,    51,    55,    60,    61,    39,   192,   193,   107,   108,
-     109,   234,    85,    85,   235,   236,   237,    86,   138,    69,
-     117,   139,    55,    60,    61,   144,   140,   184,    39,   190,
-     145,   125,   185,   213,   191,   213,   213,   249,   214,    75,
-     215,   216,   250,   232,    89,    79,   233,    82,    90,     1,
-       2,     3,    91,    92,    93,    94,    96,    97,    98,    99,
-     100,   125,   101,   159,   102,   104,   169,   170,   171,   105,
-     106,    10,   110,   115,   116,   111,   147,   113,   131,   135,
-     148,   179,    54,   153,   154,   155,   252,   208,   188,   180,
-     181,   203,   204,   206,   207,   209,   229,   220,   217,   222,
-     219,   223,   246,   225,   247,   248,   221,   169,   170,   171,
-     251,   118,   103,    95,   228,   164,   156,   205,   253,   256,
-     218,   224,   152,   178,   210,   244,   255,   254
+      28,   121,    20,    40,    55,    60,    61,     9,     8,    10,
+      22,    11,    50,    51,   122,   123,   124,   150,   192,   193,
+     151,    65,    34,    31,    48,    49,    50,    51,    52,   157,
+     158,    76,   157,   158,   121,    53,    77,    35,    66,    54,
+      39,    39,    87,    88,    12,    13,    14,    15,    36,    37,
+      38,    39,    67,    40,    39,    39,    85,    50,    51,    68,
+      85,    86,    55,    60,    61,   138,   201,   202,   107,   108,
+     109,   165,   166,   139,   167,   168,   144,    69,   140,    75,
+     117,   145,    55,    60,    61,   184,    39,    79,    82,   234,
+     185,   125,   235,   236,   237,   238,   190,   213,   213,   213,
+     252,   191,   214,   215,   216,   253,   232,    89,    90,   233,
+       1,     2,     3,    91,    92,    93,    94,    96,    98,    97,
+      99,   125,   100,   159,   101,   102,   169,   170,   171,   104,
+     105,   106,   110,    10,   113,   115,   116,   148,   111,   131,
+     135,   147,   153,    54,   154,   155,   179,   217,   188,   180,
+     181,   203,   204,   206,   207,   209,    95,   220,   222,   223,
+     225,   208,   248,   249,   219,   250,   229,   169,   170,   171,
+     221,   228,   254,   258,   118,   164,   103,   205,   156,   260,
+     218,   255,   224,   178,   152,   246,   210,   259,     0,   256,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   257,
+       0,     0,   261
   };
 
-  const unsigned char
+  const short
   AgentParser::yycheck_[] =
   {
-      24,   106,    10,    26,    27,    27,    27,     0,     5,     7,
-       7,     7,     9,    41,    16,    17,    18,    25,    23,    24,
-      11,    12,    13,    14,    15,     3,     6,    35,    36,    37,
-       8,    22,     3,    41,   139,    26,    41,    13,    14,    41,
-      23,    24,    66,    67,    41,    42,    43,    44,   180,   181,
-      41,    27,    28,    76,    30,    31,     3,     8,     4,     6,
-      13,    14,    85,    85,    85,    41,    19,    20,    92,    93,
-      94,    29,     3,     3,    32,    33,    34,     8,     8,     3,
-     104,     3,   105,   105,   105,     3,     8,     3,    41,     3,
-       8,   114,     8,     3,     8,     3,     3,     3,     8,     4,
-       8,     8,     8,     3,    41,     4,     6,     4,     4,    38,
-      39,    40,     4,     4,     4,     4,     4,    42,     4,     4,
-       7,   144,     4,   146,     4,     4,   149,   149,   149,     7,
-       7,     7,    41,     5,     5,    98,     6,    41,     7,     7,
-       3,     7,    26,     4,     4,     4,    44,    42,     4,     7,
-       7,     4,     4,     4,     4,     4,    21,     5,    41,     4,
-      41,     4,     4,     7,     4,     4,    41,   190,   190,   190,
-       4,   105,    85,    76,    41,   148,   144,   184,    42,    41,
-     204,   213,   139,   150,   190,   232,   249,    42
+      24,   106,     7,    26,    27,    27,    27,     5,     0,     7,
+       7,     9,    13,    14,    16,    17,    18,     3,    19,    20,
+       6,     6,    10,    42,    11,    12,    13,    14,    15,    23,
+      24,     3,    23,    24,   139,    22,     8,    25,     3,    26,
+      42,    42,    66,    67,    42,    43,    44,    45,    36,    37,
+      38,    42,     4,    76,    42,    42,     3,    13,    14,     8,
+       3,     8,    85,    85,    85,     8,   180,   181,    92,    93,
+      94,    27,    28,     3,    30,    31,     3,     3,     8,     4,
+     104,     8,   105,   105,   105,     3,    42,     4,     4,    29,
+       8,   114,    32,    33,    34,    35,     3,     3,     3,     3,
+       3,     8,     8,     8,     8,     8,     3,    42,     4,     6,
+      39,    40,    41,     4,     4,     4,     4,     4,     4,    43,
+       4,   144,     7,   146,     4,     4,   149,   149,   149,     4,
+       7,     7,    42,     7,    42,     5,     5,     3,    98,     7,
+       7,     6,     4,    26,     4,     4,     7,    42,     4,     7,
+       7,     4,     4,     4,     4,     4,    76,     5,     4,     4,
+       7,    43,     4,     4,    42,     4,    21,   190,   190,   190,
+      42,    42,     4,     4,   105,   148,    85,   184,   144,    42,
+     204,    45,   213,   150,   139,   232,   190,   252,    -1,    43,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    43,
+      -1,    -1,    42
   };
 
   const unsigned char
   AgentParser::yystos_[] =
   {
-       0,    38,    39,    40,    46,    47,    48,    49,     0,     5,
-       7,     9,    41,    42,    43,    44,    52,    53,    54,    59,
-       7,    64,     7,    50,    60,    55,    65,    51,    53,    61,
-      62,    41,    57,    58,    10,    25,    35,    36,    37,    41,
-      63,    66,    67,    68,   108,   110,   112,   114,    11,    12,
-      13,    14,    15,    22,    26,    63,    70,    71,    72,    74,
-      75,    77,    79,    91,   118,     6,     3,     4,     8,     3,
-      69,   115,   109,   111,   113,     4,     3,     8,    73,     4,
-      76,    78,     4,    80,   119,     3,     8,    53,    53,    41,
-       4,     4,     4,     4,     4,    67,     4,    42,     4,     4,
-       7,     4,     4,    71,     4,     7,     7,    53,    53,    53,
-      41,    54,    56,    41,    92,     5,     5,    53,    70,   116,
-     117,   118,    16,    17,    18,    63,    93,    94,    95,    97,
-      99,     7,    81,    82,    83,     7,   120,   121,     8,     3,
-       8,    96,    98,   100,     3,     8,    84,     6,     3,   122,
-       3,     6,   117,     4,     4,     4,    94,    23,    24,    63,
-      85,    86,    87,    89,    83,    27,    28,    30,    31,    63,
-      75,    77,   123,   124,   125,   127,   128,   130,   121,     7,
-       7,     7,    88,    90,     3,     8,   126,   131,     4,   129,
-       3,     8,    19,    20,    63,    75,    77,   101,   102,   103,
-     105,   101,   101,     4,     4,    86,     4,     4,    42,     4,
-     124,   104,   106,     3,     8,     8,     8,    41,    53,    41,
-       5,    41,     4,     4,   102,     7,   132,   133,    41,    21,
-     107,   134,     3,     6,    29,    32,    33,    34,   135,   136,
-     137,   139,   140,   141,   133,   138,     4,     4,     4,     3,
-       8,     4,    44,    42,    42,   136,    41
+       0,    39,    40,    41,    47,    48,    49,    50,     0,     5,
+       7,     9,    42,    43,    44,    45,    53,    54,    55,    60,
+       7,    65,     7,    51,    61,    56,    66,    52,    54,    62,
+      63,    42,    58,    59,    10,    25,    36,    37,    38,    42,
+      64,    67,    68,    69,   109,   111,   113,   115,    11,    12,
+      13,    14,    15,    22,    26,    64,    71,    72,    73,    75,
+      76,    78,    80,    92,   119,     6,     3,     4,     8,     3,
+      70,   116,   110,   112,   114,     4,     3,     8,    74,     4,
+      77,    79,     4,    81,   120,     3,     8,    54,    54,    42,
+       4,     4,     4,     4,     4,    68,     4,    43,     4,     4,
+       7,     4,     4,    72,     4,     7,     7,    54,    54,    54,
+      42,    55,    57,    42,    93,     5,     5,    54,    71,   117,
+     118,   119,    16,    17,    18,    64,    94,    95,    96,    98,
+     100,     7,    82,    83,    84,     7,   121,   122,     8,     3,
+       8,    97,    99,   101,     3,     8,    85,     6,     3,   123,
+       3,     6,   118,     4,     4,     4,    95,    23,    24,    64,
+      86,    87,    88,    90,    84,    27,    28,    30,    31,    64,
+      76,    78,   124,   125,   126,   128,   129,   131,   122,     7,
+       7,     7,    89,    91,     3,     8,   127,   132,     4,   130,
+       3,     8,    19,    20,    64,    76,    78,   102,   103,   104,
+     106,   102,   102,     4,     4,    87,     4,     4,    43,     4,
+     125,   105,   107,     3,     8,     8,     8,    42,    54,    42,
+       5,    42,     4,     4,   103,     7,   133,   134,    42,    21,
+     108,   135,     3,     6,    29,    32,    33,    34,    35,   136,
+     137,   138,   140,   141,   142,   143,   134,   139,     4,     4,
+       4,   144,     3,     8,     4,    45,    43,    43,     4,   137,
+      42,    42
   };
 
   const unsigned char
   AgentParser::yyr1_[] =
   {
-       0,    45,    47,    46,    48,    46,    49,    46,    51,    50,
-      52,    53,    53,    53,    53,    53,    53,    53,    55,    54,
-      56,    57,    57,    58,    58,    60,    59,    61,    61,    62,
-      62,    63,    65,    64,    66,    66,    67,    67,    67,    67,
-      67,    67,    69,    68,    70,    70,    71,    71,    71,    71,
-      71,    71,    71,    71,    73,    72,    74,    76,    75,    78,
-      77,    80,    79,    81,    81,    82,    82,    84,    83,    85,
-      85,    85,    86,    86,    88,    87,    90,    89,    92,    91,
-      93,    93,    94,    94,    94,    94,    96,    95,    98,    97,
-     100,    99,   101,   101,   102,   102,   102,   102,   102,   104,
-     103,   106,   105,   107,   109,   108,   111,   110,   113,   112,
-     115,   114,   116,   116,   117,   119,   118,   120,   120,   122,
-     121,   123,   123,   124,   124,   124,   124,   124,   124,   124,
-     126,   125,   127,   129,   128,   131,   130,   132,   132,   134,
-     133,   135,   135,   136,   136,   136,   136,   138,   137,   139,
-     140,   141
+       0,    46,    48,    47,    49,    47,    50,    47,    52,    51,
+      53,    54,    54,    54,    54,    54,    54,    54,    56,    55,
+      57,    58,    58,    59,    59,    61,    60,    62,    62,    63,
+      63,    64,    66,    65,    67,    67,    68,    68,    68,    68,
+      68,    68,    70,    69,    71,    71,    72,    72,    72,    72,
+      72,    72,    72,    72,    74,    73,    75,    77,    76,    79,
+      78,    81,    80,    82,    82,    83,    83,    85,    84,    86,
+      86,    86,    87,    87,    89,    88,    91,    90,    93,    92,
+      94,    94,    95,    95,    95,    95,    97,    96,    99,    98,
+     101,   100,   102,   102,   103,   103,   103,   103,   103,   105,
+     104,   107,   106,   108,   110,   109,   112,   111,   114,   113,
+     116,   115,   117,   117,   118,   120,   119,   121,   121,   123,
+     122,   124,   124,   125,   125,   125,   125,   125,   125,   125,
+     127,   126,   128,   130,   129,   132,   131,   133,   133,   135,
+     134,   136,   136,   137,   137,   137,   137,   137,   139,   138,
+     140,   141,   142,   144,   143
   };
 
   const unsigned char
@@ -1925,8 +1929,8 @@ namespace isc { namespace agent {
        0,     6,     1,     3,     1,     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,     0,     4,     3,
-       3,     3
+       4,     1,     3,     1,     1,     1,     1,     1,     0,     4,
+       3,     3,     3,     0,     4
   };
 
 
@@ -1943,8 +1947,8 @@ namespace isc { namespace agent {
   "\"socket-name\"", "\"socket-type\"", "\"unix\"", "\"hooks-libraries\"",
   "\"library\"", "\"parameters\"", "\"Logging\"", "\"loggers\"",
   "\"name\"", "\"output_options\"", "\"output\"", "\"debuglevel\"",
-  "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp4\"",
-  "\"Dhcp6\"", "\"DhcpDdns\"", "START_JSON", "START_AGENT",
+  "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"pattern\"",
+  "\"Dhcp4\"", "\"Dhcp6\"", "\"DhcpDdns\"", "START_JSON", "START_AGENT",
   "START_SUB_AGENT", "\"constant string\"", "\"integer\"",
   "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2",
   "$@3", "sub_agent", "$@4", "json", "value", "map", "$@5", "map_value",
@@ -1966,29 +1970,29 @@ namespace isc { namespace agent {
   "logger_param", "name", "$@28", "debuglevel", "severity", "$@29",
   "output_options_list", "$@30", "output_options_list_content",
   "output_entry", "$@31", "output_params_list", "output_params", "output",
-  "$@32", "flush", "maxsize", "maxver", YY_NULLPTR
+  "$@32", "flush", "maxsize", "maxver", "pattern", "$@33", YY_NULLPTR
   };
 
 #if AGENT_DEBUG
   const unsigned short
   AgentParser::yyrline_[] =
   {
-       0,   114,   114,   114,   115,   115,   116,   116,   124,   124,
-     135,   141,   142,   143,   144,   145,   146,   147,   151,   151,
-     162,   167,   168,   176,   180,   187,   187,   193,   194,   197,
-     201,   214,   223,   223,   235,   236,   240,   241,   242,   243,
-     244,   245,   249,   249,   266,   267,   272,   273,   274,   275,
-     276,   277,   278,   279,   282,   282,   290,   295,   295,   320,
-     320,   348,   348,   358,   359,   362,   363,   366,   366,   374,
-     375,   376,   379,   380,   383,   383,   391,   391,   401,   401,
-     414,   415,   420,   421,   422,   423,   427,   427,   438,   438,
-     449,   449,   460,   461,   465,   466,   467,   468,   469,   473,
-     473,   482,   482,   490,   496,   496,   503,   503,   510,   510,
-     522,   522,   535,   536,   540,   544,   544,   556,   557,   561,
-     561,   569,   570,   573,   574,   575,   576,   577,   578,   579,
-     582,   582,   590,   595,   595,   603,   603,   613,   614,   617,
-     617,   625,   626,   629,   630,   631,   632,   635,   635,   643,
-     648,   653
+       0,   115,   115,   115,   116,   116,   117,   117,   125,   125,
+     136,   142,   143,   144,   145,   146,   147,   148,   152,   152,
+     163,   168,   169,   177,   181,   188,   188,   194,   195,   198,
+     202,   215,   224,   224,   236,   237,   241,   242,   243,   244,
+     245,   246,   250,   250,   267,   268,   273,   274,   275,   276,
+     277,   278,   279,   280,   283,   283,   291,   296,   296,   321,
+     321,   349,   349,   359,   360,   363,   364,   367,   367,   375,
+     376,   377,   380,   381,   384,   384,   392,   392,   402,   402,
+     415,   416,   421,   422,   423,   424,   428,   428,   439,   439,
+     450,   450,   461,   462,   466,   467,   468,   469,   470,   474,
+     474,   483,   483,   491,   497,   497,   504,   504,   511,   511,
+     523,   523,   536,   537,   541,   545,   545,   557,   558,   562,
+     562,   570,   571,   574,   575,   576,   577,   578,   579,   580,
+     583,   583,   591,   596,   596,   604,   604,   614,   615,   618,
+     618,   626,   627,   630,   631,   632,   633,   634,   637,   637,
+     645,   650,   655,   660,   660
   };
 
   // Print the state stack on the debug stream.
@@ -2021,11 +2025,10 @@ namespace isc { namespace agent {
 #endif // AGENT_DEBUG
 
 
-#line 14 "agent_parser.yy"
+#line 14 "agent_parser.yy" // lalr1.cc:1218
 } } // isc::agent
-#line 2027 "agent_parser.cc"
-
-#line 658 "agent_parser.yy"
+#line 2031 "agent_parser.cc" // lalr1.cc:1218
+#line 668 "agent_parser.yy" // lalr1.cc:1219
 
 
 void
index cdba1f1127a1267ea541e9961933dcfca91265c8..cca5487d11581d12abef987ef192a3657cb91932 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.4.1.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Skeleton interface for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 #ifndef YY_AGENT_AGENT_PARSER_H_INCLUDED
 # define YY_AGENT_AGENT_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "agent_parser.yy"
+#line 17 "agent_parser.yy" // lalr1.cc:404
 
 #include <string>
 #include <cc/data.h>
@@ -55,7 +55,7 @@ using namespace isc::agent;
 using namespace isc::data;
 using namespace std;
 
-#line 59 "agent_parser.h"
+#line 59 "agent_parser.h" // lalr1.cc:404
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -64,14 +64,8 @@ using namespace std;
 # include <string>
 # include <vector>
 
-#if defined __cplusplus
-# define YY_CPLUSPLUS __cplusplus
-#else
-# define YY_CPLUSPLUS 199711L
-#endif
-
 // Support move semantics when possible.
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
 # define YY_MOVE           std::move
 # define YY_MOVE_OR_COPY   move
 # define YY_MOVE_REF(Type) Type&&
@@ -84,22 +78,6 @@ using namespace std;
 # define YY_RVREF(Type)    const Type&
 # define YY_COPY(Type)     const Type&
 #endif
-
-// Support noexcept when possible.
-#if 201103L <= YY_CPLUSPLUS
-# define YY_NOEXCEPT noexcept
-# define YY_NOTHROW
-#else
-# define YY_NOEXCEPT
-# define YY_NOTHROW throw ()
-#endif
-
-// Support constexpr when possible.
-#if 201703 <= YY_CPLUSPLUS
-# define YY_CONSTEXPR constexpr
-#else
-# define YY_CONSTEXPR
-#endif
 # include "location.hh"
 #include <typeinfo>
 #ifndef YYASSERT
@@ -177,80 +155,193 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined AGENT_DEBUG */
 
-#line 14 "agent_parser.yy"
+#line 14 "agent_parser.yy" // lalr1.cc:404
 namespace isc { namespace agent {
-#line 183 "agent_parser.h"
+#line 161 "agent_parser.h" // lalr1.cc:404
+
+  /// A stack with random access from its top.
+  template <typename T, typename S = std::vector<T> >
+  class stack
+  {
+  public:
+    // Hide our reversed order.
+    typedef typename S::reverse_iterator iterator;
+    typedef typename S::const_reverse_iterator const_iterator;
+    typedef typename S::size_type size_type;
 
+    stack (size_type n = 200)
+      : seq_ (n)
+    {}
+
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    T&
+    operator[] (size_type i)
+    {
+      return seq_[size () - 1 - i];
+    }
 
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    T&
+    operator[] (int i)
+    {
+      return operator[] (size_type (i));
+    }
 
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    const T&
+    operator[] (size_type i) const
+    {
+      return seq_[size () - 1 - i];
+    }
 
-  /// A Bison parser.
-  class AgentParser
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    const T&
+    operator[] (int i) const
+    {
+      return operator[] (size_type (i));
+    }
+
+    /// Steal the contents of \a t.
+    ///
+    /// Close to move-semantics.
+    void
+    push (YY_MOVE_REF (T) t)
+    {
+      seq_.push_back (T ());
+      operator[](0).move (t);
+    }
+
+    void
+    pop (int n = 1)
+    {
+      for (; 0 < n; --n)
+        seq_.pop_back ();
+    }
+
+    void
+    clear ()
+    {
+      seq_.clear ();
+    }
+
+    size_type
+    size () const
+    {
+      return seq_.size ();
+    }
+
+    const_iterator
+    begin () const
+    {
+      return seq_.rbegin ();
+    }
+
+    const_iterator
+    end () const
+    {
+      return seq_.rend ();
+    }
+
+  private:
+    stack (const stack&);
+    stack& operator= (const stack&);
+    /// The wrapped container.
+    S seq_;
+  };
+
+  /// Present a slice of the top of a stack.
+  template <typename T, typename S = stack<T> >
+  class slice
   {
   public:
-#ifndef AGENT_STYPE
-  /// A buffer to store and retrieve objects.
+    slice (const S& stack, int range)
+      : stack_ (stack)
+      , range_ (range)
+    {}
+
+    const T&
+    operator[] (int i) const
+    {
+      return stack_[range_ - i];
+    }
+
+  private:
+    const S& stack_;
+    int range_;
+  };
+
+
+
+  /// A char[S] buffer to store and retrieve objects.
   ///
   /// Sort of a variant, but does not keep track of the nature
   /// of the stored data, since that knowledge is available
-  /// via the current parser state.
-  class semantic_type
+  /// via the current state.
+  template <size_t S>
+  struct variant
   {
-  public:
     /// Type of *this.
-    typedef semantic_type self_type;
+    typedef variant<S> self_type;
 
     /// Empty construction.
-    semantic_type () YY_NOEXCEPT
+    variant ()
       : yybuffer_ ()
       , yytypeid_ (YY_NULLPTR)
     {}
 
     /// Construct and fill.
     template <typename T>
-    semantic_type (YY_RVREF (T) t)
+    variant (YY_RVREF (T) t)
       : yytypeid_ (&typeid (T))
     {
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       new (yyas_<T> ()) T (YY_MOVE (t));
     }
 
     /// Destruction, allowed only if empty.
-    ~semantic_type () YY_NOEXCEPT
+    ~variant ()
     {
       YYASSERT (!yytypeid_);
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Instantiate a \a T in here from \a t.
-    template <typename T, typename... U>
-    T&
-    emplace (U&&... u)
-    {
-      YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T (std::forward <U>(u)...);
-    }
-# else
     /// Instantiate an empty \a T in here.
     template <typename T>
     T&
     emplace ()
     {
       YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T ();
     }
 
+# if defined __cplusplus && 201103L <= __cplusplus
+    /// Instantiate a \a T in here from \a t.
+    template <typename T, typename U>
+    T&
+    emplace (U&& u)
+    {
+      YYASSERT (!yytypeid_);
+      YYASSERT (sizeof (T) <= S);
+      yytypeid_ = & typeid (T);
+      return *new (yyas_<T> ()) T (std::forward <U>(u));
+    }
+# else
     /// Instantiate a \a T in here from \a t.
     template <typename T>
     T&
     emplace (const T& t)
     {
       YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T (t);
     }
@@ -277,75 +368,75 @@ namespace isc { namespace agent {
     /// Accessor to a built \a T.
     template <typename T>
     T&
-    as () YY_NOEXCEPT
+    as ()
     {
       YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
     }
 
     /// Const accessor to a built \a T (for %printer).
     template <typename T>
     const T&
-    as () const YY_NOEXCEPT
+    as () const
     {
       YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
     }
 
-    /// Swap the content with \a that, of same type.
+    /// Swap the content with \a other, of same type.
     ///
     /// Both variants must be built beforehand, because swapping the actual
     /// data requires reading it (with as()), and this is not possible on
     /// unconstructed variants: it would require some dynamic testing, which
     /// should not be the variant's responsibility.
     /// Swapping between built and (possibly) non-built is done with
-    /// self_type::move ().
+    /// variant::move ().
     template <typename T>
     void
-    swap (self_type& that) YY_NOEXCEPT
+    swap (self_type& other)
     {
       YYASSERT (yytypeid_);
-      YYASSERT (*yytypeid_ == *that.yytypeid_);
-      std::swap (as<T> (), that.as<T> ());
+      YYASSERT (*yytypeid_ == *other.yytypeid_);
+      std::swap (as<T> (), other.as<T> ());
     }
 
-    /// Move the content of \a that to this.
+    /// Move the content of \a other to this.
     ///
-    /// Destroys \a that.
+    /// Destroys \a other.
     template <typename T>
     void
-    move (self_type& that)
+    move (self_type& other)
     {
-# if 201103L <= YY_CPLUSPLUS
-      emplace<T> (std::move (that.as<T> ()));
+# if defined __cplusplus && 201103L <= __cplusplus
+      emplace<T> (std::move (other.as<T> ()));
 # else
       emplace<T> ();
-      swap<T> (that);
+      swap<T> (other);
 # endif
-      that.destroy<T> ();
+      other.destroy<T> ();
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Move the content of \a that to this.
+# if defined __cplusplus && 201103L <= __cplusplus
+    /// Move the content of \a other to this.
     template <typename T>
     void
-    move (self_type&& that)
+    move (self_type&& other)
     {
-      emplace<T> (std::move (that.as<T> ()));
-      that.destroy<T> ();
+      emplace<T> (std::move (other.as<T> ()));
+      other.destroy<T> ();
     }
 #endif
 
-    /// Copy the content of \a that to this.
+    /// Copy the content of \a other to this.
     template <typename T>
     void
-    copy (const self_type& that)
+    copy (const self_type& other)
     {
-      emplace<T> (that.as<T> ());
+      emplace<T> (other.as<T> ());
     }
 
     /// Destroy the stored \a T.
@@ -360,12 +451,12 @@ namespace isc { namespace agent {
   private:
     /// Prohibit blind copies.
     self_type& operator= (const self_type&);
-    semantic_type (const self_type&);
+    variant (const self_type&);
 
     /// Accessor to raw memory as \a T.
     template <typename T>
     T*
-    yyas_ () YY_NOEXCEPT
+    yyas_ ()
     {
       void *yyp = yybuffer_.yyraw;
       return static_cast<T*> (yyp);
@@ -374,12 +465,30 @@ namespace isc { namespace agent {
     /// Const accessor to raw memory as \a T.
     template <typename T>
     const T*
-    yyas_ () const YY_NOEXCEPT
+    yyas_ () const
     {
       const void *yyp = yybuffer_.yyraw;
       return static_cast<const T*> (yyp);
      }
 
+    union
+    {
+      /// Strongest alignment constraints.
+      long double yyalign_me;
+      /// A buffer large enough to store any of the semantic values.
+      char yyraw[S];
+    } yybuffer_;
+
+    /// Whether the content is built: if defined, the name of the stored type.
+    const std::type_info *yytypeid_;
+  };
+
+
+  /// A Bison parser.
+  class AgentParser
+  {
+  public:
+#ifndef AGENT_STYPE
     /// An auxiliary type to compute the largest semantic type.
     union union_type
     {
@@ -399,24 +508,10 @@ namespace isc { namespace agent {
 
       // "constant string"
       char dummy5[sizeof (std::string)];
-    };
-
-    /// The size of the largest semantic type.
-    enum { size = sizeof (union_type) };
-
-    /// A buffer to store semantic values.
-    union
-    {
-      /// Strongest alignment constraints.
-      long double yyalign_me;
-      /// A buffer large enough to store any of the semantic values.
-      char yyraw[size];
-    } yybuffer_;
-
-    /// Whether the content is built: if defined, the name of the stored type.
-    const std::type_info *yytypeid_;
-  };
+};
 
+    /// Symbol semantic values.
+    typedef variant<sizeof (union_type)> semantic_type;
 #else
     typedef AGENT_STYPE semantic_type;
 #endif
@@ -426,18 +521,7 @@ namespace isc { namespace agent {
     /// Syntax errors thrown from user actions.
     struct syntax_error : std::runtime_error
     {
-      syntax_error (const location_type& l, const std::string& m)
-        : std::runtime_error (m)
-        , location (l)
-      {}
-
-      syntax_error (const syntax_error& s)
-        : std::runtime_error (s.what ())
-        , location (s.location)
-      {}
-
-      ~syntax_error () YY_NOEXCEPT YY_NOTHROW;
-
+      syntax_error (const location_type& l, const std::string& m);
       location_type location;
     };
 
@@ -479,16 +563,17 @@ namespace isc { namespace agent {
         TOKEN_FLUSH = 287,
         TOKEN_MAXSIZE = 288,
         TOKEN_MAXVER = 289,
-        TOKEN_DHCP4 = 290,
-        TOKEN_DHCP6 = 291,
-        TOKEN_DHCPDDNS = 292,
-        TOKEN_START_JSON = 293,
-        TOKEN_START_AGENT = 294,
-        TOKEN_START_SUB_AGENT = 295,
-        TOKEN_STRING = 296,
-        TOKEN_INTEGER = 297,
-        TOKEN_FLOAT = 298,
-        TOKEN_BOOLEAN = 299
+        TOKEN_PATTERN = 290,
+        TOKEN_DHCP4 = 291,
+        TOKEN_DHCP6 = 292,
+        TOKEN_DHCPDDNS = 293,
+        TOKEN_START_JSON = 294,
+        TOKEN_START_AGENT = 295,
+        TOKEN_START_SUB_AGENT = 296,
+        TOKEN_STRING = 297,
+        TOKEN_INTEGER = 298,
+        TOKEN_FLOAT = 299,
+        TOKEN_BOOLEAN = 300
       };
     };
 
@@ -517,150 +602,29 @@ namespace isc { namespace agent {
       typedef Base super_type;
 
       /// Default constructor.
-      basic_symbol ()
-        : value ()
-        , location ()
-      {}
-
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      basic_symbol (basic_symbol&& that);
-#endif
+      basic_symbol ();
+
+      /// Move or copy constructor.
+      basic_symbol (YY_RVREF (basic_symbol) other);
 
-      /// Copy constructor.
-      basic_symbol (const basic_symbol& that);
 
       /// Constructor for valueless symbols, and symbols from each type.
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, location_type&& l)
-        : Base (t)
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const location_type& l)
-        : Base (t)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, ElementPtr&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const ElementPtr& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, bool&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const bool& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, double&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const double& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, int64_t&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const int64_t& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, std::string&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const std::string& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
+      basic_symbol (typename Base::kind_type t, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (ElementPtr) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (bool) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (double) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (int64_t) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (std::string) v, YY_RVREF (location_type) l);
+
 
       /// Destroy the symbol.
-      ~basic_symbol ()
-      {
-        clear ();
-      }
+      ~basic_symbol ();
 
       /// Destroy contents, and record that is empty.
-      void clear ()
-      {
-        // User destructor.
-        symbol_number_type yytype = this->type_get ();
-        basic_symbol<Base>& yysym = *this;
-        (void) yysym;
-        switch (yytype)
-        {
-       default:
-          break;
-        }
-
-        // Type destructor.
-switch (yytype)
-    {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
-        value.template destroy< ElementPtr > ();
-        break;
-
-      case 44: // "boolean"
-        value.template destroy< bool > ();
-        break;
-
-      case 43: // "floating point"
-        value.template destroy< double > ();
-        break;
-
-      case 42: // "integer"
-        value.template destroy< int64_t > ();
-        break;
-
-      case 41: // "constant string"
-        value.template destroy< std::string > ();
-        break;
-
-      default:
-        break;
-    }
-
-        Base::clear ();
-      }
+      void clear ();
 
       /// Whether empty.
-      bool empty () const YY_NOEXCEPT;
+      bool empty () const;
 
       /// Destructive move, \a s is emptied into this.
       void move (basic_symbol& s);
@@ -672,9 +636,9 @@ switch (yytype)
       location_type location;
 
     private:
-#if YY_CPLUSPLUS < 201103L
+#if !defined __cplusplus || __cplusplus < 201103L
       /// Assignment operator.
-      basic_symbol& operator= (const basic_symbol& that);
+      basic_symbol& operator= (const basic_symbol& other);
 #endif
     };
 
@@ -684,13 +648,8 @@ switch (yytype)
       /// Default constructor.
       by_type ();
 
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      by_type (by_type&& that);
-#endif
-
       /// Copy constructor.
-      by_type (const by_type& that);
+      by_type (const by_type& other);
 
       /// The symbol type as needed by the constructor.
       typedef token_type kind_type;
@@ -706,10 +665,10 @@ switch (yytype)
 
       /// The (internal) type number (corresponding to \a type).
       /// \a empty when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+      symbol_number_type type_get () const;
 
       /// The token.
-      token_type token () const YY_NOEXCEPT;
+      token_type token () const;
 
       /// The symbol type.
       /// \a empty_symbol when empty.
@@ -718,81 +677,7 @@ switch (yytype)
     };
 
     /// "External" symbols: returned by the scanner.
-    struct symbol_type : basic_symbol<by_type>
-    {
-      /// Superclass.
-      typedef basic_symbol<by_type> super_type;
-
-      /// Empty symbol.
-      symbol_type () {}
-
-      /// Constructor for valueless symbols, and symbols from each type.
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, location_type l)
-        : super_type(token_type (tok), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_END || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_CONTROL_AGENT || tok == token::TOKEN_HTTP_HOST || tok == token::TOKEN_HTTP_PORT || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_CONTROL_SOCKETS || tok == token::TOKEN_DHCP4_SERVER || tok == token::TOKEN_DHCP6_SERVER || tok == token::TOKEN_D2_SERVER || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_UNIX || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_LOGGING || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_NAME || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_DHCP4 || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DHCPDDNS || tok == token::TOKEN_START_JSON || tok == token::TOKEN_START_AGENT || tok == token::TOKEN_START_SUB_AGENT);
-      }
-#else
-      symbol_type (int tok, const location_type& l)
-        : super_type(token_type (tok), l)
-      {
-        YYASSERT (tok == token::TOKEN_END || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_CONTROL_AGENT || tok == token::TOKEN_HTTP_HOST || tok == token::TOKEN_HTTP_PORT || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_CONTROL_SOCKETS || tok == token::TOKEN_DHCP4_SERVER || tok == token::TOKEN_DHCP6_SERVER || tok == token::TOKEN_D2_SERVER || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_UNIX || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_LOGGING || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_NAME || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_DHCP4 || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DHCPDDNS || tok == token::TOKEN_START_JSON || tok == token::TOKEN_START_AGENT || tok == token::TOKEN_START_SUB_AGENT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, bool v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_BOOLEAN);
-      }
-#else
-      symbol_type (int tok, const bool& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_BOOLEAN);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, double v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_FLOAT);
-      }
-#else
-      symbol_type (int tok, const double& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_FLOAT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, int64_t v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_INTEGER);
-      }
-#else
-      symbol_type (int tok, const int64_t& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_INTEGER);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, std::string v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_STRING);
-      }
-#else
-      symbol_type (int tok, const std::string& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_STRING);
-      }
-#endif
-    };
+    typedef basic_symbol<by_type> symbol_type;
 
     /// Build a parser object.
     AgentParser (isc::agent::ParserContext& ctx_yyarg);
@@ -828,652 +713,183 @@ switch (yytype)
     /// Report a syntax error.
     void error (const syntax_error& err);
 
-    // Implementation of make_symbol for each symbol type.
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_END (location_type l)
-      {
-        return symbol_type (token::TOKEN_END, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_END (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_END, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COMMA (location_type l)
-      {
-        return symbol_type (token::TOKEN_COMMA, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COMMA (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COMMA, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COLON (location_type l)
-      {
-        return symbol_type (token::TOKEN_COLON, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COLON (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COLON, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LSQUARE_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_LSQUARE_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LSQUARE_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LSQUARE_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RSQUARE_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_RSQUARE_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RSQUARE_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RSQUARE_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LCURLY_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_LCURLY_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LCURLY_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LCURLY_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RCURLY_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_RCURLY_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RCURLY_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RCURLY_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NULL_TYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_NULL_TYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NULL_TYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NULL_TYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONTROL_AGENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_AGENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONTROL_AGENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_AGENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HTTP_HOST (location_type l)
-      {
-        return symbol_type (token::TOKEN_HTTP_HOST, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HTTP_HOST (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HTTP_HOST, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HTTP_PORT (location_type l)
-      {
-        return symbol_type (token::TOKEN_HTTP_PORT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HTTP_PORT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HTTP_PORT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_USER_CONTEXT (location_type l)
-      {
-        return symbol_type (token::TOKEN_USER_CONTEXT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_USER_CONTEXT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_USER_CONTEXT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COMMENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_COMMENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COMMENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COMMENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONTROL_SOCKETS (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_SOCKETS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONTROL_SOCKETS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_SOCKETS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP4_SERVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP4_SERVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP4_SERVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP4_SERVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP6_SERVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP6_SERVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP6_SERVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP6_SERVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_D2_SERVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_D2_SERVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_D2_SERVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_D2_SERVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SOCKET_NAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_NAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SOCKET_NAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_NAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SOCKET_TYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_TYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SOCKET_TYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_TYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_UNIX (location_type l)
-      {
-        return symbol_type (token::TOKEN_UNIX, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_UNIX (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_UNIX, 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
-      make_LOGGING (location_type l)
-      {
-        return symbol_type (token::TOKEN_LOGGING, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LOGGING (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LOGGING, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LOGGERS (location_type l)
-      {
-        return symbol_type (token::TOKEN_LOGGERS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LOGGERS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LOGGERS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_NAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OUTPUT_OPTIONS (location_type l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT_OPTIONS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OUTPUT_OPTIONS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT_OPTIONS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OUTPUT (location_type l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OUTPUT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DEBUGLEVEL (location_type l)
-      {
-        return symbol_type (token::TOKEN_DEBUGLEVEL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DEBUGLEVEL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DEBUGLEVEL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SEVERITY (location_type l)
-      {
-        return symbol_type (token::TOKEN_SEVERITY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SEVERITY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SEVERITY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLUSH (location_type l)
-      {
-        return symbol_type (token::TOKEN_FLUSH, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLUSH (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLUSH, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAXSIZE (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAXSIZE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAXSIZE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAXSIZE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAXVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAXVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAXVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAXVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP4 (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP4, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP4 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP4, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCPDDNS (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCPDDNS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCPDDNS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCPDDNS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_START_JSON (location_type l)
-      {
-        return symbol_type (token::TOKEN_START_JSON, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_START_JSON (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_START_JSON, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_START_AGENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_START_AGENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_START_AGENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_START_AGENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_START_SUB_AGENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_START_SUB_AGENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_START_SUB_AGENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_START_SUB_AGENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_STRING (std::string v, location_type l)
-      {
-        return symbol_type (token::TOKEN_STRING, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_STRING (const std::string& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_STRING, v, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTEGER (int64_t v, location_type l)
-      {
-        return symbol_type (token::TOKEN_INTEGER, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTEGER (const int64_t& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTEGER, v, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLOAT (double v, location_type l)
-      {
-        return symbol_type (token::TOKEN_FLOAT, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLOAT (const double& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLOAT, v, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BOOLEAN (bool v, location_type l)
-      {
-        return symbol_type (token::TOKEN_BOOLEAN, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_BOOLEAN (const bool& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_BOOLEAN, v, l);
-      }
-#endif
+    // Symbol constructors declarations.
+    static
+    symbol_type
+    make_END (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COMMA (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COLON (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LSQUARE_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RSQUARE_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LCURLY_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RCURLY_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NULL_TYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONTROL_AGENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HTTP_HOST (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HTTP_PORT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_USER_CONTEXT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COMMENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONTROL_SOCKETS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP4_SERVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP6_SERVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_D2_SERVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SOCKET_NAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SOCKET_TYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_UNIX (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOOKS_LIBRARIES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LIBRARY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PARAMETERS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LOGGING (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LOGGERS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OUTPUT_OPTIONS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OUTPUT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DEBUGLEVEL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SEVERITY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLUSH (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAXSIZE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAXVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PATTERN (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP4 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCPDDNS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_START_JSON (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_START_AGENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_START_SUB_AGENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l);
+
 
 
   private:
@@ -1503,7 +919,7 @@ switch (yytype)
     /// \param yyvalue   the value to check
     static bool yy_table_value_is_error_ (int yyvalue);
 
-    static const short yypact_ninf_;
+    static const signed char yypact_ninf_;
     static const signed char yytable_ninf_;
 
     /// Convert a scanner token number \a t to a symbol number.
@@ -1520,7 +936,7 @@ switch (yytype)
   static const unsigned char yydefact_[];
 
   // YYPGOTO[NTERM-NUM].
-  static const short yypgoto_[];
+  static const signed char yypgoto_[];
 
   // YYDEFGOTO[NTERM-NUM].
   static const short yydefgoto_[];
@@ -1530,7 +946,7 @@ switch (yytype)
   // number is the opposite.  If YYTABLE_NINF, syntax error.
   static const unsigned short yytable_[];
 
-  static const unsigned char yycheck_[];
+  static const short yycheck_[];
 
   // YYSTOS[STATE-NUM] -- The (internal number of the) accessing
   // symbol of state STATE-NUM.
@@ -1581,26 +997,26 @@ switch (yytype)
     struct by_state
     {
       /// Default constructor.
-      by_state () YY_NOEXCEPT;
+      by_state ();
 
       /// The symbol type as needed by the constructor.
       typedef state_type kind_type;
 
       /// Constructor.
-      by_state (kind_type s) YY_NOEXCEPT;
+      by_state (kind_type s);
 
       /// Copy constructor.
-      by_state (const by_state& that) YY_NOEXCEPT;
+      by_state (const by_state& other);
 
       /// Record that this symbol is empty.
-      void clear () YY_NOEXCEPT;
+      void clear ();
 
       /// Steal the symbol type from \a that.
       void move (by_state& that);
 
       /// The (internal) type number (corresponding to \a state).
       /// \a empty_symbol when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+      symbol_number_type type_get () const;
 
       /// The state number used to denote an empty symbol.
       enum { empty_state = -1 };
@@ -1621,137 +1037,13 @@ switch (yytype)
       stack_symbol_type (YY_RVREF (stack_symbol_type) that);
       /// Steal the contents from \a sym to build this.
       stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym);
-#if YY_CPLUSPLUS < 201103L
+#if !defined __cplusplus || __cplusplus < 201103L
       /// Assignment, needed by push_back by some old implementations.
       /// Moves the contents of that.
       stack_symbol_type& operator= (stack_symbol_type& that);
 #endif
     };
 
-    /// A stack with random access from its top.
-    template <typename T, typename S = std::vector<T> >
-    class stack
-    {
-    public:
-      // Hide our reversed order.
-      typedef typename S::reverse_iterator iterator;
-      typedef typename S::const_reverse_iterator const_iterator;
-      typedef typename S::size_type size_type;
-
-      stack (size_type n = 200)
-        : seq_ (n)
-      {}
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      T&
-      operator[] (size_type i)
-      {
-        return seq_[size () - 1 - i];
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      T&
-      operator[] (int i)
-      {
-        return operator[] (size_type (i));
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      const T&
-      operator[] (size_type i) const
-      {
-        return seq_[size () - 1 - i];
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      const T&
-      operator[] (int i) const
-      {
-        return operator[] (size_type (i));
-      }
-
-      /// Steal the contents of \a t.
-      ///
-      /// Close to move-semantics.
-      void
-      push (YY_MOVE_REF (T) t)
-      {
-        seq_.push_back (T ());
-        operator[] (0).move (t);
-      }
-
-      /// Pop elements from the stack.
-      void
-      pop (int n = 1) YY_NOEXCEPT
-      {
-        for (; 0 < n; --n)
-          seq_.pop_back ();
-      }
-
-      /// Pop all elements from the stack.
-      void
-      clear () YY_NOEXCEPT
-      {
-        seq_.clear ();
-      }
-
-      /// Number of elements on the stack.
-      size_type
-      size () const YY_NOEXCEPT
-      {
-        return seq_.size ();
-      }
-
-      /// Iterator on top of the stack (going downwards).
-      const_iterator
-      begin () const YY_NOEXCEPT
-      {
-        return seq_.rbegin ();
-      }
-
-      /// Bottom of the stack.
-      const_iterator
-      end () const YY_NOEXCEPT
-      {
-        return seq_.rend ();
-      }
-
-      /// Present a slice of the top of a stack.
-      class slice
-      {
-      public:
-        slice (const stack& stack, int range)
-          : stack_ (stack)
-          , range_ (range)
-        {}
-
-        const T&
-        operator[] (int i) const
-        {
-          return stack_[range_ - i];
-        }
-
-      private:
-        const stack& stack_;
-        int range_;
-      };
-
-    private:
-      stack (const stack&);
-      stack& operator= (const stack&);
-      /// The wrapped container.
-      S seq_;
-    };
-
-
     /// Stack type.
     typedef stack<stack_symbol_type> stack_type;
 
@@ -1780,12 +1072,12 @@ switch (yytype)
     enum
     {
       yyeof_ = 0,
-      yylast_ = 187,     ///< Last index in yytable_.
-      yynnts_ = 97,  ///< Number of nonterminal symbols.
+      yylast_ = 202,     ///< Last index in yytable_.
+      yynnts_ = 99,  ///< Number of nonterminal symbols.
       yyfinal_ = 8, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
-      yyntokens_ = 45  ///< Number of tokens.
+      yyntokens_ = 46  ///< Number of tokens.
     };
 
 
@@ -1793,17 +1085,16 @@ switch (yytype)
     isc::agent::ParserContext& ctx;
   };
 
+  // Symbol number corresponding to token number t.
   inline
   AgentParser::token_number_type
   AgentParser::yytranslate_ (token_type t)
   {
-    // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to
-    // TOKEN-NUM as returned by yylex.
     static
     const token_number_type
     translate_table[] =
     {
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1832,9 +1123,10 @@ switch (yytype)
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45
     };
-    const unsigned user_token_number_max_ = 299;
+    const unsigned user_token_number_max_ = 300;
     const token_number_type undef_token_ = 2;
 
     if (static_cast<int> (t) <= yyeof_)
@@ -1845,36 +1137,47 @@ switch (yytype)
       return undef_token_;
   }
 
+  inline
+  AgentParser::syntax_error::syntax_error (const location_type& l, const std::string& m)
+    : std::runtime_error (m)
+    , location (l)
+  {}
+
   // basic_symbol.
-#if 201103L <= YY_CPLUSPLUS
   template <typename Base>
-  AgentParser::basic_symbol<Base>::basic_symbol (basic_symbol&& that)
-    : Base (std::move (that))
+  AgentParser::basic_symbol<Base>::basic_symbol ()
+    : value ()
+    , location ()
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (YY_RVREF (basic_symbol) other)
+    : Base (YY_MOVE (other))
     , value ()
-    , location (std::move (that.location))
+    , location (YY_MOVE (other.location))
   {
-    switch (this->type_get ())
+    switch (other.type_get ())
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
-        value.move< ElementPtr > (std::move (that.value));
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
+        value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (other.value));
         break;
 
-      case 44: // "boolean"
-        value.move< bool > (std::move (that.value));
+      case 45: // "boolean"
+        value.YY_MOVE_OR_COPY< bool > (YY_MOVE (other.value));
         break;
 
-      case 43: // "floating point"
-        value.move< double > (std::move (that.value));
+      case 44: // "floating point"
+        value.YY_MOVE_OR_COPY< double > (YY_MOVE (other.value));
         break;
 
-      case 42: // "integer"
-        value.move< int64_t > (std::move (that.value));
+      case 43: // "integer"
+        value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (other.value));
         break;
 
-      case 41: // "constant string"
-        value.move< std::string > (std::move (that.value));
+      case 42: // "constant string"
+        value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (other.value));
         break;
 
       default:
@@ -1882,49 +1185,107 @@ switch (yytype)
     }
 
   }
-#endif
 
+
+  // Implementation of basic_symbol constructor for each type.
   template <typename Base>
-  AgentParser::basic_symbol<Base>::basic_symbol (const basic_symbol& that)
-    : Base (that)
-    , value ()
-    , location (that.location)
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (location_type) l)
+    : Base (t)
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (ElementPtr) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (bool) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (double) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (int64_t) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (std::string) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+
+
+  template <typename Base>
+  AgentParser::basic_symbol<Base>::~basic_symbol ()
   {
-    switch (this->type_get ())
+    clear ();
+  }
+
+  template <typename Base>
+  void
+  AgentParser::basic_symbol<Base>::clear ()
+  {
+    // User destructor.
+    symbol_number_type yytype = this->type_get ();
+    basic_symbol<Base>& yysym = *this;
+    (void) yysym;
+    switch (yytype)
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
-        value.copy< ElementPtr > (YY_MOVE (that.value));
+   default:
+      break;
+    }
+
+    // Type destructor.
+  switch (yytype)
+    {
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
+        value.template destroy< ElementPtr > ();
         break;
 
-      case 44: // "boolean"
-        value.copy< bool > (YY_MOVE (that.value));
+      case 45: // "boolean"
+        value.template destroy< bool > ();
         break;
 
-      case 43: // "floating point"
-        value.copy< double > (YY_MOVE (that.value));
+      case 44: // "floating point"
+        value.template destroy< double > ();
         break;
 
-      case 42: // "integer"
-        value.copy< int64_t > (YY_MOVE (that.value));
+      case 43: // "integer"
+        value.template destroy< int64_t > ();
         break;
 
-      case 41: // "constant string"
-        value.copy< std::string > (YY_MOVE (that.value));
+      case 42: // "constant string"
+        value.template destroy< std::string > ();
         break;
 
       default:
         break;
     }
 
+    Base::clear ();
   }
 
-
-
   template <typename Base>
   bool
-  AgentParser::basic_symbol<Base>::empty () const YY_NOEXCEPT
+  AgentParser::basic_symbol<Base>::empty () const
   {
     return Base::type_get () == empty_symbol;
   }
@@ -1936,25 +1297,25 @@ switch (yytype)
     super_type::move (s);
     switch (this->type_get ())
     {
-      case 53: // value
-      case 56: // map_value
-      case 107: // socket_type_value
+      case 54: // value
+      case 57: // map_value
+      case 108: // socket_type_value
         value.move< ElementPtr > (YY_MOVE (s.value));
         break;
 
-      case 44: // "boolean"
+      case 45: // "boolean"
         value.move< bool > (YY_MOVE (s.value));
         break;
 
-      case 43: // "floating point"
+      case 44: // "floating point"
         value.move< double > (YY_MOVE (s.value));
         break;
 
-      case 42: // "integer"
+      case 43: // "integer"
         value.move< int64_t > (YY_MOVE (s.value));
         break;
 
-      case 41: // "constant string"
+      case 42: // "constant string"
         value.move< std::string > (YY_MOVE (s.value));
         break;
 
@@ -1971,18 +1332,9 @@ switch (yytype)
     : type (empty_symbol)
   {}
 
-#if 201103L <= YY_CPLUSPLUS
-  inline
-  AgentParser::by_type::by_type (by_type&& that)
-    : type (that.type)
-  {
-    that.clear ();
-  }
-#endif
-
   inline
-  AgentParser::by_type::by_type (const by_type& that)
-    : type (that.type)
+  AgentParser::by_type::by_type (const by_type& other)
+    : type (other.type)
   {}
 
   inline
@@ -2007,14 +1359,14 @@ switch (yytype)
 
   inline
   int
-  AgentParser::by_type::type_get () const YY_NOEXCEPT
+  AgentParser::by_type::type_get () const
   {
     return type;
   }
 
   inline
   AgentParser::token_type
-  AgentParser::by_type::token () const YY_NOEXCEPT
+  AgentParser::by_type::token () const
   {
     // YYTOKNUM[NUM] -- (External) token number corresponding to the
     // (internal) symbol number NUM (which must be that of a token).  */
@@ -2026,15 +1378,324 @@ switch (yytype)
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299
+     295,   296,   297,   298,   299,   300
     };
-    return token_type (yytoken_number_[type]);
+    return static_cast<token_type> (yytoken_number_[type]);
   }
 
-#line 14 "agent_parser.yy"
-} } // isc::agent
-#line 2037 "agent_parser.h"
+  // Implementation of make_symbol for each symbol type.
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_END (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_END, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_COMMA (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COMMA, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_COLON (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COLON, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_LSQUARE_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LSQUARE_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_RSQUARE_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RSQUARE_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_LCURLY_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LCURLY_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_RCURLY_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RCURLY_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_NULL_TYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NULL_TYPE, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_CONTROL_AGENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONTROL_AGENT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_HTTP_HOST (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HTTP_HOST, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_HTTP_PORT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HTTP_PORT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_USER_CONTEXT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_USER_CONTEXT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_COMMENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COMMENT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_CONTROL_SOCKETS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONTROL_SOCKETS, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DHCP4_SERVER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP4_SERVER, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DHCP6_SERVER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP6_SERVER, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_D2_SERVER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_D2_SERVER, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_SOCKET_NAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SOCKET_NAME, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_SOCKET_TYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SOCKET_TYPE, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_UNIX (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_UNIX, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_HOOKS_LIBRARIES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOOKS_LIBRARIES, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_LIBRARY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LIBRARY, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_PARAMETERS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PARAMETERS, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_LOGGING (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LOGGING, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_LOGGERS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LOGGERS, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_NAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NAME, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_OUTPUT_OPTIONS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OUTPUT_OPTIONS, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_OUTPUT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OUTPUT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DEBUGLEVEL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DEBUGLEVEL, YY_MOVE (l));
+  }
 
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_SEVERITY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SEVERITY, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_FLUSH (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLUSH, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_MAXSIZE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAXSIZE, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_MAXVER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAXVER, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_PATTERN (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PATTERN, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DHCP4 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP4, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DHCP6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP6, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_DHCPDDNS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCPDDNS, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_START_JSON (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_START_JSON, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_START_AGENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_START_AGENT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_START_SUB_AGENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_START_SUB_AGENT, YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_STRING, YY_MOVE (v), YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_INTEGER, YY_MOVE (v), YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLOAT, YY_MOVE (v), YY_MOVE (l));
+  }
+
+  inline
+  AgentParser::symbol_type
+  AgentParser::make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_BOOLEAN, YY_MOVE (v), YY_MOVE (l));
+  }
+
+
+#line 14 "agent_parser.yy" // lalr1.cc:404
+} } // isc::agent
+#line 1699 "agent_parser.h" // lalr1.cc:404
 
 
 
index 3c9a09535243cc6e5a370fb3c922788856e05476..9ee2c012bc8d358b971b53f156fe29a6452f5045 100644 (file)
@@ -77,6 +77,7 @@ using namespace std;
   FLUSH "flush"
   MAXSIZE "maxsize"
   MAXVER "maxver"
+  PATTERN "pattern"
 
   DHCP4 "Dhcp4"
   DHCP6 "Dhcp6"
@@ -630,6 +631,7 @@ output_params: output
              | flush
              | maxsize
              | maxver
+             | pattern
              ;
 
 output: OUTPUT {
@@ -655,6 +657,14 @@ maxver: MAXVER COLON INTEGER {
     ctx.stack_.back()->set("maxver", maxver);
 }
 
+pattern: PATTERN {
+    ctx.enter(ctx.NO_KEYWORDS);
+} COLON STRING {
+    ElementPtr sev(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("pattern", sev);
+    ctx.leave();
+};
+
 %%
 
 void
index 6317900f82997d9a6d9f62e018dff88ecf250136..c9ad0e6e4eafe968269fb719c3e6d95bf35e4393 100644 (file)
@@ -1,9 +1,8 @@
-// Generated 201906181714
-// A Bison parser, made by GNU Bison 3.4.1.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Locations for Bison parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 #  endif
 # endif
 
-#line 14 "agent_parser.yy"
+#line 14 "agent_parser.yy" // location.cc:339
 namespace isc { namespace agent {
-#line 60 "location.hh"
-
+#line 60 "location.hh" // location.cc:339
   /// A point in a source file.
   class position
   {
@@ -318,8 +316,7 @@ namespace isc { namespace agent {
     return ostr;
   }
 
-#line 14 "agent_parser.yy"
+#line 14 "agent_parser.yy" // location.cc:339
 } } // isc::agent
-#line 323 "location.hh"
-
+#line 322 "location.hh" // location.cc:339
 #endif // !YY_AGENT_LOCATION_HH_INCLUDED
index 160393c15e766e1433b659a275e92604cf82588e..22ef35f744d2e26eb583a751ca8d621cf4b3a5bd 100644 (file)
@@ -1,5 +1,4 @@
-// Generated 201906181714
-// A Bison parser, made by GNU Bison 3.4.1.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined in "location.hh".
index 958da53ee1e4681c6d6548a82d300c34a602564b..81e152d836b96a78a0b6b5cd75d1557e8601f5d0 100644 (file)
@@ -1,5 +1,4 @@
-// Generated 201906181714
-// A Bison parser, made by GNU Bison 3.4.1.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined with the parser itself.