]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[master] Finished merge of trac4232a (IP address literal)
authorFrancis Dupont <fdupont@isc.org>
Fri, 18 Mar 2016 10:04:02 +0000 (11:04 +0100)
committerFrancis Dupont <fdupont@isc.org>
Fri, 18 Mar 2016 10:04:02 +0000 (11:04 +0100)
13 files changed:
1  2 
ChangeLog
doc/guide/classify.xml
src/lib/eval/lexer.cc
src/lib/eval/lexer.ll
src/lib/eval/location.hh
src/lib/eval/parser.cc
src/lib/eval/parser.h
src/lib/eval/parser.yy
src/lib/eval/position.hh
src/lib/eval/stack.hh
src/lib/eval/tests/context_unittest.cc
src/lib/eval/tests/token_unittest.cc
src/lib/eval/token.h

diff --cc ChangeLog
index b8f2e73ea943470592044ed3ea7eba199902529d,eb48dfdd55b4d51bd41fcc7f369a6c1b2cee984e..985abe9595d9812e14f655ef2bf5cf29ce13eaa6
+++ b/ChangeLog
@@@ -1,40 -1,3 +1,45 @@@
++1090. [func]          fdupont
++      Added support for IP address (IPv4 and IPv6) literals in
++      classification expressions.
++      (Trac #4232, git xxx)
++
 +1089. [func]          fdupont
 +      Added relay4[X].exists method in classifications that checks
 +      whether a sub-option is present in theDHCPv4 RAI (Relay Agent
 +      Information, 82) option.
 +      (Trac #4313, git 87397fd75215b69ad79708aaa1d7505aca299fb5)
 +
 +1088. [bug]           fdupont
 +      Protected DHCP server main() routines against errors raised from
 +      logger calls in the error handler (aka double errors).
 +      (Trac #4310, git 6813e1a7520335f6920ff8de5e52ecdb24712910)
 +
 +1087. [bug]           fdupont
 +      Empty option specifications no longer require setting the
 +      csv-format parameter.
 +      (Trac #4291, git 398458f3ad4680fd5f3c032eb6c99d50c2981368)
 +
 +1086. [func]          marcin
 +      The Host class has been extended to store DHCP options to
 +      be assigned to a client.
 +      (Trac #3571, git 9d434f28cc4683eccbcca1ba0d1e45bceb5230d2)
 +
 +1085. [bug]           sar
 +      Always copy the DHCPv4 flags field from a client's request to the
 +      the server's resposne.
 +      (Trac #4292, git 8b7182abdc7ff47eb9b68451e7507b7e4b9872e0)
 +
 +1084. [bug]           fdupont
 +      Removed obsolete requirement of python3 by --enable-generate-docs
 +      configuration option.
 +      (Trac #4315, git 2c236316d5fbac9906cf48a6e4df1649e7545e67)
 +
 +1083. [bug]           marcin
 +      When lease-database configuration parameter is not
 +      specified the default lease database backend (memfile)
 +      is used.
 +      (Trac #3696, git 0be5e6eb32680a742ddcf427b8181f55c0c98115)
 +
  1082. [func]          fdupont
        The following DHCPv4 options are now supported:
                nisplus-domain-name (64),
Simple merge
index 1be686c8bc860149e570ca3e6eec78f056a6c7a4,14fbf2adc6369d8b2a62567e1a149165ff7a7252..369dc36ce793f7c4d996c1a0ac87de18afaab2ed
@@@ -492,38 -469,41 +469,41 @@@ struct yy_trans_inf
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
- static yyconst flex_int16_t yy_acclist[128] =
+ static yyconst flex_int16_t yy_acclist[138] =
      {   0,
-        27,   25,   26,    1,   25,   26,    2,   26,   25,   26,
-        20,   25,   26,   21,   25,   26,   24,   25,   26,   25,
-        26,   19,   25,   26,    5,   25,   26,    5,   25,   26,
-        25,   26,   25,   26,16390,   22,   25,   26,   23,   25,
-        26,   25,   26,16390,   25,   26,16390,   25,   26,16390,
-        25,   26,16390,   25,   26,16390,   25,   26,16390,   25,
-        26,16390,   25,   26,16390,   25,   26,16390,    1,    2,
-         3,    5,    7,16390, 8198,16390,16390,16390,16390,16390,
-     16390,16390,   18,16390,16390,16390,16390,    4,   14,16390,
-        17,16390,16390,16390,   11,16390,   16,16390,16390,16390,
-     16390,16390,16390,16390,16390,16390,16390,   10,16390,16390,
-     16390,16390,16390,16390,   15,16390,   12,16390,    8,16390,
-         9,16390,16390,16390,16390,   13,16390
+        28,   26,   27,    1,   26,   27,    2,   27,   26,   27,
+        21,   26,   27,   22,   26,   27,   25,   26,   27,   26,
+        27,   20,   26,   27,    5,   26,   27,    5,   26,   27,
+        26,   27,   26,   27,   26,   27,16390,   26,   27,16390,
+        23,   26,   27,   24,   26,   27,   26,   27,16390,   26,
+        27,16390,   26,   27,16390,   26,   27,16390,   26,   27,
+     16390,   26,   27,16390,   26,   27,16390,   26,   27,16390,
+        26,   27,16390,    1,    2,    3,    5,    5,    7,    8,
+     16390,16390, 8198,16390,16390,16390,16390,16390,16390,16390,
+        19,16390,16390,16390,16390,    4,    7,   15,16390,   18,
 -    16390,16390,16390,   11,16390,   17,16390,16390,16390,16390,
 -    16390,16390,16390,16390,16390,16390,   10,16390,16390,16390,
 -    16390,16390,16390,   16,16390,   12,16390,    9,16390,   13,
++    16390,16390,16390,   12,16390,   17,16390,16390,16390,16390,
++    16390,16390,16390,16390,16390,16390,   11,16390,16390,16390,
++    16390,16390,16390,   16,16390,   13,16390,    9,16390,   10,
+     16390,16390,    7,16390,16390,   14,16390
      } ;
  
- static yyconst flex_int16_t yy_accept[82] =
+ static yyconst flex_int16_t yy_accept[97] =
      {   0,
          1,    1,    1,    2,    4,    7,    9,   11,   14,   17,
-        20,   22,   25,   28,   31,   33,   36,   39,   42,   45,
-        48,   51,   54,   57,   60,   63,   66,   69,   70,   71,
-        71,   72,   73,   73,   74,   74,   74,   75,   76,   77,
-        78,   79,   80,   81,   82,   83,   85,   86,   87,   88,
-        89,   91,   93,   94,   95,   97,   99,  100,  101,  102,
-       103,  104,  105,  106,  107,  108,  110,  111,  112,  113,
-       114,  115,  117,  119,  121,  123,  124,  125,  126,  128,
-       128
+        20,   22,   25,   28,   31,   33,   35,   38,   41,   44,
+        47,   50,   53,   56,   59,   62,   65,   68,   71,   74,
+        75,   76,   76,   77,   78,   78,   79,   79,   79,   79,
+        79,   80,   81,   81,   81,   82,   83,   84,   85,   86,
+        87,   88,   89,   90,   91,   93,   94,   95,   96,   96,
+        97,   98,  100,  102,  103,  104,  106,  108,  109,  110,
+       111,  112,  112,  113,  114,  115,  116,  117,  119,  119,
+       120,  121,  122,  123,  124,  124,  126,  128,  130,  132,
+       133,  134,  135,  136,  138,  138
      } ;
  
- static yyconst YY_CHAR yy_ec[256] =
+ static yyconst flex_int32_t yy_ec[256] =
      {   0,
          1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@@ -1238,23 -1222,23 +1222,23 @@@ return isc::eval::EvalParser::make_OPTI
        YY_BREAK
  case 10:
  YY_RULE_SETUP
- #line 128 "lexer.ll"
- return isc::eval::EvalParser::make_TEXT(loc);
+ #line 145 "lexer.ll"
 -return isc::eval::EvalParser::make_TEXT(loc);
++return isc::eval::EvalParser::make_RELAY4(loc);
        YY_BREAK
  case 11:
  YY_RULE_SETUP
- #line 129 "lexer.ll"
- return isc::eval::EvalParser::make_HEX(loc);
+ #line 146 "lexer.ll"
 -return isc::eval::EvalParser::make_HEX(loc);
++return isc::eval::EvalParser::make_TEXT(loc);
        YY_BREAK
  case 12:
  YY_RULE_SETUP
- #line 130 "lexer.ll"
- return isc::eval::EvalParser::make_EXISTS(loc);
+ #line 147 "lexer.ll"
 -return isc::eval::EvalParser::make_EXISTS(loc);
++return isc::eval::EvalParser::make_HEX(loc);
        YY_BREAK
  case 13:
  YY_RULE_SETUP
- #line 131 "lexer.ll"
- return isc::eval::EvalParser::make_SUBSTRING(loc);
+ #line 148 "lexer.ll"
 -return isc::eval::EvalParser::make_RELAY4(loc);
++return isc::eval::EvalParser::make_EXISTS(loc);
        YY_BREAK
  case 14:
  YY_RULE_SETUP
index 0ad7285eba4a85e143f5520bcc1c78892b5e91ab,3701d2d9f354e97a5a8f2b1b441b400e989b4771..18a4b87591dd886feaeea839a474026040a7407a
@@@ -122,9 -126,22 +126,23 @@@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a
      return isc::eval::EvalParser::make_OPTION_NAME(yytext, loc);
  }
  
+ {addr4}|{addr6} {
+     // IPv4 or IPv6 address
+     std::string tmp(yytext);
+     // Some incorrect addresses can match so we have to check.
+     try {
+         isc::asiolink::IOAddress ip(tmp);
+     } catch (...) {
+         driver.error(loc, "Failed to convert " + tmp + " to an IP address.");
+     }
+     return isc::eval::EvalParser::make_IP_ADDRESS(yytext, loc);
+ }
  "=="        return isc::eval::EvalParser::make_EQUAL(loc);
  "option"    return isc::eval::EvalParser::make_OPTION(loc);
 +"relay4"    return isc::eval::EvalParser::make_RELAY4(loc);
  "text"      return isc::eval::EvalParser::make_TEXT(loc);
  "hex"       return isc::eval::EvalParser::make_HEX(loc);
  "exists"    return isc::eval::EvalParser::make_EXISTS(loc);
index effaa15addb7999694eb33b84b2a85223190c9cb,92744a61cbbd3e615619070d1f8ca3bba5ed89ad..e5fd35d82b2f2b54f5e618adc0daa9fc61ef8b24
@@@ -40,9 -41,9 +40,9 @@@
  
  # include "position.hh"
  
- #line 13 "parser.yy" // location.cc:296
 -#line 13 "parser.yy" // location.cc:291
++#line 13 "parser.yy" // location.cc:337
  namespace isc { namespace eval {
- #line 46 "location.hh" // location.cc:296
 -#line 46 "location.hh" // location.cc:291
++#line 46 "location.hh" // location.cc:337
    /// Abstract a location.
    class location
    {
      return ostr;
    }
  
- #line 13 "parser.yy" // location.cc:296
 -#line 13 "parser.yy" // location.cc:291
++#line 13 "parser.yy" // location.cc:337
  } } // isc::eval
- #line 192 "location.hh" // location.cc:296
 -#line 187 "location.hh" // location.cc:291
++#line 192 "location.hh" // location.cc:337
  #endif // !YY_YY_LOCATION_HH_INCLUDED
index 0effbea9988f0de48c6189b83854bcbedfac5092,d1d6150525813bb7bf4d11df8ac324c145dd0e55..2887ba94613e3df2bb0435a473aa87d732258092
@@@ -334,44 -336,51 +336,51 @@@ namespace isc { namespace eval 
      {
              case 21: // "constant string"
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< std::string > (); }
- #line 340 "parser.cc" // lalr1.cc:636
+ #line 342 "parser.cc" // lalr1.cc:636
          break;
  
        case 22: // "integer"
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< std::string > (); }
- #line 347 "parser.cc" // lalr1.cc:636
+ #line 349 "parser.cc" // lalr1.cc:636
          break;
  
        case 23: // "constant hexstring"
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< std::string > (); }
- #line 354 "parser.cc" // lalr1.cc:636
+ #line 356 "parser.cc" // lalr1.cc:636
          break;
  
        case 24: // "option name"
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< std::string > (); }
- #line 361 "parser.cc" // lalr1.cc:636
+ #line 363 "parser.cc" // lalr1.cc:636
          break;
  
-       case 29: // option_code
+       case 25: // "ip address"
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
+         { yyoutput << yysym.value.template as< std::string > (); }
+ #line 370 "parser.cc" // lalr1.cc:636
+         break;
+       case 30: // option_code
 -#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< uint16_t > (); }
- #line 368 "parser.cc" // lalr1.cc:636
+ #line 377 "parser.cc" // lalr1.cc:636
          break;
  
-       case 30: // option_repr_type
+       case 31: // option_repr_type
  
--#line 72 "parser.yy" // lalr1.cc:636
++#line 73 "parser.yy" // lalr1.cc:636
          { yyoutput << yysym.value.template as< TokenOption::RepresentationType > (); }
- #line 375 "parser.cc" // lalr1.cc:636
+ #line 384 "parser.cc" // lalr1.cc:636
          break;
  
  
            switch (yyn)
              {
    case 4:
--#line 86 "parser.yy" // lalr1.cc:859
++#line 87 "parser.yy" // lalr1.cc:859
      {
                      TokenPtr neg(new TokenNot());
                      ctx.expression.push_back(neg);
      break;
  
    case 5:
--#line 91 "parser.yy" // lalr1.cc:859
++#line 92 "parser.yy" // lalr1.cc:859
      {
                      TokenPtr neg(new TokenAnd());
                      ctx.expression.push_back(neg);
      break;
  
    case 6:
--#line 96 "parser.yy" // lalr1.cc:859
++#line 97 "parser.yy" // lalr1.cc:859
      {
                      TokenPtr neg(new TokenOr());
                      ctx.expression.push_back(neg);
      break;
  
    case 7:
--#line 101 "parser.yy" // lalr1.cc:859
++#line 102 "parser.yy" // lalr1.cc:859
      {
                      TokenPtr eq(new TokenEqual());
                      ctx.expression.push_back(eq);
      break;
  
    case 8:
--#line 106 "parser.yy" // lalr1.cc:859
++#line 107 "parser.yy" // lalr1.cc:859
      {
                      TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), TokenOption::EXISTS));
                      ctx.expression.push_back(opt);
      break;
  
    case 9:
- #line 111 "parser.yy" // lalr1.cc:859
 -#line 113 "parser.yy" // lalr1.cc:859
++#line 112 "parser.yy" // lalr1.cc:859
 +    {
 +                   switch (ctx.getUniverse()) {
 +                   case Option::V4:
 +                   {
 +                       TokenPtr opt(new TokenRelay4Option(yystack_[3].value.as< uint16_t > (), TokenOption::EXISTS));
 +                       ctx.expression.push_back(opt);
 +                       break;
 +                   }
 +                   case Option::V6:
 +                       // We will have relay6[123] for the DHCPv6.
 +                       // In a very distant future we'll possibly be able
 +                       // to mix both if we have DHCPv4-over-DHCPv6, so it
 +                       // has some sense to make it explicit whether we
 +                       // talk about DHCPv4 relay or DHCPv6 relay. However,
 +                       // for the time being relay4 can be used in DHCPv4
 +                       // only.
 +                       error(yystack_[5].location, "relay4 can only be used in DHCPv4.");
 +                   }
 +                }
- #line 673 "parser.cc" // lalr1.cc:859
++#line 683 "parser.cc" // lalr1.cc:859
 +    break;
 +
 +  case 10:
- #line 133 "parser.yy" // lalr1.cc:859
++#line 134 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ()));
                        ctx.expression.push_back(str);
                    }
- #line 682 "parser.cc" // lalr1.cc:859
 -#line 668 "parser.cc" // lalr1.cc:859
++#line 692 "parser.cc" // lalr1.cc:859
      break;
  
 -  case 10:
 -#line 118 "parser.yy" // lalr1.cc:859
 +  case 11:
- #line 138 "parser.yy" // lalr1.cc:859
++#line 139 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr hex(new TokenHexString(yystack_[0].value.as< std::string > ()));
                        ctx.expression.push_back(hex);
                    }
- #line 691 "parser.cc" // lalr1.cc:859
 -#line 677 "parser.cc" // lalr1.cc:859
++#line 701 "parser.cc" // lalr1.cc:859
      break;
  
 -  case 11:
 -#line 123 "parser.yy" // lalr1.cc:859
 +  case 12:
- #line 143 "parser.yy" // lalr1.cc:859
++#line 144 "parser.yy" // lalr1.cc:859
+     {
+                       TokenPtr ip(new TokenIpAddress(yystack_[0].value.as< std::string > ()));
+                       ctx.expression.push_back(ip);
+                   }
 -#line 686 "parser.cc" // lalr1.cc:859
++#line 710 "parser.cc" // lalr1.cc:859
+     break;
 -  case 12:
 -#line 128 "parser.yy" // lalr1.cc:859
++  case 13:
++#line 149 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), yystack_[0].value.as< TokenOption::RepresentationType > ()));
                        ctx.expression.push_back(opt);
                    }
- #line 700 "parser.cc" // lalr1.cc:859
 -#line 695 "parser.cc" // lalr1.cc:859
++#line 719 "parser.cc" // lalr1.cc:859
      break;
  
--  case 13:
- #line 148 "parser.yy" // lalr1.cc:859
 -#line 133 "parser.yy" // lalr1.cc:859
++  case 14:
++#line 154 "parser.yy" // lalr1.cc:859
      {
                       switch (ctx.getUniverse()) {
                       case Option::V4:
                           error(yystack_[5].location, "relay4 can only be used in DHCPv4.");
                       }
                    }
- #line 724 "parser.cc" // lalr1.cc:859
 -#line 719 "parser.cc" // lalr1.cc:859
++#line 743 "parser.cc" // lalr1.cc:859
      break;
  
--  case 14:
- #line 168 "parser.yy" // lalr1.cc:859
 -#line 153 "parser.yy" // lalr1.cc:859
++  case 15:
++#line 174 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr sub(new TokenSubstring());
                        ctx.expression.push_back(sub);
                    }
- #line 733 "parser.cc" // lalr1.cc:859
 -#line 728 "parser.cc" // lalr1.cc:859
++#line 752 "parser.cc" // lalr1.cc:859
      break;
  
--  case 15:
- #line 173 "parser.yy" // lalr1.cc:859
 -#line 158 "parser.yy" // lalr1.cc:859
++  case 16:
++#line 179 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr conc(new TokenConcat());
                        ctx.expression.push_back(conc);
                    }
- #line 742 "parser.cc" // lalr1.cc:859
 -#line 737 "parser.cc" // lalr1.cc:859
++#line 761 "parser.cc" // lalr1.cc:859
      break;
  
--  case 16:
- #line 180 "parser.yy" // lalr1.cc:859
 -#line 165 "parser.yy" // lalr1.cc:859
++  case 17:
++#line 186 "parser.yy" // lalr1.cc:859
      {
                       yylhs.value.as< uint16_t > () = ctx.convertOptionCode(yystack_[0].value.as< std::string > (), yystack_[0].location);
                   }
- #line 750 "parser.cc" // lalr1.cc:859
 -#line 745 "parser.cc" // lalr1.cc:859
++#line 769 "parser.cc" // lalr1.cc:859
      break;
  
--  case 17:
- #line 184 "parser.yy" // lalr1.cc:859
 -#line 169 "parser.yy" // lalr1.cc:859
++  case 18:
++#line 190 "parser.yy" // lalr1.cc:859
      {
                       yylhs.value.as< uint16_t > () = ctx.convertOptionName(yystack_[0].value.as< std::string > (), yystack_[0].location);
                   }
- #line 758 "parser.cc" // lalr1.cc:859
 -#line 753 "parser.cc" // lalr1.cc:859
++#line 777 "parser.cc" // lalr1.cc:859
      break;
  
--  case 18:
- #line 190 "parser.yy" // lalr1.cc:859
 -#line 175 "parser.yy" // lalr1.cc:859
++  case 19:
++#line 196 "parser.yy" // lalr1.cc:859
      {
                            yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::TEXTUAL;
                        }
- #line 766 "parser.cc" // lalr1.cc:859
 -#line 761 "parser.cc" // lalr1.cc:859
++#line 785 "parser.cc" // lalr1.cc:859
      break;
  
--  case 19:
- #line 194 "parser.yy" // lalr1.cc:859
 -#line 179 "parser.yy" // lalr1.cc:859
++  case 20:
++#line 200 "parser.yy" // lalr1.cc:859
      {
                            yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::HEXADECIMAL;
                        }
- #line 774 "parser.cc" // lalr1.cc:859
 -#line 769 "parser.cc" // lalr1.cc:859
++#line 793 "parser.cc" // lalr1.cc:859
      break;
  
--  case 20:
- #line 200 "parser.yy" // lalr1.cc:859
 -#line 185 "parser.yy" // lalr1.cc:859
++  case 21:
++#line 206 "parser.yy" // lalr1.cc:859
      {
                       TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ()));
                       ctx.expression.push_back(str);
                   }
- #line 783 "parser.cc" // lalr1.cc:859
 -#line 778 "parser.cc" // lalr1.cc:859
++#line 802 "parser.cc" // lalr1.cc:859
      break;
  
--  case 21:
- #line 207 "parser.yy" // lalr1.cc:859
 -#line 192 "parser.yy" // lalr1.cc:859
++  case 22:
++#line 213 "parser.yy" // lalr1.cc:859
      {
                        TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ()));
                        ctx.expression.push_back(str);
                    }
