You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2018/09/12 13:56:21 UTC

svn commit: r1840688 [34/37] - in /httpd/sandbox/httpd-2.4.x-trunk-delta: ./ build/ build/rpm/ build/win32/ docs/ docs/conf/ docs/conf/extra/ docs/log-message-tags/ docs/man/ docs/man/tr/ include/ modules/ modules/aaa/ modules/apreq/ modules/arch/unix/...

Modified: httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.c
URL: http://svn.apache.org/viewvc/httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.c?rev=1840688&r1=1840687&r2=1840688&view=diff
==============================================================================
--- httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.c (original)
+++ httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.c Wed Sep 12 13:56:17 2018
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.1.  */
 
 /* Bison implementation for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2013 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 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.5"
+#define YYBISON_VERSION "2.7.1"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -58,8 +58,6 @@
 /* Pull parsers.  */
 #define YYPULL 1
 
-/* Using locations.  */
-#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         ap_expr_yyparse
@@ -70,22 +68,22 @@
 #define yydebug         ap_expr_yydebug
 #define yynerrs         ap_expr_yynerrs
 
-
 /* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
+/* Line 371 of yacc.c  */
 #line 31 "util_expr_parse.y"
 
 #include "util_expr_private.h"
 
+/* Line 371 of yacc.c  */
+#line 79 "util_expr_parse.c"
 
-/* Line 268 of yacc.c  */
-#line 84 "util_expr_parse.c"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
+# ifndef YY_NULL
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULL nullptr
+#  else
+#   define YY_NULL 0
 #endif
+# endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -95,11 +93,17 @@
 # define YYERROR_VERBOSE 1
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
+/* In a future release of Bison, this section will be replaced
+   by #include "util_expr_parse.h".  */
+#ifndef YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED
+# define YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int ap_expr_yydebug;
 #endif
-
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -116,43 +120,49 @@
      T_ID = 264,
      T_STRING = 265,
      T_REGEX = 266,
-     T_REGEX_I = 267,
-     T_REGEX_BACKREF = 268,
-     T_OP_UNARY = 269,
-     T_OP_BINARY = 270,
-     T_STR_BEGIN = 271,
-     T_STR_END = 272,
-     T_VAR_BEGIN = 273,
-     T_VAR_END = 274,
-     T_OP_EQ = 275,
-     T_OP_NE = 276,
-     T_OP_LT = 277,
-     T_OP_LE = 278,
-     T_OP_GT = 279,
-     T_OP_GE = 280,
-     T_OP_REG = 281,
-     T_OP_NRE = 282,
-     T_OP_IN = 283,
-     T_OP_STR_EQ = 284,
-     T_OP_STR_NE = 285,
-     T_OP_STR_LT = 286,
-     T_OP_STR_LE = 287,
-     T_OP_STR_GT = 288,
-     T_OP_STR_GE = 289,
-     T_OP_CONCAT = 290,
-     T_OP_OR = 291,
-     T_OP_AND = 292,
-     T_OP_NOT = 293
+     T_REGSUB = 267,
+     T_REG_MATCH = 268,
+     T_REG_SUBST = 269,
+     T_REG_FLAGS = 270,
+     T_BACKREF = 271,
+     T_OP_UNARY = 272,
+     T_OP_BINARY = 273,
+     T_STR_BEGIN = 274,
+     T_STR_END = 275,
+     T_VAR_BEGIN = 276,
+     T_VAR_END = 277,
+     T_VAREXP_BEGIN = 278,
+     T_VAREXP_END = 279,
+     T_OP_EQ = 280,
+     T_OP_NE = 281,
+     T_OP_LT = 282,
+     T_OP_LE = 283,
+     T_OP_GT = 284,
+     T_OP_GE = 285,
+     T_OP_REG = 286,
+     T_OP_NRE = 287,
+     T_OP_IN = 288,
+     T_OP_STR_EQ = 289,
+     T_OP_STR_NE = 290,
+     T_OP_STR_LT = 291,
+     T_OP_STR_LE = 292,
+     T_OP_STR_GT = 293,
+     T_OP_STR_GE = 294,
+     T_OP_CONCAT = 295,
+     T_OP_JOIN = 296,
+     T_OP_SPLIT = 297,
+     T_OP_SUB = 298,
+     T_OP_OR = 299,
+     T_OP_AND = 300,
+     T_OP_NOT = 301
    };
 #endif
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 293 of yacc.c  */
+/* Line 387 of yacc.c  */
 #line 35 "util_expr_parse.y"
 
     char      *cpVal;
@@ -160,9 +170,8 @@ typedef union YYSTYPE
     int        num;
 
 
-
-/* Line 293 of yacc.c  */
-#line 166 "util_expr_parse.c"
+/* Line 387 of yacc.c  */
+#line 175 "util_expr_parse.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -170,19 +179,33 @@ typedef union YYSTYPE
 #endif
 
 
-/* Copy the second part of user declarations.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int ap_expr_yyparse (void *YYPARSE_PARAM);
+#else
+int ap_expr_yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int ap_expr_yyparse (ap_expr_parse_ctx_t *ctx);
+#else
+int ap_expr_yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
-/* Line 343 of yacc.c  */
-#line 102 "util_expr_parse.y"
+#endif /* !YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED  */
+
+/* Copy the second part of user declarations.  */
+/* Line 390 of yacc.c  */
+#line 118 "util_expr_parse.y"
 
 #include "util_expr_private.h"
 #define yyscanner ctx->scanner
 
 int ap_expr_yylex(YYSTYPE *lvalp, void *scanner);
 
-
-/* Line 343 of yacc.c  */
-#line 186 "util_expr_parse.c"
+/* Line 390 of yacc.c  */
+#line 209 "util_expr_parse.c"
 
 #ifdef short
 # undef short
@@ -235,24 +258,33 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(msgid) msgid
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later.  */
+# if (! defined __GNUC__ || __GNUC__ < 2 \
+      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
+#  define __attribute__(Spec) /* empty */
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
+# define YYUSE(E) ((void) (E))
 #else
-# define YYUSE(e) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
+
 /* Identity function, used to suppress warnings about constant conditions.  */
 #ifndef lint