- #line 792 "parser.cc" // lalr1.cc:859
 -#line 787 "parser.cc" // lalr1.cc:859
++#line 811 "parser.cc" // lalr1.cc:859
      break;
  
--  case 22:
- #line 212 "parser.yy" // lalr1.cc:859
 -#line 197 "parser.yy" // lalr1.cc:859
++  case 23:
++#line 218 "parser.yy" // lalr1.cc:859
      {
                       TokenPtr str(new TokenString("all"));
                       ctx.expression.push_back(str);
                   }
- #line 801 "parser.cc" // lalr1.cc:859
 -#line 796 "parser.cc" // lalr1.cc:859
++#line 820 "parser.cc" // lalr1.cc:859
      break;
  
  
- #line 805 "parser.cc" // lalr1.cc:859
 -#line 800 "parser.cc" // lalr1.cc:859
++#line 824 "parser.cc" // lalr1.cc:859
              default:
                break;
              }
    const signed char
    EvalParser::yypact_[] =
    {
-       -1,    -1,    -1,     1,    10,    28,    36,   -29,   -29,    32,
-        0,    41,    29,   -29,    -7,    -7,    17,    17,   -29,    -1,
-       -1,    17,   -29,   -29,   -29,    38,    39,    42,    43,    37,
-       40,   -29,    46,   -29,    44,    45,    -7,    -7,    47,    17,
-       27,    30,    48,    49,   -29,    51,    58,   -29,   -29,   -29,
-      -29,   -29,   -29,    50,    52,    -4,   -29,    33,    33,   -29,
-      -29,    60,   -29
 -      -1,   -17,    -8,     4,    -1,    12,    -1,   -18,   -18,   -18,
 -      35,     6,    36,    20,     7,     7,   -18,    20,    18,   -18,
 -      -1,    -1,     7,   -18,   -18,    26,    29,    31,    34,    32,
 -     -18,   -18,    41,   -18,    38,    20,    37,     7,    39,    28,
 -      40,   -18,    42,    43,    33,   -18,   -18,   -18,   -18,    47,
 -      15,   -18,   -18,    33,   -18,   -18,    45,   -18
++      -1,    -1,    -1,    24,    27,    18,    37,   -29,   -29,   -29,
++      50,     6,    43,    11,   -29,    10,    10,    16,    16,   -29,
++      -1,    -1,    16,   -29,   -29,   -29,    40,    41,    44,    45,
++      35,    38,   -29,    52,   -29,    46,    47,    10,    10,    39,
++      16,    28,    31,    51,    53,   -29,    48,    58,   -29,   -29,
++     -29,   -29,   -29,   -29,    55,    56,   -15,   -29,    34,    34,
++     -29,   -29,    60,   -29
    };
  
    const unsigned char
    EvalParser::yydefact_[] =
    {
-        0,     0,     0,     0,     0,     0,     0,    10,    11,     0,
-        2,     0,     0,     4,     0,     0,     0,     0,     1,     0,
-        0,     0,     3,    16,    17,     0,     0,     0,     0,     0,
-        0,     5,     6,     7,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,    20,     0,     0,    18,    19,     8,
-       12,     9,    13,     0,     0,     0,    15,     0,     0,    22,
-       21,     0,    14
 -       0,     0,     0,     0,     0,     0,     0,     9,    10,    11,
 -       0,     2,     0,     0,     0,     0,     4,     0,     0,     1,
 -       0,     0,     0,    16,    17,     0,     0,     0,     0,     0,
 -       3,     5,     6,     7,     0,     0,     0,     0,     0,     0,
 -       0,    20,     0,     0,     0,    18,    19,     8,    12,     0,
 -       0,    15,    13,     0,    22,    21,     0,    14
++       0,     0,     0,     0,     0,     0,     0,    10,    11,    12,
++       0,     2,     0,     0,     4,     0,     0,     0,     0,     1,
++       0,     0,     0,     3,    17,    18,     0,     0,     0,     0,
++       0,     0,     5,     6,     7,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    21,     0,     0,    19,    20,
++       8,    13,     9,    14,     0,     0,     0,    16,     0,     0,
++      23,    22,     0,    15
    };
  
    const signed char
    EvalParser::yypgoto_[] =
    {
-      -29,   -29,     9,   -16,   -12,   -28,   -29,   -29
 -     -18,   -18,    13,   -14,   -10,    11,   -18,   -18
++     -29,   -29,     9,   -17,   -10,   -28,   -29,   -29
    };
  
    const signed char
    EvalParser::yydefgoto_[] =
    {
-       -1,     9,    10,    11,    25,    50,    45,    61
 -      -1,    10,    11,    12,    25,    48,    42,    56
++      -1,    10,    11,    12,    26,    51,    46,    62
    };
  
    const unsigned char
    EvalParser::yytable_[] =
    {
-       29,    30,     1,    26,     2,    33,    19,    20,     3,     4,
-       12,    13,    14,    52,    59,    23,     5,    24,    60,     6,
-        7,    15,     8,    46,    42,    43,    27,    28,    31,    32,
-       52,    16,    18,    22,     5,    19,    20,     6,     7,    17,
-        8,    47,    48,    49,    47,    48,    51,    47,    48,    21,
-       34,    35,    19,    36,    37,     0,    38,    40,    41,    39,
-       53,    54,    56,    57,    62,    58,     0,     0,     0,    44,
-       55
 -      27,    28,    13,     1,     2,     3,     4,    29,    33,    14,
 -       5,    26,     2,     3,    20,    21,     6,    16,     5,    18,
 -       7,    15,     8,    43,     9,    40,    20,    21,     7,    54,
 -       8,    17,     9,    31,    32,    19,    30,    55,    45,    22,
 -      46,    47,    23,    45,    24,    46,    34,    36,    35,    20,
 -      37,     0,    38,    39,    44,    52,     0,     0,    50,    41,
 -      49,    51,    53,    57
++      30,    31,     1,    60,     2,    34,    27,    61,     3,     4,
++      13,    14,    20,    21,    53,    23,     5,    20,    21,     6,
++       7,    17,     8,    47,     9,    28,    29,    43,    44,    32,
++      33,    53,    24,     5,    25,    15,     6,     7,    16,     8,
++      18,     9,    48,    49,    50,    48,    49,    52,    48,    49,
++      19,    22,    35,    36,    39,    37,    38,    40,    20,    41,
++      42,    45,    57,    54,    63,    55,     0,    56,    58,    59
    };
  
    const signed char
    EvalParser::yycheck_[] =
    {
-       16,    17,     3,    15,     5,    21,     6,     7,     9,    10,
-        1,     2,    11,    41,    18,    22,    17,    24,    22,    20,
-       21,    11,    23,    39,    36,    37,     9,    10,    19,    20,
-       58,     3,     0,     4,    17,     6,     7,    20,    21,     3,
-       23,    14,    15,    16,    14,    15,    16,    14,    15,     8,
-       12,    12,     6,    11,    11,    -1,    19,    13,    13,    19,
-       12,    12,     4,    13,     4,    13,    -1,    -1,    -1,    22,
-       19
 -      14,    15,    19,     4,     5,     6,     7,    17,    22,    17,
 -      11,     4,     5,     6,     8,     9,    17,     4,    11,     6,
 -      21,    17,    23,    37,    25,    35,     8,     9,    21,    14,
 -      23,    19,    25,    20,    21,     0,    18,    22,    10,     3,
 -      12,    13,    22,    10,    24,    12,    20,    16,    19,     8,
 -      16,    -1,    20,    15,    15,    44,    -1,    -1,    16,    22,
 -      20,    18,    15,    18
++      17,    18,     3,    18,     5,    22,    16,    22,     9,    10,
++       1,     2,     6,     7,    42,     4,    17,     6,     7,    20,
++      21,     3,    23,    40,    25,     9,    10,    37,    38,    20,
++      21,    59,    22,    17,    24,    11,    20,    21,    11,    23,
++       3,    25,    14,    15,    16,    14,    15,    16,    14,    15,
++       0,     8,    12,    12,    19,    11,    11,    19,     6,    13,
++      13,    22,     4,    12,     4,    12,    -1,    19,    13,    13
    };
  
    const unsigned char
    EvalParser::yystos_[] =
    {
-        0,     3,     5,     9,    10,    17,    20,    21,    23,    26,
-       27,    28,    27,    27,    11,    11,     3,     3,     0,     6,
-        7,     8,     4,    22,    24,    29,    29,     9,    10,    28,
-       28,    27,    27,    28,    12,    12,    11,    11,    19,    19,
-       13,    13,    29,    29,    22,    31,    28,    14,    15,    16,
-       30,    16,    30,    12,    12,    19,     4,    13,    13,    18,
-       22,    32,     4
 -       0,     4,     5,     6,     7,    11,    17,    21,    23,    25,
 -      27,    28,    29,    19,    17,    17,    28,    19,    28,     0,
 -       8,     9,     3,    22,    24,    30,     4,    29,    29,    30,
 -      18,    28,    28,    29,    20,    19,    16,    16,    20,    15,
 -      30,    22,    32,    29,    15,    10,    12,    13,    31,    20,
 -      16,    18,    31,    15,    14,    22,    33,    18
++       0,     3,     5,     9,    10,    17,    20,    21,    23,    25,
++      27,    28,    29,    28,    28,    11,    11,     3,     3,     0,
++       6,     7,     8,     4,    22,    24,    30,    30,     9,    10,
++      29,    29,    28,    28,    29,    12,    12,    11,    11,    19,
++      19,    13,    13,    30,    30,    22,    32,    29,    14,    15,
++      16,    31,    16,    31,    12,    12,    19,     4,    13,    13,
++      18,    22,    33,     4
    };
  
    const unsigned char
    EvalParser::yyr1_[] =
    {
-        0,    25,    26,    27,    27,    27,    27,    27,    27,    27,
-       28,    28,    28,    28,    28,    28,    29,    29,    30,    30,
-       31,    32,    32
 -       0,    26,    27,    28,    28,    28,    28,    28,    28,    29,
 -      29,    29,    29,    29,    29,    29,    30,    30,    31,    31,
 -      32,    33,    33
++       0,    26,    27,    28,    28,    28,    28,    28,    28,    28,
++      29,    29,    29,    29,    29,    29,    29,    30,    30,    31,
++      31,    32,    33,    33
    };
  
    const unsigned char
    EvalParser::yyr2_[] =
    {
 -       0,     2,     1,     3,     2,     3,     3,     3,     6,     1,
 -       1,     1,     6,     6,     8,     6,     1,     1,     1,     1,
 -       1,     1,     1
 +       0,     2,     1,     3,     2,     3,     3,     3,     6,     6,
-        1,     1,     6,     6,     8,     6,     1,     1,     1,     1,
-        1,     1,     1
++       1,     1,     1,     6,     6,     8,     6,     1,     1,     1,
++       1,     1,     1,     1
    };
  
  
    const char*
    const EvalParser::yytname_[] =
    {
 -  "\"end of file\"", "error", "$undefined", "\"==\"", "\"option\"",
 -  "\"substring\"", "\"concat\"", "\"not\"", "\"and\"", "\"or\"",
 -  "\"text\"", "\"relay4\"", "\"hex\"", "\"exists\"", "\"all\"", "\".\"",
 -  "\",\"", "\"(\"", "\")\"", "\"[\"", "\"]\"", "\"constant string\"",
 -  "\"integer\"", "\"constant hexstring\"", "\"option name\"",
 -  "\"ip address\"", "$accept", "expression", "bool_expr", "string_expr",
 -  "option_code", "option_repr_type", "start_expr", "length_expr", YY_NULLPTR
 +  "\"end of file\"", "error", "$undefined", "\"(\"", "\")\"", "\"not\"",
 +  "\"and\"", "\"or\"", "\"==\"", "\"option\"", "\"relay4\"", "\"[\"",
 +  "\"]\"", "\".\"", "\"text\"", "\"hex\"", "\"exists\"", "\"substring\"",
 +  "\"all\"", "\",\"", "\"concat\"", "\"constant string\"", "\"integer\"",
-   "\"constant hexstring\"", "\"option name\"", "$accept", "expression",
-   "bool_expr", "string_expr", "option_code", "option_repr_type",
-   "start_expr", "length_expr", YY_NULLPTR
++  "\"constant hexstring\"", "\"option name\"", "\"ip address\"", "$accept",
++  "expression", "bool_expr", "string_expr", "option_code",
++  "option_repr_type", "start_expr", "length_expr", YY_NULLPTR
    };
  
  #if YYDEBUG
    const unsigned char
    EvalParser::yyrline_[] =
    {
-        0,    81,    81,    84,    85,    90,    95,   100,   105,   110,
-      132,   137,   142,   147,   167,   172,   179,   183,   189,   193,
-      199,   206,   211
 -       0,    81,    81,    84,    85,    90,    95,   100,   105,   112,
 -     117,   122,   127,   132,   152,   157,   164,   168,   174,   178,
 -     184,   191,   196
++       0,    82,    82,    85,    86,    91,    96,   101,   106,   111,
++     133,   138,   143,   148,   153,   173,   178,   185,   189,   195,
++     199,   205,   212,   217
    };
  
    // Print the state stack on the debug stream.
  
  #line 13 "parser.yy" // lalr1.cc:1167
  } } // isc::eval