-# define YYID(n) (n)
+# define YYID(N) (N)
 #else
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
@@ -288,6 +320,7 @@ YYID (yyi)
 #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -379,19 +412,19 @@ union yyalloc
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
+/* Copy COUNT objects from SRC to DST.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
 #  else
-#   define YYCOPY(To, From, Count)		\
+#   define YYCOPY(Dst, Src, Count)              \
       do					\
 	{					\
 	  YYSIZE_T yyi;				\
 	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
+            (Dst)[yyi] = (Src)[yyi];            \
 	}					\
       while (YYID (0))
 #  endif
@@ -399,22 +432,22 @@ union yyalloc
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  28
+#define YYFINAL  31
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   128
+#define YYLAST   277
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  45
+#define YYNTOKENS  69
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  14
+#define YYNNTS  18
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  53
+#define YYNRULES  71
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  96
+#define YYNSTATES  154
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   293
+#define YYMAXUTOK   317
 
 #define YYTRANSLATE(YYX)						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -426,15 +459,15 @@ static const yytype_uint8 yytranslate[]
        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,
-      39,    40,     2,     2,    43,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    44,     2,
+      63,    64,     2,     2,    68,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    67,     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,     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,    41,     2,    42,     2,     2,     2,     2,
+       2,     2,     2,    65,     2,    66,     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,
@@ -451,73 +484,102 @@ static const yytype_uint8 yytranslate[]
        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
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62
 };
 
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const yytype_uint8 yyprhs[] =
+static const yytype_uint16 yyprhs[] =
 {
-       0,     0,     3,     6,     9,    11,    13,    15,    18,    22,
-      26,    28,    31,    35,    39,    41,    45,    49,    53,    57,
-      61,    65,    69,    73,    77,    81,    85,    89,    93,    97,
-     101,   103,   107,   109,   113,   116,   118,   120,   122,   124,
-     126,   130,   136,   138,   142,   144,   146,   148,   152,   155,
-     157,   159,   161,   166
+       0,     0,     3,     6,     9,    11,    13,    16,    18,    20,
+      22,    25,    29,    33,    35,    38,    42,    46,    48,    52,
+      56,    60,    64,    68,    72,    76,    80,    84,    88,    92,
+      96,   100,   104,   108,   110,   113,   117,   121,   123,   125,
+     127,   129,   133,   135,   137,   141,   145,   147,   149,   153,
+     159,   163,   167,   169,   174,   179,   184,   189,   196,   199,
+     204,   209,   216,   221,   228,   233,   240,   242,   246,   250,
+     255,   257
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int8 yyrhs[] =
 {
-      46,     0,    -1,     5,    47,    -1,     6,    51,    -1,     7,
-      -1,     3,    -1,     4,    -1,    38,    47,    -1,    47,    36,
-      47,    -1,    47,    37,    47,    -1,    48,    -1,    14,    54,
-      -1,    54,    15,    54,    -1,    39,    47,    40,    -1,     7,
-      -1,    54,    20,    54,    -1,    54,    21,    54,    -1,    54,
-      22,    54,    -1,    54,    23,    54,    -1,    54,    24,    54,
-      -1,    54,    25,    54,    -1,    54,    29,    54,    -1,    54,
-      30,    54,    -1,    54,    31,    54,    -1,    54,    32,    54,
-      -1,    54,    33,    54,    -1,    54,    34,    54,    -1,    54,
-      28,    49,    -1,    54,    26,    55,    -1,    54,    27,    55,
-      -1,    57,    -1,    41,    50,    42,    -1,    54,    -1,    50,
-      43,    54,    -1,    51,    52,    -1,    52,    -1,     7,    -1,
-      10,    -1,    53,    -1,    56,    -1,    18,     9,    19,    -1,
-      18,     9,    44,    51,    19,    -1,     8,    -1,    54,    35,
-      54,    -1,    53,    -1,    56,    -1,    58,    -1,    16,    51,
-      17,    -1,    16,    17,    -1,    11,    -1,    12,    -1,    13,
-      -1,     9,    39,    54,    40,    -1,     9,    39,    54,    40,
-      -1
+      70,     0,    -1,     6,    71,    -1,     5,    72,    -1,     7,
+      -1,    76,    -1,    71,    76,    -1,     7,    -1,     3,    -1,
+       4,    -1,    46,    72,    -1,    72,    44,    72,    -1,    72,
+      45,    72,    -1,    73,    -1,    17,    74,    -1,    74,    18,
+      74,    -1,    63,    72,    64,    -1,     7,    -1,    74,    25,
+      74,    -1,    74,    26,    74,    -1,    74,    27,    74,    -1,
+      74,    28,    74,    -1,    74,    29,    74,    -1,    74,    30,
+      74,    -1,    74,    34,    74,    -1,    74,    35,    74,    -1,
+      74,    36,    74,    -1,    74,    37,    74,    -1,    74,    38,
+      74,    -1,    74,    39,    74,    -1,    74,    31,    84,    -1,
+      74,    32,    84,    -1,    74,    33,    75,    -1,     8,    -1,
+      19,    20,    -1,    19,    71,    20,    -1,    74,    40,    74,
+      -1,    77,    -1,    80,    -1,    81,    -1,    78,    -1,    63,
+      74,    64,    -1,    82,    -1,    79,    -1,    65,    83,    66,
+      -1,    63,    75,    64,    -1,    10,    -1,    77,    -1,    21,
+       9,    22,    -1,    21,     9,    67,    71,    22,    -1,    23,
+      72,    24,    -1,    23,    74,    24,    -1,    16,    -1,     9,
+      63,    74,    64,    -1,     9,    63,    83,    64,    -1,     9,
+      63,    74,    64,    -1,    43,    85,    68,    74,    -1,    43,
+      63,    85,    68,    74,    64,    -1,    41,    75,    -1,    41,
+      63,    75,    64,    -1,    41,    75,    68,    74,    -1,    41,
+      63,    75,    68,    74,    64,    -1,    42,    86,    68,    75,
+      -1,    42,    63,    86,    68,    75,    64,    -1,    42,    86,
+      68,    74,    -1,    42,    63,    86,    68,    74,    64,    -1,
+      74,    -1,    74,    68,    83,    -1,    11,    13,    15,    -1,
+      12,    13,    71,    15,    -1,    84,    -1,    85,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint8 yyrline[] =
 {
-       0,   112,   112,   113,   114,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     146,   147,   150,   151,   154,   155,   156,   159,   160,   161,
-     164,   165,   168,   169,   170,   171,   172,   173,   174,   177,
-     186,   197,   204,   207
+       0,   128,   128,   129,   130,   133,   134,   135,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   178,   179,   180,   181,   184,   185,   188,   189,
+     190,   191,   192,   195,   196,   199,   203,   204,   207,   208,
+     209,   210,   213,   214,   215,   216,   219,   220,   223,   232,
+     241,   242
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 1
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "T_TRUE", "T_FALSE", "T_EXPR_BOOL",
-  "T_EXPR_STRING", "T_ERROR", "T_DIGIT", "T_ID", "T_STRING", "T_REGEX",
-  "T_REGEX_I", "T_REGEX_BACKREF", "T_OP_UNARY", "T_OP_BINARY",
-  "T_STR_BEGIN", "T_STR_END", "T_VAR_BEGIN", "T_VAR_END", "T_OP_EQ",
-  "T_OP_NE", "T_OP_LT", "T_OP_LE", "T_OP_GT", "T_OP_GE", "T_OP_REG",
-  "T_OP_NRE", "T_OP_IN", "T_OP_STR_EQ", "T_OP_STR_NE", "T_OP_STR_LT",
-  "T_OP_STR_LE", "T_OP_STR_GT", "T_OP_STR_GE", "T_OP_CONCAT", "T_OP_OR",
-  "T_OP_AND", "T_OP_NOT", "'('", "')'", "'{'", "'}'", "','", "':'",
-  "$accept", "root", "expr", "comparison", "wordlist", "words", "string",
-  "strpart", "var", "word", "regex", "backref", "lstfunccall",
-  "strfunccall", 0
+  "$end", "error", "$undefined", "\"true\"", "\"false\"",
+  "\"boolean expression\"", "\"string expression\"", "\"error token\"",
+  "\"number\"", "\"identifier\"", "\"string literal\"",
+  "\"start of matching regex\"", "\"start of substitution regex\"",
+  "\"pattern of the regex\"", "\"substitution of the regex\"",
+  "\"pattern flags of the regex\"", "\"regex back reference\"",
+  "\"unary operator\"", "\"binary operator\"", "\"start of string\"",
+  "\"end of string\"", "\"start of variable name\"",
+  "\"end of variable name\"", "\"start of variable expression\"",
+  "\"end of variable expression\"", "\"integer equal\"",
+  "\"integer not equal\"", "\"integer less than\"",
+  "\"integer less or equal\"", "\"integer greater than\"",
+  "\"integer greater or equal\"", "\"regex match\"", "\"regex non-match\"",
+  "\"contained in\"", "\"string equal\"", "\"string not equal\"",
+  "\"string less than\"", "\"string less or equal\"",
+  "\"string greater than\"", "\"string greater or equal\"",
+  "\"string concatenation\"", "\"join operator\"", "\"split operator\"",
+  "\"substitute operator\"", "\"logical or\"", "\"logical and\"",
+  "\"logical not\"", "\"condition\"", "\"comparison\"",
+  "\"string function\"", "\"list function\"", "\"list\"", "\"words\"",
+  "\"word\"", "\"string\"", "\"substring\"", "\"variable\"",
+  "\"match regex\"", "\"substitution regex\"", "\"any regex\"",
+  "\"split\"", "\"join\"", "\"sub\"", "'('", "')'", "'{'", "'}'", "':'",
+  "','", "$accept", "expr", "string", "cond", "comp", "word", "list",
+  "substr", "var", "strfunc", "listfunc", "sub", "join", "split", "words",
+  "regex", "regsub", "regany", YY_NULL
 };
 #endif
 
@@ -529,31 +591,37 @@ static const yytype_uint16 yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      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,    40,
-      41,   123,   125,    44,    58
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,    40,    41,   123,   125,    58,    44
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    45,    46,    46,    46,    47,    47,    47,    47,    47,
-      47,    47,    47,    47,    47,    48,    48,    48,    48,    48,
-      48,    48,    48,    48,    48,    48,    48,    48,    48,    48,
-      49,    49,    50,    50,    51,    51,    51,    52,    52,    52,
-      53,    53,    54,    54,    54,    54,    54,    54,    54,    55,
-      55,    56,    57,    58
+       0,    69,    70,    70,    70,    71,    71,    71,    72,    72,
+      72,    72,    72,    72,    72,    72,    72,    72,    73,    73,
+      73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
+      73,    73,    73,    74,    74,    74,    74,    74,    74,    74,
+      74,    74,    75,    75,    75,    75,    76,    76,    77,    77,
+      77,    77,    77,    78,    78,    79,    80,    80,    81,    81,
+      81,    81,    82,    82,    82,    82,    83,    83,    84,    85,
+      86,    86
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
-       0,     2,     2,     2,     1,     1,     1,     2,     3,     3,
-       1,     2,     3,     3,     1,     3,     3,     3,     3,     3,
+       0,     2,     2,     2,     1,     1,     2,     1,     1,     1,
+       2,     3,     3,     1,     2,     3,     3,     1,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       1,     3,     1,     3,     2,     1,     1,     1,     1,     1,
-       3,     5,     1,     3,     1,     1,     1,     3,     2,     1,
-       1,     1,     4,     4
+       3,     3,     3,     1,     2,     3,     3,     1,     1,     1,
+       1,     3,     1,     1,     3,     3,     1,     1,     3,     5,
+       3,     3,     1,     4,     4,     4,     4,     6,     2,     4,
+       4,     6,     4,     6,     4,     6,     1,     3,     3,     4,
+       1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -561,47 +629,59 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     0,     0,     4,     0,     5,     6,    14,    42,     0,
-      51,     0,     0,     0,     0,     0,     2,    10,    44,     0,
-      45,    46,    36,    37,     3,    35,    38,    39,     1,     0,
-      11,    48,     0,     0,     7,     0,     0,     0,     0,     0,
+       0,     0,     0,     4,     0,     8,     9,    17,    33,     0,
+      52,     0,     0,     0,     0,     0,     0,     0,     0,     3,
+      13,     0,    37,    40,    38,    39,     7,    46,     2,     5,
+      47,     1,     0,     0,    14,    34,     0,     0,     0,     0,
+       0,     0,     0,     0,    58,    43,    42,     0,     0,     0,
+      10,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    34,     0,    47,    40,     0,
-      13,     8,     9,    12,    15,    16,    17,    18,    19,    20,
-      49,    50,    28,    29,     0,     0,    27,    30,    21,    22,
-      23,    24,    25,    26,    43,    53,     0,     0,     0,    32,
-      41,     0,    31,     0,    52,    33
+       0,     0,     6,     0,     0,     0,    35,    48,     0,    50,
+      51,     0,     0,     0,    70,    71,     0,     0,     0,    66,
+       0,     0,     0,     0,     0,    16,    41,    11,    12,    15,
+      18,    19,    20,    21,    22,    23,    30,    31,    32,    24,
+      25,    26,    27,    28,    29,    36,    53,     0,    54,     0,
+       0,     0,     0,     0,     0,    45,     0,    44,    60,     0,
+       0,    56,    67,    49,    55,    68,     0,     0,     0,    64,
+      62,    45,     0,    69,     0,     0,     0,     0,    61,    57,
+      65,    63,     0,    53
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     4,    16,    17,    76,    88,    24,    25,    18,    19,
-      72,    20,    77,    21
+      -1,     4,    28,    19,    20,    21,   124,    29,    22,    23,
+      45,    24,    25,    46,    74,    84,    85,    86
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -35
-static const yytype_int8 yypact[] =
+#define YYPACT_NINF -51
+static const yytype_int16 yypact[] =
 {
-      48,    60,    73,   -35,     7,   -35,   -35,   -35,   -35,   -34,
-     -35,    43,     8,    11,    60,    60,    86,   -35,   -35,    80,
-     -35,   -35,   -35,   -35,   108,   -35,   -35,   -35,   -35,    43,
-      25,   -35,    79,   -17,   -35,    -8,    60,    60,    43,    43,
-      43,    43,    43,    43,    43,     5,     5,     0,    43,    43,
-      43,    43,    43,    43,    43,   -35,   -27,   -35,   -35,    73,
-     -35,    86,     3,    25,    25,    25,    25,    25,    25,    25,
-     -35,   -35,   -35,   -35,    23,    43,   -35,   -35,    25,    25,
-      25,    25,    25,    25,    25,   -35,   106,    43,    85,    25,
-     -35,   -21,   -35,    43,   -35,    25
+     154,   126,   254,   -51,    23,   -51,   -51,   -51,   -51,   -38,
+     -51,    53,   161,    25,   126,     0,     5,   126,   126,    34,
+     -51,   220,   -51,   -51,   -51,   -51,   -51,   -51,   169,   -51,
+     -51,   -51,    53,    53,    -4,   -51,    10,     6,    -5,   196,
+      18,     4,     1,    53,   -15,   -51,   -51,    73,    76,    32,
+     -51,   112,   173,   126,   126,    53,    53,    53,    53,    53,
+      53,    53,    93,    93,     1,    53,    53,    53,    53,    53,
+      53,    53,   -51,   -27,    43,    44,   -51,   -51,   254,   -51,
+     -51,    53,    96,    81,   -51,   -51,    52,     1,   -50,   -16,
+      51,    53,   254,    54,    53,   -51,   -51,    79,   -51,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,   -51,   -51,   -51,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,   -51,    53,   -51,   142,
+      47,   111,    71,   132,    80,   -51,    53,   -51,    -4,   253,
+      53,    -4,   -51,   -51,   -51,   -51,   132,    83,   132,    -4,
+     -51,   -51,    49,   -51,    50,    57,    86,    53,   -51,   -51,
+     -51,   -51,    35,   -51
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -35,   -35,    57,   -35,   -35,   -35,    -9,   -20,    -2,    -5,
-      -4,    -1,   -35,   -35
+     -51,   -51,    -7,    84,   -51,   -11,   -13,   -24,    -1,   -51,
+     -51,   -51,   -51,   -51,   -35,    69,   -10,    87
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -610,58 +690,94 @@ static const yytype_int8 yypgoto[] =
 #define YYTABLE_NINF -1
 static const yytype_uint8 yytable[] =
 {
-      26,    27,    58,    32,    55,    29,    30,    28,    54,    74,
-      26,    27,    55,    85,    54,    22,    70,    71,    23,    94,
-      33,    10,    26,    27,    56,    31,    13,    59,    36,    37,
-      26,    27,    60,    63,    64,    65,    66,    67,    68,    69,
-      37,    75,    73,    78,    79,    80,    81,    82,    83,    84,
-      86,     8,     9,     1,     2,     3,    10,    26,    27,    12,
-      54,    13,    87,     5,     6,     0,    55,     7,     8,     9,
-      89,    34,    35,    10,    11,     0,    12,     0,    13,     0,
-      22,     0,    91,    23,    26,    27,    10,     0,    95,    23,
-       0,    13,    10,    61,    62,    38,    57,    13,    14,    15,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    23,     0,    23,    10,
-       0,    10,    36,    37,    13,    90,    13,    92,    93
+      34,    30,    44,    39,    72,    36,    49,    52,    90,    40,
+      40,    30,    72,    71,   125,    82,    47,    47,   126,    79,
+      27,    73,    75,    31,    71,    32,    10,    30,    77,    88,
+      76,    13,    89,    14,    37,    30,    71,   116,    93,    53,
+      54,   117,    41,    41,    99,   100,   101,   102,   103,   104,
+     105,   108,   117,    91,   109,   110,   111,   112,   113,   114,
+     115,     8,     9,    42,    87,    43,    43,    83,    48,    10,
+     120,   119,    12,    78,    13,    71,    14,    30,    53,    54,
+     128,    81,   132,   131,    71,   129,    92,    71,    47,    71,
+      71,    30,    82,    47,    15,    72,    16,    71,    38,   153,
+      94,    50,    51,   117,    82,    72,    89,   118,    96,   121,
+     140,   134,   139,   148,   149,   142,    33,   127,    30,   144,
+     123,   150,   130,   146,    54,   145,   135,    75,    30,     5,
+       6,   106,   107,     7,     8,     9,   152,    97,    98,   136,
+       8,   137,    10,    11,   141,    12,   147,    13,    10,    14,
+     151,    12,    27,    13,     0,    14,    53,    54,    10,     1,
+       2,     3,     0,    13,   133,    14,     0,    15,    26,    16,
+     122,    27,    17,    15,    41,    16,    95,    10,     0,    27,
+       0,    35,    13,     0,    14,    10,     0,     0,     0,    18,
+      13,    55,    14,     0,     0,   138,     0,    43,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    55,     0,     0,     0,     0,     0,
+      80,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    96,    55,     0,
+       0,     0,     0,     0,     0,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    26,     0,    27,    27,     0,     0,     0,   143,    10,
+      10,     0,     0,     0,    13,    13,    14,    14
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-35))
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-51)))
 
-#define yytable_value_is_error(yytable_value) \
+#define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
-static const yytype_int8 yycheck[] =
+static const yytype_int16 yycheck[] =
 {
-       2,     2,    19,    12,    24,    39,    11,     0,    35,     9,
-      12,    12,    32,    40,    35,     7,    11,    12,    10,    40,
-       9,    13,    24,    24,    29,    17,    18,    44,    36,    37,
-      32,    32,    40,    38,    39,    40,    41,    42,    43,    44,
-      37,    41,    46,    48,    49,    50,    51,    52,    53,    54,
-      59,     8,     9,     5,     6,     7,    13,    59,    59,    16,
-      35,    18,    39,     3,     4,    -1,    86,     7,     8,     9,
-      75,    14,    15,    13,    14,    -1,    16,    -1,    18,    -1,
-       7,    -1,    87,    10,    86,    86,    13,    -1,    93,    10,
-      -1,    18,    13,    36,    37,    15,    17,    18,    38,    39,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    10,    -1,    10,    13,
-      -1,    13,    36,    37,    18,    19,    18,    42,    43
+      11,     2,    15,    14,    28,    12,    16,    18,    43,     9,
+       9,    12,    36,    40,    64,    11,    12,    12,    68,    24,
+      10,    32,    33,     0,    40,    63,    16,    28,    22,    42,
+      20,    21,    43,    23,     9,    36,    40,    64,    48,    44,
+      45,    68,    42,    42,    55,    56,    57,    58,    59,    60,
+      61,    64,    68,    68,    65,    66,    67,    68,    69,    70,
+      71,     8,     9,    63,    63,    65,    65,    63,    63,    16,
+      81,    78,    19,    67,    21,    40,    23,    78,    44,    45,
+      91,    63,   117,    94,    40,    92,    13,    40,    12,    40,
+      40,    92,    11,    12,    41,   119,    43,    40,    14,    64,
+      68,    17,    18,    68,    11,   129,   117,    64,    64,    13,
+     123,    64,   123,    64,    64,   126,    63,    66,   119,   130,
+      68,    64,    68,   136,    45,   136,    15,   138,   129,     3,
+       4,    62,    63,     7,     8,     9,   147,    53,    54,    68,
+       8,     9,    16,    17,    64,    19,    63,    21,    16,    23,
+      64,    19,    10,    21,    -1,    23,    44,    45,    16,     5,
+       6,     7,    -1,    21,    22,    23,    -1,    41,     7,    43,
+      83,    10,    46,    41,    42,    43,    64,    16,    -1,    10,
+      -1,    20,    21,    -1,    23,    16,    -1,    -1,    -1,    63,
+      21,    18,    23,    -1,    -1,    63,    -1,    65,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    18,    -1,    -1,    -1,    -1,    -1,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    64,    18,    -1,
+      -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,     7,    -1,    10,    10,    -1,    -1,    -1,    15,    16,
+      16,    -1,    -1,    -1,    21,    21,    23,    23
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     5,     6,     7,    46,     3,     4,     7,     8,     9,
-      13,    14,    16,    18,    38,    39,    47,    48,    53,    54,
-      56,    58,     7,    10,    51,    52,    53,    56,     0,    39,
-      54,    17,    51,     9,    47,    47,    36,    37,    15,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    52,    54,    17,    19,    44,
-      40,    47,    47,    54,    54,    54,    54,    54,    54,    54,
-      11,    12,    55,    55,     9,    41,    49,    57,    54,    54,
-      54,    54,    54,    54,    54,    40,    51,    39,    50,    54,
-      19,    54,    42,    43,    40,    54
+       0,     5,     6,     7,    70,     3,     4,     7,     8,     9,
+      16,    17,    19,    21,    23,    41,    43,    46,    63,    72,
+      73,    74,    77,    78,    80,    81,     7,    10,    71,    76,
+      77,     0,    63,    63,    74,    20,    71,     9,    72,    74,
+       9,    42,    63,    65,    75,    79,    82,    12,    63,    85,
+      72,    72,    74,    44,    45,    18,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    76,    74,    83,    74,    20,    22,    67,    24,
+      24,    63,    11,    63,    84,    85,    86,    63,    75,    74,
+      83,    68,    13,    85,    68,    64,    64,    72,    72,    74,
+      74,    74,    74,    74,    74,    74,    84,    84,    75,    74,
+      74,    74,    74,    74,    74,    74,    64,    68,    64,    71,
+      74,    13,    86,    68,    75,    64,    68,    66,    74,    71,
+      68,    74,    83,    22,    64,    15,    68,     9,    63,    74,
+      75,    64,    74,    15,    74,    74,    75,    63,    64,    64,
+      64,    64,    74,    64
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -693,11 +809,12 @@ static const yytype_uint8 yystos[] =
 
 #define YYBACKUP(Token, Value)					\
 do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
+  if (yychar == YYEMPTY)                                        \
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      YYPOPSTACK (1);						\
+      YYPOPSTACK (yylen);                                       \
+      yystate = *yyssp;                                         \
       goto yybackup;						\
     }								\
   else								\
@@ -707,46 +824,18 @@ do								\
     }								\
 while (YYID (0))
 
-
+/* Error token number */
 #define YYTERROR	1
 #define YYERRCODE	256
 
 
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
-
-
 /* This macro is provided for backward compatibility. */
-
 #ifndef YY_LOCATION_PRINT
 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
-
 #ifdef YYLEX_PARAM
 # define YYLEX yylex (&yylval, YYLEX_PARAM)
 #else
@@ -797,6 +886,8 @@ yy_symbol_value_print (yyoutput, yytype,
     ap_expr_parse_ctx_t *ctx;
 #endif
 {
+  FILE *yyo = yyoutput;
+  YYUSE (yyo);
   if (!yyvaluep)
     return;
   YYUSE (ctx);
@@ -806,12 +897,8 @@ yy_symbol_value_print (yyoutput, yytype,
 # else
   YYUSE (yyoutput);
 # endif
-  switch (yytype)
-    {
-      default:
-	break;
+  YYUSE (yytype);
     }
-}
 
 
 /*--------------------------------.
@@ -1051,12 +1138,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = 0;
+  const char *yyformat = YY_NULL;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1116,7 +1202,8 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
                 if (! (yysize <= yysize1
                        && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
                   return 2;
@@ -1124,6 +1211,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
               }
         }
     }
+    }
 
   switch (yycount)
     {
@@ -1140,10 +1228,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
 # undef YYCASE_
     }
 
-  yysize1 = yysize + yystrlen (yyformat);
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
   if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
     return 2;
   yysize = yysize1;
+  }
 
   if (*yymsg_alloc < yysize)
     {
@@ -1201,29 +1291,10 @@ yydestruct (yymsg, yytype, yyvaluep, ctx
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
-  switch (yytype)
-    {
-
-      default:
-	break;
+  YYUSE (yytype);
     }
-}
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (ap_expr_parse_ctx_t *ctx);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /*----------.
@@ -1255,8 +1326,31 @@ yyparse (ctx)
 /* The lookahead symbol.  */
 int yychar;
 
+
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+/* Default value used for initialization, for pacifying older GCCs
+   or non-GCC compilers.  */
+static YYSTYPE yyval_default;
+# define YY_INITIAL_VALUE(Value) = Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
+YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
 
     /* Number of syntax errors so far.  */
     int yynerrs;
@@ -1269,7 +1363,7 @@ YYSTYPE yylval;
        `yyss': related to states.
        `yyvs': related to semantic values.
 
-       Refer to the stacks thru separate pointers, to allow yyoverflow
+       Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1287,7 +1381,7 @@ YYSTYPE yylval;
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
+  int yytoken = 0;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1305,9 +1399,8 @@ YYSTYPE yylval;
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1316,14 +1409,6 @@ YYSTYPE yylval;
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1464,7 +1549,9 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1501,393 +1588,442 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-
-/* Line 1806 of yacc.c  */
-#line 112 "util_expr_parse.y"
+/* Line 1787 of yacc.c  */
+#line 128 "util_expr_parse.y"
     { ctx->expr = (yyvsp[(2) - (2)].exVal); }
     break;
 
   case 3:
-
-/* Line 1806 of yacc.c  */
-#line 113 "util_expr_parse.y"
+/* Line 1787 of yacc.c  */
+#line 129 "util_expr_parse.y"
     { ctx->expr = (yyvsp[(2) - (2)].exVal); }
     break;
 
   case 4:
-
-/* Line 1806 of yacc.c  */
-#line 114 "util_expr_parse.y"
+/* Line 1787 of yacc.c  */
+#line 130 "util_expr_parse.y"
     { YYABORT; }
     break;
 
   case 5:
-
-/* Line 1806 of yacc.c  */
-#line 117 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_True,        NULL, NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 133 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 6:
-
-/* Line 1806 of yacc.c  */
-#line 118 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_False,       NULL, NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 134 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_concat_make((yyvsp[(1) - (2)].exVal), (yyvsp[(2) - (2)].exVal), ctx); }
     break;
 
   case 7:
-
-/* Line 1806 of yacc.c  */
-#line 119 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Not,         (yyvsp[(2) - (2)].exVal),   NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 135 "util_expr_parse.y"
+    { YYABORT; }
     break;
 
   case 8:
-
-/* Line 1806 of yacc.c  */
-#line 120 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Or,          (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 138 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_True,        NULL, NULL, ctx); }
     break;
 
   case 9:
-
-/* Line 1806 of yacc.c  */
-#line 121 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_And,         (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 139 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_False,       NULL, NULL, ctx); }
     break;
 
   case 10:
-
-/* Line 1806 of yacc.c  */
-#line 122 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Comp,        (yyvsp[(1) - (1)].exVal),   NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 140 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Not,         (yyvsp[(2) - (2)].exVal),   NULL, ctx); }
     break;
 
   case 11:
-
-/* Line 1806 of yacc.c  */
-#line 123 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_unary_op_make(       (yyvsp[(1) - (2)].cpVal),   (yyvsp[(2) - (2)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 141 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Or,          (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
     break;
 
   case 12:
-
-/* Line 1806 of yacc.c  */
-#line 124 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_binary_op_make((yyvsp[(2) - (3)].cpVal),   (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 142 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_And,         (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
     break;
 
   case 13:
-
-/* Line 1806 of yacc.c  */
-#line 125 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 143 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Comp,        (yyvsp[(1) - (1)].exVal),   NULL, ctx); }
     break;
 
   case 14:
-
-/* Line 1806 of yacc.c  */
-#line 126 "util_expr_parse.y"
-    { YYABORT; }
+/* Line 1787 of yacc.c  */
+#line 144 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_unary_op_make(       (yyvsp[(1) - (2)].cpVal),   (yyvsp[(2) - (2)].exVal),   ctx); }
     break;
 
   case 15:
-
-/* Line 1806 of yacc.c  */
-#line 129 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_EQ,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 145 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_binary_op_make((yyvsp[(2) - (3)].cpVal),   (yyvsp[(1) - (3)].exVal),   (yyvsp[(3) - (3)].exVal),   ctx); }
     break;
 
   case 16:
-
-/* Line 1806 of yacc.c  */
-#line 130 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_NE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 146 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
     break;
 
   case 17:
-
-/* Line 1806 of yacc.c  */
-#line 131 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_LT,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 147 "util_expr_parse.y"
+    { YYABORT; }
     break;
 
   case 18:
-
-/* Line 1806 of yacc.c  */
-#line 132 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_LE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 150 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_EQ,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 19:
-
-/* Line 1806 of yacc.c  */
-#line 133 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_GT,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 151 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_NE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 20:
-
-/* Line 1806 of yacc.c  */
-#line 134 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_GE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 152 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_LT,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 21:
-
-/* Line 1806 of yacc.c  */
-#line 135 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_EQ,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 153 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_LE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 22:
-
-/* Line 1806 of yacc.c  */
-#line 136 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_NE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 154 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_GT,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 23:
-
-/* Line 1806 of yacc.c  */
-#line 137 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_LT,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 155 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_GE,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 24:
-
-/* Line 1806 of yacc.c  */
-#line 138 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_LE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 156 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_EQ,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 25:
-
-/* Line 1806 of yacc.c  */
-#line 139 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_GT,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 157 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_NE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 26:
-
-/* Line 1806 of yacc.c  */
-#line 140 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_STR_GE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 158 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_LT,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 27:
-
-/* Line 1806 of yacc.c  */
-#line 141 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_IN,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 159 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_LE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 28:
-
-/* Line 1806 of yacc.c  */
-#line 142 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_REG,     (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 160 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_GT,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 29:
-
-/* Line 1806 of yacc.c  */
-#line 143 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_NRE,     (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 161 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_STR_GE,  (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 30:
-
-/* Line 1806 of yacc.c  */
-#line 146 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 162 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_REG,     (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 31:
-
-/* Line 1806 of yacc.c  */
-#line 147 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 163 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_NRE,     (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 32:
-
-/* Line 1806 of yacc.c  */
-#line 150 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_ListElement, (yyvsp[(1) - (1)].exVal), NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 164 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_IN,      (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal), ctx); }
     break;
 
   case 33:
-
-/* Line 1806 of yacc.c  */
-#line 151 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_ListElement, (yyvsp[(3) - (3)].exVal), (yyvsp[(1) - (3)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 167 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Digit,  (yyvsp[(1) - (1)].cpVal), NULL, ctx); }
     break;
 
   case 34:
-
-/* Line 1806 of yacc.c  */
-#line 154 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Concat, (yyvsp[(1) - (2)].exVal), (yyvsp[(2) - (2)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 168 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_String, "", NULL, ctx); }
     break;
 
   case 35:
-
-/* Line 1806 of yacc.c  */
-#line 155 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 169 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
     break;
 
   case 36:
-
-/* Line 1806 of yacc.c  */
-#line 156 "util_expr_parse.y"
-    { YYABORT; }
+/* Line 1787 of yacc.c  */
+#line 170 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Concat, (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal),   ctx); }
     break;
 
   case 37:
-
-/* Line 1806 of yacc.c  */
-#line 159 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_String, (yyvsp[(1) - (1)].cpVal), NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 171 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 38:
-
-/* Line 1806 of yacc.c  */
-#line 160 "util_expr_parse.y"
+/* Line 1787 of yacc.c  */
+#line 172 "util_expr_parse.y"
     { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 39:
-
-/* Line 1806 of yacc.c  */
-#line 161 "util_expr_parse.y"
+/* Line 1787 of yacc.c  */
+#line 173 "util_expr_parse.y"
     { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 40:
-
-/* Line 1806 of yacc.c  */
-#line 164 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_var_make((yyvsp[(2) - (3)].cpVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 174 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 41:
-
-/* Line 1806 of yacc.c  */
-#line 165 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_str_func_make((yyvsp[(2) - (5)].cpVal), (yyvsp[(4) - (5)].exVal), ctx); }
+/* Line 1787 of yacc.c  */
+#line 175 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
     break;
 
   case 42:
-
-/* Line 1806 of yacc.c  */
-#line 168 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Digit,  (yyvsp[(1) - (1)].cpVal), NULL, ctx); }
+/* Line 1787 of yacc.c  */
+#line 178 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 43:
-
-/* Line 1806 of yacc.c  */
-#line 169 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_Concat, (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal),   ctx); }
+/* Line 1787 of yacc.c  */
+#line 179 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
   case 44:
-
-/* Line 1806 of yacc.c  */
-#line 170 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 180 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
     break;
 
   case 45:
-
-/* Line 1806 of yacc.c  */
-#line 171 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
+/* Line 1787 of yacc.c  */
+#line 181 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
     break;
 
   case 46:
+/* Line 1787 of yacc.c  */
+#line 184 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_String, (yyvsp[(1) - (1)].cpVal), NULL, ctx); }
+    break;
 
-/* Line 1806 of yacc.c  */
-#line 172 "util_expr_parse.y"
+  case 47:
+/* Line 1787 of yacc.c  */
+#line 185 "util_expr_parse.y"
     { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
-  case 47:
+  case 48:
+/* Line 1787 of yacc.c  */
+#line 188 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_var_make((yyvsp[(2) - (3)].cpVal), ctx); }
+    break;
 
-/* Line 1806 of yacc.c  */
-#line 173 "util_expr_parse.y"
-    { (yyval.exVal) = (yyvsp[(2) - (3)].exVal); }
+  case 49:
+/* Line 1787 of yacc.c  */
+#line 189 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_str_func_make((yyvsp[(2) - (5)].cpVal), (yyvsp[(4) - (5)].exVal), ctx); }
     break;
 
-  case 48:
+  case 50:
+/* Line 1787 of yacc.c  */
+#line 190 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Bool, (yyvsp[(2) - (3)].exVal), NULL, ctx); }
+    break;
 
-/* Line 1806 of yacc.c  */
-#line 174 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_make(op_String, "", NULL, ctx); }
+  case 51:
+/* Line 1787 of yacc.c  */
+#line 191 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Word, (yyvsp[(2) - (3)].exVal), NULL, ctx); }
     break;
 
-  case 49:
+  case 52:
+/* Line 1787 of yacc.c  */
+#line 192 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_backref_make((yyvsp[(1) - (1)].num), ctx); }
+    break;
 
-/* Line 1806 of yacc.c  */
-#line 177 "util_expr_parse.y"
-    {
-                ap_regex_t *regex;
-                if ((regex = ap_pregcomp(ctx->pool, (yyvsp[(1) - (1)].cpVal),
-                                         AP_REG_EXTENDED|AP_REG_NOSUB)) == NULL) {
-                    ctx->error = "Failed to compile regular expression";
-                    YYERROR;
-                }
-                (yyval.exVal) = ap_expr_make(op_Regex, regex, NULL, ctx);
-            }
+  case 53:
+/* Line 1787 of yacc.c  */
+#line 195 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_str_func_make((yyvsp[(1) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), ctx); }
     break;
 
-  case 50:
+  case 54:
+/* Line 1787 of yacc.c  */
+#line 196 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_str_func_make((yyvsp[(1) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), ctx); }
+    break;
+
+  case 55:
+/* Line 1787 of yacc.c  */
+#line 199 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_list_func_make((yyvsp[(1) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), ctx); }
+    break;
+
+  case 56:
+/* Line 1787 of yacc.c  */
+#line 203 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Sub, (yyvsp[(4) - (4)].exVal), (yyvsp[(2) - (4)].exVal), ctx); }
+    break;
+
+  case 57:
+/* Line 1787 of yacc.c  */
+#line 204 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Sub, (yyvsp[(5) - (6)].exVal), (yyvsp[(3) - (6)].exVal), ctx); }
+    break;
+
+  case 58:
+/* Line 1787 of yacc.c  */
+#line 207 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Join, (yyvsp[(2) - (2)].exVal), NULL, ctx); }
+    break;
+
+  case 59:
+/* Line 1787 of yacc.c  */
+#line 208 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Join, (yyvsp[(3) - (4)].exVal), NULL, ctx); }
+    break;
+
+  case 60:
+/* Line 1787 of yacc.c  */
+#line 209 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Join, (yyvsp[(2) - (4)].exVal), (yyvsp[(4) - (4)].exVal),   ctx); }
+    break;
+
+  case 61:
+/* Line 1787 of yacc.c  */
+#line 210 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Join, (yyvsp[(3) - (6)].exVal), (yyvsp[(5) - (6)].exVal),   ctx); }
+    break;
+
+  case 62:
+/* Line 1787 of yacc.c  */
+#line 213 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Split, (yyvsp[(4) - (4)].exVal), (yyvsp[(2) - (4)].exVal), ctx); }
+    break;
+
+  case 63:
+/* Line 1787 of yacc.c  */
+#line 214 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Split, (yyvsp[(5) - (6)].exVal), (yyvsp[(3) - (6)].exVal), ctx); }
+    break;
+
+  case 64:
+/* Line 1787 of yacc.c  */
+#line 215 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Split, (yyvsp[(4) - (4)].exVal), (yyvsp[(2) - (4)].exVal), ctx); }
+    break;
+
+  case 65:
+/* Line 1787 of yacc.c  */
+#line 216 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_Split, (yyvsp[(5) - (6)].exVal), (yyvsp[(3) - (6)].exVal), ctx); }
+    break;
+
+  case 66:
+/* Line 1787 of yacc.c  */
+#line 219 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_ListElement, (yyvsp[(1) - (1)].exVal), NULL, ctx); }
+    break;
+
+  case 67:
+/* Line 1787 of yacc.c  */
+#line 220 "util_expr_parse.y"
+    { (yyval.exVal) = ap_expr_make(op_ListElement, (yyvsp[(1) - (3)].exVal), (yyvsp[(3) - (3)].exVal),   ctx); }
+    break;
 
-/* Line 1806 of yacc.c  */
-#line 186 "util_expr_parse.y"
+  case 68:
+/* Line 1787 of yacc.c  */
+#line 223 "util_expr_parse.y"
     {
-                ap_regex_t *regex;
-                if ((regex = ap_pregcomp(ctx->pool, (yyvsp[(1) - (1)].cpVal),
-                                         AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) {
+                ap_expr_t *e = ap_expr_regex_make((yyvsp[(2) - (3)].cpVal), NULL, (yyvsp[(3) - (3)].cpVal), ctx);
+                if (!e) {
                     ctx->error = "Failed to compile regular expression";
                     YYERROR;
                 }
-                (yyval.exVal) = ap_expr_make(op_Regex, regex, NULL, ctx);
+                (yyval.exVal) = e;
             }
     break;
 
-  case 51:
-
-/* Line 1806 of yacc.c  */
-#line 197 "util_expr_parse.y"
+  case 69:
+/* Line 1787 of yacc.c  */
+#line 232 "util_expr_parse.y"
     {
-                int *n = apr_palloc(ctx->pool, sizeof(int));
-                *n = (yyvsp[(1) - (1)].num);
-                (yyval.exVal) = ap_expr_make(op_RegexBackref, n, NULL, ctx);
+                ap_expr_t *e = ap_expr_regex_make((yyvsp[(2) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), (yyvsp[(4) - (4)].cpVal), ctx);
+                if (!e) {
+                    ctx->error = "Failed to compile regular expression";
+                    YYERROR;
+                }
+                (yyval.exVal) = e;
             }
     break;
 
-  case 52:
-
-/* Line 1806 of yacc.c  */
-#line 204 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_list_func_make((yyvsp[(1) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), ctx); }
+  case 70:
+/* Line 1787 of yacc.c  */
+#line 241 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
-  case 53:
-
-/* Line 1806 of yacc.c  */
-#line 207 "util_expr_parse.y"
-    { (yyval.exVal) = ap_expr_str_func_make((yyvsp[(1) - (4)].cpVal), (yyvsp[(3) - (4)].exVal), ctx); }
+  case 71:
+/* Line 1787 of yacc.c  */
+#line 242 "util_expr_parse.y"
+    { (yyval.exVal) = (yyvsp[(1) - (1)].exVal); }
     break;
 
 
-
-/* Line 1806 of yacc.c  */
-#line 1891 "util_expr_parse.c"
+/* Line 1787 of yacc.c  */
+#line 2027 "util_expr_parse.c"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2050,7 +2186,9 @@ yyerrlab1:
       YY_STACK_PRINT (yyss, yyssp);
     }
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -2074,7 +2212,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined(yyoverflow) || YYERROR_VERBOSE
+#if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2116,9 +2254,8 @@ yyreturn:
 }
 
 
-
-/* Line 2067 of yacc.c  */
-#line 210 "util_expr_parse.y"
+/* Line 2050 of yacc.c  */
+#line 245 "util_expr_parse.y"
 
 
 void yyerror(ap_expr_parse_ctx_t *ctx, const char *s)
@@ -2127,4 +2264,3 @@ void yyerror(ap_expr_parse_ctx_t *ctx, c
     ctx->error = apr_pstrdup(ctx->ptemp, s);
 }
 
-

Modified: httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.h
URL: http://svn.apache.org/viewvc/httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.h?rev=1840688&r1=1840687&r2=1840688&view=diff
==============================================================================
--- httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.h (original)
+++ httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.h Wed Sep 12 13:56:17 2018
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.1.  */
 
 /* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2013 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
@@ -30,6 +30,15 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+#ifndef YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED
+# define YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int ap_expr_yydebug;
+#endif
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -46,43 +55,49 @@
      T_ID = 264,
      T_STRING = 265,
      T_REGEX = 266,
-     T_REGEX_I = 267,
-     T_REGEX_BACKREF = 268,
-     T_OP_UNARY = 269,
-     T_OP_BINARY = 270,
-     T_STR_BEGIN = 271,
-     T_STR_END = 272,
-     T_VAR_BEGIN = 273,
-     T_VAR_END = 274,
-     T_OP_EQ = 275,
-     T_OP_NE = 276,
-     T_OP_LT = 277,
-     T_OP_LE = 278,
-     T_OP_GT = 279,
-     T_OP_GE = 280,
-     T_OP_REG = 281,
-     T_OP_NRE = 282,
-     T_OP_IN = 283,
-     T_OP_STR_EQ = 284,
-     T_OP_STR_NE = 285,
-     T_OP_STR_LT = 286,
-     T_OP_STR_LE = 287,
-     T_OP_STR_GT = 288,
-     T_OP_STR_GE = 289,
-     T_OP_CONCAT = 290,
-     T_OP_OR = 291,
-     T_OP_AND = 292,
-     T_OP_NOT = 293
+     T_REGSUB = 267,
+     T_REG_MATCH = 268,
+     T_REG_SUBST = 269,
+     T_REG_FLAGS = 270,
+     T_BACKREF = 271,
+     T_OP_UNARY = 272,
+     T_OP_BINARY = 273,
+     T_STR_BEGIN = 274,
+     T_STR_END = 275,
+     T_VAR_BEGIN = 276,
+     T_VAR_END = 277,
+     T_VAREXP_BEGIN = 278,
+     T_VAREXP_END = 279,
+     T_OP_EQ = 280,
+     T_OP_NE = 281,
+     T_OP_LT = 282,
+     T_OP_LE = 283,
+     T_OP_GT = 284,
+     T_OP_GE = 285,
+     T_OP_REG = 286,
+     T_OP_NRE = 287,
+     T_OP_IN = 288,
+     T_OP_STR_EQ = 289,
+     T_OP_STR_NE = 290,
+     T_OP_STR_LT = 291,
+     T_OP_STR_LE = 292,
+     T_OP_STR_GT = 293,
+     T_OP_STR_GE = 294,
+     T_OP_CONCAT = 295,
+     T_OP_JOIN = 296,
+     T_OP_SPLIT = 297,
+     T_OP_SUB = 298,
+     T_OP_OR = 299,
+     T_OP_AND = 300,
+     T_OP_NOT = 301
    };
 #endif
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 2068 of yacc.c  */
+/* Line 2053 of yacc.c  */
 #line 35 "util_expr_parse.y"
 
     char      *cpVal;
@@ -90,9 +105,8 @@ typedef union YYSTYPE
     int        num;
 
 
-
-/* Line 2068 of yacc.c  */
-#line 96 "util_expr_parse.h"
+/* Line 2053 of yacc.c  */
+#line 110 "util_expr_parse.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -100,5 +114,18 @@ typedef union YYSTYPE
 #endif
 
 
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int ap_expr_yyparse (void *YYPARSE_PARAM);
+#else
+int ap_expr_yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int ap_expr_yyparse (ap_expr_parse_ctx_t *ctx);
+#else
+int ap_expr_yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
-
+#endif /* !YY_AP_EXPR_YY_UTIL_EXPR_PARSE_H_INCLUDED  */

Modified: httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.y
URL: http://svn.apache.org/viewvc/httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.y?rev=1840688&r1=1840687&r2=1840688&view=diff
==============================================================================
--- httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.y (original)
+++ httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_parse.y Wed Sep 12 13:56:17 2018
@@ -38,66 +38,82 @@
     int        num;
 }
 
-%token  T_TRUE
-%token  T_FALSE
+%token  T_TRUE                      "true"
+%token  T_FALSE                     "false"
 
-%token  T_EXPR_BOOL
-%token  T_EXPR_STRING
+%token  T_EXPR_BOOL                 "boolean expression"
+%token  T_EXPR_STRING               "string expression"
 
-%token  <cpVal> T_ERROR
+%token  <cpVal> T_ERROR             "error token"
 
-%token  <cpVal> T_DIGIT
-%token  <cpVal> T_ID
-%token  <cpVal> T_STRING
-%token  <cpVal> T_REGEX
-%token  <cpVal> T_REGEX_I
-%token  <num>   T_REGEX_BACKREF
-%token  <cpVal> T_OP_UNARY
-%token  <cpVal> T_OP_BINARY
-
-%token  T_STR_BEGIN
-%token  T_STR_END
-%token  T_VAR_BEGIN
-%token  T_VAR_END
-
-%token  T_OP_EQ
-%token  T_OP_NE
-%token  T_OP_LT
-%token  T_OP_LE
-%token  T_OP_GT
-%token  T_OP_GE
-%token  T_OP_REG
-%token  T_OP_NRE
-%token  T_OP_IN
-%token  T_OP_STR_EQ
-%token  T_OP_STR_NE
-%token  T_OP_STR_LT
-%token  T_OP_STR_LE
-%token  T_OP_STR_GT
-%token  T_OP_STR_GE
-%token  T_OP_CONCAT
-
-%token  T_OP_OR
-%token  T_OP_AND
-%token  T_OP_NOT
+%token  <cpVal> T_DIGIT             "number"
+%token  <cpVal> T_ID                "identifier"
+%token  <cpVal> T_STRING            "string literal"
+
+%token          T_REGEX             "start of matching regex"
+%token          T_REGSUB            "start of substitution regex"
+%token  <cpVal> T_REG_MATCH         "pattern of the regex"
+%token  <cpVal> T_REG_SUBST         "substitution of the regex"
+%token  <cpVal> T_REG_FLAGS         "pattern flags of the regex"
+%token  <num>   T_BACKREF           "regex back reference"
+
+%token  <cpVal> T_OP_UNARY          "unary operator"
+%token  <cpVal> T_OP_BINARY         "binary operator"
+
+%token  T_STR_BEGIN                 "start of string"
+%token  T_STR_END                   "end of string"
+%token  T_VAR_BEGIN                 "start of variable name"
+%token  T_VAR_END                   "end of variable name"
+%token  T_VAREXP_BEGIN              "start of variable expression"
+%token  T_VAREXP_END                "end of variable expression"
+
+%token  T_OP_EQ                     "integer equal"
+%token  T_OP_NE                     "integer not equal"
+%token  T_OP_LT                     "integer less than"
+%token  T_OP_LE                     "integer less or equal"
+%token  T_OP_GT                     "integer greater than"
+%token  T_OP_GE                     "integer greater or equal"
+%token  T_OP_REG                    "regex match"
+%token  T_OP_NRE                    "regex non-match"
+%token  T_OP_IN                     "contained in"
+%token  T_OP_STR_EQ                 "string equal"
+%token  T_OP_STR_NE                 "string not equal"
+%token  T_OP_STR_LT                 "string less than"
+%token  T_OP_STR_LE                 "string less or equal"
+%token  T_OP_STR_GT                 "string greater than"
+%token  T_OP_STR_GE                 "string greater or equal"
+
+%token  T_OP_CONCAT                 "string concatenation"
+
+%token  T_OP_JOIN                   "join operator"
+%token  T_OP_SPLIT                  "split operator"
+%token  T_OP_SUB                    "substitute operator"
+
+%token  T_OP_OR                     "logical or"
+%token  T_OP_AND                    "logical and"
+%token  T_OP_NOT                    "logical not"
 
-%right  T_OP_OR
-%right  T_OP_AND
+%left   T_OP_OR
+%left   T_OP_AND
 %right  T_OP_NOT
 %right  T_OP_CONCAT
 
-%type   <exVal>   expr
-%type   <exVal>   comparison
-%type   <exVal>   strfunccall
-%type   <exVal>   lstfunccall
-%type   <exVal>   regex
-%type   <exVal>   words
-%type   <exVal>   wordlist
-%type   <exVal>   word
-%type   <exVal>   string
-%type   <exVal>   strpart
-%type   <exVal>   var
-%type   <exVal>   backref
+%type   <exVal>   cond              "condition"
+%type   <exVal>   comp              "comparison"
+%type   <exVal>   strfunc           "string function"
+%type   <exVal>   listfunc          "list function"
+%type   <exVal>   list              "list"
+%type   <exVal>   words             "words"
+%type   <exVal>   word              "word"
+%type   <exVal>   string            "string"
+%type   <exVal>   substr            "substring"
+%type   <exVal>   var               "variable"
+%type   <exVal>   regex             "match regex"
+%type   <exVal>   regsub            "substitution regex"
+%type   <exVal>   regany            "any regex"
+%type   <exVal>   split             "split"
+%type   <exVal>   join              "join"
+%type   <exVal>   sub               "sub"
 
 %{
 #include "util_expr_private.h"
@@ -109,24 +125,29 @@ int ap_expr_yylex(YYSTYPE *lvalp, void *
 
 %%
 
-root      : T_EXPR_BOOL   expr           { ctx->expr = $2; }
-          | T_EXPR_STRING string         { ctx->expr = $2; }
+expr      : T_EXPR_STRING string         { ctx->expr = $2; }
+          | T_EXPR_BOOL   cond           { ctx->expr = $2; }
           | T_ERROR                      { YYABORT; }
           ;
 
-expr      : T_TRUE                       { $$ = ap_expr_make(op_True,        NULL, NULL, ctx); }
+string    : substr                       { $$ = $1; }
+          | string substr                { $$ = ap_expr_concat_make($1, $2, ctx); }
+          | T_ERROR                      { YYABORT; }
+          ;
+
+cond      : T_TRUE                       { $$ = ap_expr_make(op_True,        NULL, NULL, ctx); }
           | T_FALSE                      { $$ = ap_expr_make(op_False,       NULL, NULL, ctx); }
-          | T_OP_NOT expr                { $$ = ap_expr_make(op_Not,         $2,   NULL, ctx); }
-          | expr T_OP_OR expr            { $$ = ap_expr_make(op_Or,          $1,   $3,   ctx); }
-          | expr T_OP_AND expr           { $$ = ap_expr_make(op_And,         $1,   $3,   ctx); }
-          | comparison                   { $$ = ap_expr_make(op_Comp,        $1,   NULL, ctx); }
+          | T_OP_NOT cond                { $$ = ap_expr_make(op_Not,         $2,   NULL, ctx); }
+          | cond T_OP_OR cond            { $$ = ap_expr_make(op_Or,          $1,   $3,   ctx); }
+          | cond T_OP_AND cond           { $$ = ap_expr_make(op_And,         $1,   $3,   ctx); }
+          | comp                         { $$ = ap_expr_make(op_Comp,        $1,   NULL, ctx); }
           | T_OP_UNARY word              { $$ = ap_expr_unary_op_make(       $1,   $2,   ctx); }
           | word T_OP_BINARY word        { $$ = ap_expr_binary_op_make($2,   $1,   $3,   ctx); }
-          | '(' expr ')'                 { $$ = $2; }
+          | '(' cond ')'                 { $$ = $2; }
           | T_ERROR                      { YYABORT; }
           ;
 
-comparison: word T_OP_EQ word            { $$ = ap_expr_make(op_EQ,      $1, $3, ctx); }
+comp      : word T_OP_EQ word            { $$ = ap_expr_make(op_EQ,      $1, $3, ctx); }
           | word T_OP_NE word            { $$ = ap_expr_make(op_NE,      $1, $3, ctx); }
           | word T_OP_LT word            { $$ = ap_expr_make(op_LT,      $1, $3, ctx); }
           | word T_OP_LE word            { $$ = ap_expr_make(op_LE,      $1, $3, ctx); }
@@ -138,73 +159,87 @@ comparison: word T_OP_EQ word
           | word T_OP_STR_LE word        { $$ = ap_expr_make(op_STR_LE,  $1, $3, ctx); }
           | word T_OP_STR_GT word        { $$ = ap_expr_make(op_STR_GT,  $1, $3, ctx); }
           | word T_OP_STR_GE word        { $$ = ap_expr_make(op_STR_GE,  $1, $3, ctx); }
-          | word T_OP_IN wordlist        { $$ = ap_expr_make(op_IN,      $1, $3, ctx); }
           | word T_OP_REG regex          { $$ = ap_expr_make(op_REG,     $1, $3, ctx); }
           | word T_OP_NRE regex          { $$ = ap_expr_make(op_NRE,     $1, $3, ctx); }
+          | word T_OP_IN list            { $$ = ap_expr_make(op_IN,      $1, $3, ctx); }
           ;
 
-wordlist  : lstfunccall                  { $$ = $1; }
-          | '{' words '}'                { $$ = $2; }
-          ;
-
-words     : word                         { $$ = ap_expr_make(op_ListElement, $1, NULL, ctx); }
-          | words ',' word               { $$ = ap_expr_make(op_ListElement, $3, $1,   ctx); }
+word      : T_DIGIT                      { $$ = ap_expr_make(op_Digit,  $1, NULL, ctx); }
+          | T_STR_BEGIN T_STR_END        { $$ = ap_expr_make(op_String, "", NULL, ctx); }
+          | T_STR_BEGIN string T_STR_END { $$ = $2; }
+          | word T_OP_CONCAT word        { $$ = ap_expr_make(op_Concat, $1, $3,   ctx); }
+          | var                          { $$ = $1; }
+          | sub                          { $$ = $1; }
+          | join                         { $$ = $1; }
+          | strfunc                      { $$ = $1; }
+          | '(' word ')'                 { $$ = $2; }
           ;
 
-string    : string strpart               { $$ = ap_expr_make(op_Concat, $1, $2, ctx); }
-          | strpart                      { $$ = $1; }
-          | T_ERROR                      { YYABORT; }
+list      : split                        { $$ = $1; }
+          | listfunc                     { $$ = $1; }
+          | '{' words '}'                { $$ = $2; }
+          | '(' list ')'                 { $$ = $2; }
           ;
 
-strpart   : T_STRING                     { $$ = ap_expr_make(op_String, $1, NULL, ctx); }
+substr    : T_STRING                     { $$ = ap_expr_make(op_String, $1, NULL, ctx); }
           | var                          { $$ = $1; }
-          | backref                      { $$ = $1; }
           ;
 
 var       : T_VAR_BEGIN T_ID T_VAR_END            { $$ = ap_expr_var_make($2, ctx); }
           | T_VAR_BEGIN T_ID ':' string T_VAR_END { $$ = ap_expr_str_func_make($2, $4, ctx); }
+          | T_VAREXP_BEGIN cond T_VAREXP_END      { $$ = ap_expr_make(op_Bool, $2, NULL, ctx); }
+          | T_VAREXP_BEGIN word T_VAREXP_END      { $$ = ap_expr_make(op_Word, $2, NULL, ctx); }
+          | T_BACKREF                             { $$ = ap_expr_backref_make($1, ctx); }
           ;
 
-word      : T_DIGIT                      { $$ = ap_expr_make(op_Digit,  $1, NULL, ctx); }
-          | word T_OP_CONCAT word        { $$ = ap_expr_make(op_Concat, $1, $3,   ctx); }
-          | var                          { $$ = $1; }
-          | backref                      { $$ = $1; }
-          | strfunccall                  { $$ = $1; }
-          | T_STR_BEGIN string T_STR_END { $$ = $2; }
-          | T_STR_BEGIN T_STR_END        { $$ = ap_expr_make(op_String, "", NULL, ctx); }
+strfunc   : T_ID '(' word ')'            { $$ = ap_expr_str_func_make($1, $3, ctx); }
+          | T_ID '(' words ')'           { $$ = ap_expr_str_func_make($1, $3, ctx); }
           ;
 
-regex     : T_REGEX {
-                ap_regex_t *regex;
-                if ((regex = ap_pregcomp(ctx->pool, $1,
-                                         AP_REG_EXTENDED|AP_REG_NOSUB)) == NULL) {
+listfunc  : T_ID '(' word ')'            { $$ = ap_expr_list_func_make($1, $3, ctx); }
+       /* | T_ID '(' words ')'           { $$ = ap_expr_list_func_make($1, $3, ctx); } */
+          ;
+
+sub       : T_OP_SUB     regsub ',' word     { $$ = ap_expr_make(op_Sub, $4, $2, ctx); }
+          | T_OP_SUB '(' regsub ',' word ')' { $$ = ap_expr_make(op_Sub, $5, $3, ctx); }
+          ;
+
+join      : T_OP_JOIN     list              { $$ = ap_expr_make(op_Join, $2, NULL, ctx); }
+          | T_OP_JOIN '(' list ')'          { $$ = ap_expr_make(op_Join, $3, NULL, ctx); }
+          | T_OP_JOIN     list ',' word     { $$ = ap_expr_make(op_Join, $2, $4,   ctx); }
+          | T_OP_JOIN '(' list ',' word ')' { $$ = ap_expr_make(op_Join, $3, $5,   ctx); }
+          ;
+
+split     : T_OP_SPLIT     regany ',' list     { $$ = ap_expr_make(op_Split, $4, $2, ctx); }
+          | T_OP_SPLIT '(' regany ',' list ')' { $$ = ap_expr_make(op_Split, $5, $3, ctx); }
+          | T_OP_SPLIT     regany ',' word     { $$ = ap_expr_make(op_Split, $4, $2, ctx); }
+          | T_OP_SPLIT '(' regany ',' word ')' { $$ = ap_expr_make(op_Split, $5, $3, ctx); }
+          ;
+
+words     : word                         { $$ = ap_expr_make(op_ListElement, $1, NULL, ctx); }
+          | word ',' words               { $$ = ap_expr_make(op_ListElement, $1, $3,   ctx); }
+          ;
+
+regex     : T_REGEX T_REG_MATCH T_REG_FLAGS {
+                ap_expr_t *e = ap_expr_regex_make($2, NULL, $3, ctx);
+                if (!e) {
                     ctx->error = "Failed to compile regular expression";
                     YYERROR;
                 }
-                $$ = ap_expr_make(op_Regex, regex, NULL, ctx);
+                $$ = e;
             }
-          | T_REGEX_I {
-                ap_regex_t *regex;
-                if ((regex = ap_pregcomp(ctx->pool, $1,
-                                         AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) {
+          ;
+regsub    : T_REGSUB T_REG_MATCH string T_REG_FLAGS {
+                ap_expr_t *e = ap_expr_regex_make($2, $3, $4, ctx);
+                if (!e) {
                     ctx->error = "Failed to compile regular expression";
                     YYERROR;
                 }
-                $$ = ap_expr_make(op_Regex, regex, NULL, ctx);
+                $$ = e;
             }
           ;
-
-backref     : T_REGEX_BACKREF   {
-                int *n = apr_palloc(ctx->pool, sizeof(int));
-                *n = $1;
-                $$ = ap_expr_make(op_RegexBackref, n, NULL, ctx);
-            }
-            ;
-
-lstfunccall : T_ID '(' word ')' { $$ = ap_expr_list_func_make($1, $3, ctx); }
-            ;
-
-strfunccall : T_ID '(' word ')' { $$ = ap_expr_str_func_make($1, $3, ctx); }
+regany    : regex   { $$ = $1; }
+          | regsub  { $$ = $1; }
             ;
 
 %%

Modified: httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_private.h
URL: http://svn.apache.org/viewvc/httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_private.h?rev=1840688&r1=1840687&r2=1840688&view=diff
==============================================================================
--- httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_private.h (original)
+++ httpd/sandbox/httpd-2.4.x-trunk-delta/server/util_expr_private.h Wed Sep 12 13:56:17 2018
@@ -54,9 +54,10 @@ typedef enum {
     op_REG, op_NRE,
     op_STR_EQ, op_STR_NE, op_STR_LT, op_STR_LE, op_STR_GT, op_STR_GE,
     op_Concat,
-    op_Digit, op_String, op_Regex, op_RegexBackref,
-    op_Var,
-    op_ListElement,
+    op_String, op_Word,
+    op_Digit, op_Var, op_Bool, op_ListElement,
+    op_Sub, op_Split, op_Join,
+    op_Regex, op_Backref,
     /*
      * call external functions/operators.
      * The info node contains the function pointer and some function specific
@@ -79,6 +80,15 @@ struct ap_expr_node {
     const void *node_arg2;
 };
 
+/** The stack used by scanner and parser */
+typedef struct ap_expr_parser_stack {
+    char *scan_ptr;
+    char  scan_buf[MAX_STRING_LEN];
+    int   scan_stop;
+    int   scan_flag;
+    struct ap_expr_parser_stack *next;
+} ap_expr_parser_stack_t;
+
 /** The context used by scanner and parser */
 typedef struct {
     /* internal state of the scanner */
@@ -86,9 +96,8 @@ typedef struct {
     int                inputlen;
     const char        *inputptr;
     void              *scanner;
-    char              *scan_ptr;
-    char               scan_buf[MAX_STRING_LEN];
-    char               scan_del;
+    ap_expr_parser_stack_t *current,
+                           *spares;
     int                at_start;
 
     /* pools for result and temporary usage */
@@ -119,6 +128,10 @@ void ap_expr_yyset_extra(ap_expr_parse_c
 /* create a parse tree node */
 ap_expr_t *ap_expr_make(ap_expr_node_op_e op, const void *arg1,
                         const void *arg2, ap_expr_parse_ctx_t *ctx);
+ap_expr_t *ap_expr_concat_make(const void *a1, const void *a2,
+                               ap_expr_parse_ctx_t *ctx);
+ap_expr_t *ap_expr_regex_make(const char *pattern, const ap_expr_t *subst,
+                              const char *flags, ap_expr_parse_ctx_t *ctx);
 /* create parse tree node for the string-returning function 'name' */
 ap_expr_t *ap_expr_str_func_make(const char *name, const ap_expr_t *arg,
                                ap_expr_parse_ctx_t *ctx);
@@ -127,6 +140,8 @@ ap_expr_t *ap_expr_list_func_make(const
                                 ap_expr_parse_ctx_t *ctx);
 /* create parse tree node for the variable 'name' */
 ap_expr_t *ap_expr_var_make(const char *name, ap_expr_parse_ctx_t *ctx);
+/* create parse tree node for the back reference 'num' */
+ap_expr_t *ap_expr_backref_make(int num, ap_expr_parse_ctx_t *ctx);
 /* create parse tree node for the unary operator 'name' */
 ap_expr_t *ap_expr_unary_op_make(const char *name, const ap_expr_t *arg,
                                ap_expr_parse_ctx_t *ctx);