- #line 1211 "parser.cc" // lalr1.cc:1167
- #line 218 "parser.yy" // lalr1.cc:1168
 -#line 1201 "parser.cc" // lalr1.cc:1167
 -#line 203 "parser.yy" // lalr1.cc:1168
++#line 1228 "parser.cc" // lalr1.cc:1167
++#line 224 "parser.yy" // lalr1.cc:1168
  
  void
  isc::eval::EvalParser::error(const location_type& loc,
index 27e4a4320b25e2a9ffd6e877f5871b585536c289,9638bd1c5533ddb9e38b101be611bd8e23d36d1f..ac0e3971b39811c3900e5909084ae7437c66371f
@@@ -758,12 -764,12 +764,12 @@@ namespace isc { namespace eval 
      enum
      {
        yyeof_ = 0,
-       yylast_ = 70,     ///< Last index in yytable_.
 -      yylast_ = 63,     ///< Last index in yytable_.
++      yylast_ = 69,     ///< Last index in yytable_.
        yynnts_ = 8,  ///< Number of nonterminal symbols.
-       yyfinal_ = 18, ///< Termination state number.
+       yyfinal_ = 19, ///< Termination state number.
        yyterror_ = 1,
        yyerrcode_ = 256,
-       yyntokens_ = 25  ///< Number of tokens.
+       yyntokens_ = 26  ///< Number of tokens.
      };
  
  
Simple merge
index b3eebe04f690fabad1ede6b506a3a7f5829a9a68,5055601da38c80da7105f20e5c1b0e2c95cde106..4e09385e65e7dcfade60f970315cbf600213da62
@@@ -50,9 -51,9 +50,9 @@@
  #  endif
  # endif
  
- #line 13 "parser.yy" // location.cc:296
 -#line 13 "parser.yy" // location.cc:291
++#line 13 "parser.yy" // location.cc:337
  namespace isc { namespace eval {
- #line 56 "position.hh" // location.cc:296
 -#line 56 "position.hh" // location.cc:291
++#line 56 "position.hh" // location.cc:337
    /// Abstract a position.
    class position
    {
      return ostr << pos.line << '.' << pos.column;
    }
  
- #line 13 "parser.yy" // location.cc:296
 -#line 13 "parser.yy" // location.cc:291
++#line 13 "parser.yy" // location.cc:337
  } } // isc::eval
- #line 180 "position.hh" // location.cc:296
 -#line 180 "position.hh" // location.cc:291
++#line 180 "position.hh" // location.cc:337
  #endif // !YY_YY_POSITION_HH_INCLUDED
index 6bda37bbcf75ecf027e4e074ca0c6fde27f3baa4,71e91c265225729e3d1be4ffce4cf2dae0c44bd0..fa0d0d87a246bb8c54013257224401137e2a5e09
@@@ -40,9 -41,9 +40,9 @@@
  
  # include <vector>
  
- #line 13 "parser.yy" // stack.hh:132
 -#line 13 "parser.yy" // stack.hh:133
++#line 13 "parser.yy" // stack.hh:151
  namespace isc { namespace eval {
- #line 46 "stack.hh" // stack.hh:132
 -#line 46 "stack.hh" // stack.hh:133
++#line 46 "stack.hh" // stack.hh:151
    template <class T, class S = std::vector<T> >
    class stack
    {
      unsigned int range_;
    };
  
- #line 13 "parser.yy" // stack.hh:132
 -#line 13 "parser.yy" // stack.hh:133
++#line 13 "parser.yy" // stack.hh:151
  } } // isc::eval
- #line 156 "stack.hh" // stack.hh:132
 -#line 157 "stack.hh" // stack.hh:133
++#line 156 "stack.hh" // stack.hh:151
  
  #endif // !YY_YY_STACK_HH_INCLUDED
Simple merge
Simple merge