]> granicus.if.org Git - jq/commitdiff
Merge branch 'master' of https://github.com/stedolan/jq into contains-operator 36/head
authorStephen Roantree <stroantree@gmail.com>
Thu, 25 Oct 2012 17:02:02 +0000 (10:02 -0700)
committerStephen Roantree <stroantree@gmail.com>
Thu, 25 Oct 2012 17:02:02 +0000 (10:02 -0700)
Conflicts:
lexer.gen.c
parser.gen.c
parser.gen.h
parser.gen.info
parser.y

1  2 
parser.gen.c
parser.gen.info
parser.y

diff --cc parser.gen.c
index 3c157f489e5b2ead91120d8f3c4cf9f6924ed7a2,4abc81e73e4a77c93feed69db1b245a28f11c0d8..896eb2a35c3716b5f33194a25f0a1699233ef9d4
@@@ -573,56 -571,54 +573,56 @@@ static const yytype_uint16 yyprhs[] 
         0,     0,     3,     5,     7,     8,    11,    14,    21,    27,
        31,    35,    39,    43,    47,    51,    55,    59,    63,    67,
        71,    75,    79,    83,    87,    91,    95,    99,   103,   107,
-      111,   115,   119,   123,   125,   127,   131,   137,   146,   147,
-      150,   155,   161,   165,   169,   171,   173,   177,   180,   185,
 -     111,   115,   119,   121,   125,   131,   140,   141,   144,   149,
 -     155,   159,   163,   165,   167,   171,   174,   179,   183,   185,
 -     187,   191,   195,   198,   202,   205,   207,   212,   216,   220,
 -     225,   229,   230,   232,   236,   240,   244,   248,   250,   256
++     111,   115,   119,   123,   125,   129,   135,   144,   145,   148,
++     153,   159,   163,   167,   169,   171,   175,   178,   183,   187,
 +     189,   191,   195,   199,   202,   206,   209,   211,   216,   220,
 +     224,   229,   233,   234,   236,   240,   244,   248,   252,   254,
 +     260
  };
  
  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
  static const yytype_int8 yyrhs[] =
  {
 -      51,     0,    -1,    53,    -1,    52,    -1,    -1,    55,    52,
 -      -1,    55,    53,    -1,    59,     9,    41,     4,    32,    53,
 -      -1,    11,    53,    12,    53,    57,    -1,    11,    53,     1,
 -      -1,    53,    34,    53,    -1,    53,    17,    53,    -1,    53,
 -      16,    53,    -1,    53,     8,    53,    -1,    53,    23,    53,
 -      -1,    53,    18,    53,    -1,    53,    32,    53,    -1,    53,
 -      33,    53,    -1,    53,    37,    53,    -1,    53,    19,    53,
 -      -1,    53,    38,    53,    -1,    53,    20,    53,    -1,    53,
 -      39,    53,    -1,    53,    21,    53,    -1,    53,    40,    53,
 -      -1,    53,    22,    53,    -1,    53,     6,    53,    -1,    53,
 -       7,    53,    -1,    53,    35,    53,    -1,    53,    36,    53,
 -      -1,    53,    24,    53,    -1,    53,    25,    53,    -1,    59,
 -      -1,    26,    56,    30,    -1,    10,     4,    42,    53,    31,
 -      -1,    10,     4,    43,     4,    44,    42,    53,    31,    -1,
 -      -1,    56,    27,    -1,    56,    28,    53,    29,    -1,    14,
 -      53,    12,    53,    57,    -1,    13,    53,    15,    -1,    58,
 -      32,    58,    -1,    59,    -1,    45,    -1,    59,    45,     4,
 -      -1,    45,     4,    -1,    59,    46,    53,    47,    -1,    59,
 -      46,    47,    -1,     5,    -1,    54,    -1,    43,    53,    44,
 -      -1,    46,    53,    47,    -1,    46,    47,    -1,    48,    60,
 -      49,    -1,    41,     4,    -1,     4,    -1,     4,    43,    53,
 -      44,    -1,    43,     1,    44,    -1,    46,     1,    47,    -1,
 -      59,    46,     1,    47,    -1,    48,     1,    49,    -1,    -1,
 -      61,    -1,    61,    33,    60,    -1,     1,    33,    60,    -1,
 -       4,    42,    58,    -1,    54,    42,    58,    -1,     4,    -1,
 -      43,    53,    44,    42,    58,    -1,    43,     1,    44,    42,
 -      58,    -1
 +      52,     0,    -1,    54,    -1,    53,    -1,    -1,    56,    53,
 +      -1,    56,    54,    -1,    60,     9,    42,     4,    33,    54,
 +      -1,    11,    54,    12,    54,    58,    -1,    11,    54,     1,
 +      -1,    54,    35,    54,    -1,    54,    17,    54,    -1,    54,
 +      16,    54,    -1,    54,     8,    54,    -1,    54,    23,    54,
 +      -1,    54,    18,    54,    -1,    54,    33,    54,    -1,    54,
 +      34,    54,    -1,    54,    38,    54,    -1,    54,    19,    54,
 +      -1,    54,    39,    54,    -1,    54,    20,    54,    -1,    54,
 +      40,    54,    -1,    54,    21,    54,    -1,    54,    41,    54,
 +      -1,    54,    22,    54,    -1,    54,     6,    54,    -1,    54,
 +       7,    54,    -1,    54,    36,    54,    -1,    54,    37,    54,
 +      -1,    54,    24,    54,    -1,    54,    25,    54,    -1,    54,
-       26,    54,    -1,    55,    -1,    60,    -1,    27,    57,    31,
-       -1,    10,     4,    43,    54,    32,    -1,    10,     4,    44,
-        4,    45,    43,    54,    32,    -1,    -1,    57,    28,    -1,
-       57,    29,    54,    30,    -1,    14,    54,    12,    54,    58,
-       -1,    13,    54,    15,    -1,    59,    33,    59,    -1,    60,
-       -1,    46,    -1,    60,    46,     4,    -1,    46,     4,    -1,
-       60,    47,    54,    48,    -1,    60,    47,    48,    -1,     5,
++      26,    54,    -1,    60,    -1,    27,    57,    31,    -1,    10,
++       4,    43,    54,    32,    -1,    10,     4,    44,     4,    45,
++      43,    54,    32,    -1,    -1,    57,    28,    -1,    57,    29,
++      54,    30,    -1,    14,    54,    12,    54,    58,    -1,    13,
++      54,    15,    -1,    59,    33,    59,    -1,    60,    -1,    46,
++      -1,    60,    46,     4,    -1,    46,     4,    -1,    60,    47,
++      54,    48,    -1,    60,    47,    48,    -1,     5,    -1,    55,
 +      -1,    44,    54,    45,    -1,    47,    54,    48,    -1,    47,
 +      48,    -1,    49,    61,    50,    -1,    42,     4,    -1,     4,
 +      -1,     4,    44,    54,    45,    -1,    44,     1,    45,    -1,
 +      47,     1,    48,    -1,    60,    47,     1,    48,    -1,    49,
 +       1,    50,    -1,    -1,    62,    -1,    62,    34,    61,    -1,
 +       1,    34,    61,    -1,     4,    43,    59,    -1,    55,    43,
 +      59,    -1,     4,    -1,    44,    54,    45,    43,    59,    -1,
 +      44,     1,    45,    43,    59,    -1
  };
  
  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
  static const yytype_uint16 yyrline[] =
  {
 -       0,   183,   183,   186,   191,   194,   199,   203,   210,   213,
 -     218,   227,   231,   235,   239,   243,   247,   251,   255,   259,
 -     263,   267,   271,   275,   279,   283,   287,   291,   295,   299,
 -     303,   307,   311,   316,   321,   327,   335,   338,   341,   347,
 -     350,   355,   359,   365,   368,   371,   375,   378,   381,   384,
 -     387,   390,   393,   396,   401,   405,   409,   419,   420,   421,
 -     422,   425,   428,   429,   430,   433,   436,   439,   443,   446
 +       0,   185,   185,   188,   193,   196,   201,   205,   212,   215,
 +     220,   229,   233,   237,   241,   245,   249,   253,   257,   261,
 +     265,   269,   273,   277,   281,   285,   289,   293,   297,   301,
-      305,   309,   313,   317,   321,   326,   331,   337,   345,   348,
-      351,   357,   360,   365,   369,   375,   378,   381,   385,   388,
-      391,   394,   397,   400,   403,   408,   412,   416,   426,   427,
-      428,   429,   432,   435,   436,   437,   440,   443,   446,   450,
-      453
++     305,   309,   313,   317,   322,   327,   333,   341,   344,   347,
++     353,   356,   361,   365,   371,   374,   377,   381,   384,   387,
++     390,   393,   396,   399,   402,   407,   411,   415,   425,   426,
++     427,   428,   431,   434,   435,   436,   439,   442,   445,   449,
++     452
  };
  #endif
  
@@@ -661,14 -656,13 +661,14 @@@ static const yytype_uint16 yytoknum[] 
  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
  static const yytype_uint8 yyr1[] =
  {
 -       0,    50,    51,    51,    52,    52,    53,    53,    53,    53,
 -      53,    53,    53,    53,    53,    53,    53,    53,    53,    53,
 -      53,    53,    53,    53,    53,    53,    53,    53,    53,    53,
 -      53,    53,    53,    54,    55,    55,    56,    56,    56,    57,
 -      57,    58,    58,    59,    59,    59,    59,    59,    59,    59,
 -      59,    59,    59,    59,    59,    59,    59,    59,    59,    59,
 -      59,    60,    60,    60,    60,    61,    61,    61,    61,    61
 +       0,    51,    52,    52,    53,    53,    54,    54,    54,    54,
 +      54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
 +      54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
-       54,    54,    54,    54,    54,    55,    56,    56,    57,    57,
-       57,    58,    58,    59,    59,    60,    60,    60,    60,    60,
++      54,    54,    54,    54,    55,    56,    56,    57,    57,    57,
++      58,    58,    59,    59,    60,    60,    60,    60,    60,    60,
 +      60,    60,    60,    60,    60,    60,    60,    60,    60,    60,
 +      60,    60,    61,    61,    61,    61,    62,    62,    62,    62,
 +      62
  };
  
  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@@ -677,11 -671,10 +677,11 @@@ static const yytype_uint8 yyr2[] 
         0,     2,     1,     1,     0,     2,     2,     6,     5,     3,
         3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
         3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-        3,     3,     3,     1,     1,     3,     5,     8,     0,     2,
-        4,     5,     3,     3,     1,     1,     3,     2,     4,     3,
 -       3,     3,     1,     3,     5,     8,     0,     2,     4,     5,
 -       3,     3,     1,     1,     3,     2,     4,     3,     1,     1,
 -       3,     3,     2,     3,     2,     1,     4,     3,     3,     4,
 -       3,     0,     1,     3,     3,     3,     3,     1,     5,     5
++       3,     3,     3,     1,     3,     5,     8,     0,     2,     4,
++       5,     3,     3,     1,     1,     3,     2,     4,     3,     1,
 +       1,     3,     3,     2,     3,     2,     1,     4,     3,     3,
 +       4,     3,     0,     1,     3,     3,     3,     3,     1,     5,
 +       5
  };
  
  /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
     means the default is an error.  */
  static const yytype_uint8 yydefact[] =
  {
-        4,    56,    50,     0,     0,    38,     0,     0,    45,     0,
-        0,     0,     3,     2,    33,     4,    34,     0,     0,     0,
-        0,     0,    55,     0,     0,    47,     0,    53,     0,     0,
 -       4,    55,    48,     0,     0,    36,     0,     0,    43,     0,
 -       0,     0,     3,     2,    49,     4,    32,     0,     0,     0,
 -       0,     0,    54,     0,     0,    45,     0,    52,     0,     0,
 -      67,     0,     0,     0,    62,     1,     0,     0,     0,     0,
++       4,    56,    49,     0,     0,    37,     0,     0,    44,     0,
++       0,     0,     3,     2,    50,     4,    33,     0,     0,     0,
++       0,     0,    55,     0,     0,    46,     0,    53,     0,     0,
 +      68,     0,     0,     0,    63,     1,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
 -       0,     0,     0,     0,     0,     0,     0,     0,     5,     6,
 -       0,     0,     0,     0,     0,     0,     9,     0,    37,     0,
 -      33,    57,    50,    58,    51,     0,    60,     0,     0,     0,
 -       0,    53,     0,    26,    27,    13,    12,    11,    15,    19,
 -      21,    23,    25,    14,    30,    31,    16,    17,    10,    28,
 -      29,    18,    20,    22,    24,     0,    44,     0,    47,     0,
 -      56,     0,     0,     0,     0,     0,    64,    65,    42,     0,
 -       0,    66,    63,     0,    59,    46,    34,     0,     0,     0,
 -       8,    38,     0,     0,     0,     0,     0,     0,     0,    41,
 -      69,    68,     7,     0,    40,     0,    35,     0,    39
 +       0,     0,     0,     0,     0,     0,     0,     0,     0,     5,
-        6,     0,     0,     0,     0,     0,     0,     9,     0,    39,
-        0,    35,    58,    51,    59,    52,     0,    61,     0,     0,
++       6,     0,     0,     0,     0,     0,     0,     9,     0,    38,
++       0,    34,    58,    51,    59,    52,     0,    61,     0,     0,
 +       0,     0,    54,     0,    26,    27,    13,    12,    11,    15,
 +      19,    21,    23,    25,    14,    30,    31,    32,    16,    17,
-       10,    28,    29,    18,    20,    22,    24,     0,    46,     0,
-       49,     0,    57,     0,     0,     0,     0,     0,    65,    66,
-       44,     0,     0,    67,    64,     0,    60,    48,    36,     0,
-        0,     0,     8,    40,     0,     0,     0,     0,     0,     0,
-        0,    43,    70,    69,     7,     0,    42,     0,    37,     0,
-       41
++      10,    28,    29,    18,    20,    22,    24,     0,    45,     0,
++      48,     0,    57,     0,     0,     0,     0,     0,    65,    66,
++      43,     0,     0,    67,    64,     0,    60,    47,    35,     0,
++       0,     0,     8,    39,     0,     0,     0,     0,     0,     0,
++       0,    42,    70,    69,     7,     0,    41,     0,    36,     0,
++      40
  };
  
  /* YYDEFGOTO[NTERM-NUM].  */
@@@ -716,25 -708,24 +716,25 @@@ static const yytype_int16 yydefgoto[] 
  
  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
     STATE-NUM.  */
 -#define YYPACT_NINF -75
 +#define YYPACT_NINF -76
  static const yytype_int16 yypact[] =
  {
 -     175,   -41,   -75,    10,   175,   -75,    16,   129,    18,    78,
 -      64,    28,   -75,   645,   -75,   175,    52,   175,   -27,   295,
 -     175,   -17,   -75,   -14,   330,   -75,   -18,   -75,   218,   -28,
 -     -10,   152,    -8,   -16,     2,   -75,   175,   175,   175,   175,
 -     175,   175,   175,   175,   175,   175,   175,   175,   175,   175,
 -     175,   175,   175,   175,   175,   175,   175,   175,   -75,   645,
 -      22,    71,   101,   365,   175,    72,   -75,   175,   -75,   175,
 -     -75,   -75,   -75,   -75,   -75,    73,   -75,   161,    34,   400,
 -     161,   -75,    73,   785,   785,   715,   791,   765,   740,   740,
 -     740,   740,   740,   740,   785,   785,   680,   715,   740,   785,
 -     785,   -15,   -15,   -75,   -75,    76,   -75,    37,   -75,   253,
 -     -75,   470,    41,   435,   505,    48,   -75,    54,   -19,    45,
 -      49,    54,   -75,    60,   -75,   -75,   -75,    51,   175,   175,
 -     -75,   -75,   161,   161,   161,   175,   175,   540,   575,   -75,
 -      54,    54,   680,   610,   -75,   175,   -75,   435,   -75
 +     179,   -42,   -76,    10,   179,   -76,    16,   131,    18,    79,
 +      65,    28,   -76,   662,   -76,   179,    53,   179,   -28,   302,
 +     179,   -18,   -76,   -15,   338,   -76,   -19,   -76,   223,   -29,
 +     -11,   155,   -10,    14,     1,   -76,   179,   179,   179,   179,
 +     179,   179,   179,   179,   179,   179,   179,   179,   179,   179,
 +     179,   179,   179,   179,   179,   179,   179,   179,   179,   -76,
 +     662,    -8,    72,   106,   374,   179,    73,   -76,   179,   -76,
-      179,   -76,   -76,   -76,   -76,   -76,    74,   -76,   163,    34,
-      410,   163,   -76,    74,   807,   807,   734,   813,   786,   760,
++     179,   -76,   -76,   -76,   -76,   -76,    74,   -76,   165,    34,
++     410,   165,   -76,    74,   807,   807,   734,   813,   786,   760,
 +     760,   760,   760,   760,   760,   807,   807,   807,   698,   734,
 +     760,   807,   807,   -16,   -16,   -76,   -76,    77,   -76,    37,
 +     -76,   259,   -76,   482,    41,   446,   518,    48,   -76,    54,
 +     -20,    45,    50,    54,   -76,    58,   -76,   -76,   -76,    51,
-      179,   179,   -76,   -76,   163,   163,   163,   179,   179,   554,
++     179,   179,   -76,   -76,   165,   165,   165,   179,   179,   554,
 +     590,   -76,    54,    54,   698,   626,   -76,   179,   -76,   446,
 +     -76
  };
  
  /* YYPGOTO[NTERM-NUM].  */
@@@ -747,95 -738,93 +747,95 @@@ static const yytype_int8 yypgoto[] 
  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
     positive, shift that token.  If negative, reduce the rule which
     number is the opposite.  If YYTABLE_NINF, syntax error.  */
 -#define YYTABLE_NINF -62
 +#define YYTABLE_NINF -63
  static const yytype_int16 yytable[] =
  {
 -      13,    32,    17,   118,    19,    75,   118,    24,    15,    28,
 -      68,    69,   116,    70,    18,    64,    65,    63,   121,   122,
 -      22,    76,    25,    15,    56,    57,    61,    62,    35,    73,
 -      71,    79,    77,    81,    80,    82,    83,    84,    85,    86,
 -      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
 -      97,    98,    99,   100,   101,   102,   103,   104,   118,   118,
 -     118,    60,   109,   105,   111,    29,    32,   113,    30,   114,
 -     139,   140,   141,    32,   115,   106,   112,    30,   119,    26,
 -     123,    75,     1,     2,   124,   127,   132,   133,     3,     4,
 -       5,   134,   135,   136,    58,   148,     0,    61,    62,     5,
 -       0,     0,   107,     0,     5,     1,     2,    31,     0,     0,
 -       0,     3,     4,   -61,     0,     0,    31,     0,     0,     6,
 -       0,     7,   -61,     8,     9,    27,    10,     5,   137,   138,
 -      23,     0,     0,     1,     2,   142,   143,     0,     0,     3,
 -       4,     0,     6,     0,     7,   147,     8,     9,   108,    10,
 -       0,     0,     0,    78,     0,     5,     1,     2,     0,     0,
 -       0,     0,     3,     4,     0,     1,     2,     0,     0,     0,
 -       6,     0,     7,     0,     8,     9,     0,    10,     5,     1,
 -       2,     0,     0,     0,     0,     3,     4,     5,     0,     0,
 -       0,     0,     0,     6,     0,     7,     0,     8,     9,     0,
 -      10,     5,     6,     0,     7,     0,     8,     9,     0,    10,
 -       0,     0,     0,     0,     0,     0,     6,     0,     7,     0,
 -       8,     9,     0,    10,    36,    37,    38,     0,     0,     0,
 +      13,    32,    17,   120,    19,    76,   120,    24,    15,    28,
 +      69,    70,   118,    71,    18,    65,    66,    64,   123,   124,
 +      22,    77,    25,    15,    57,    58,    62,    63,    35,    74,
 +      72,    80,    78,    81,   107,    83,    84,    85,    86,    87,
 +      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
 +      98,    99,   100,   101,   102,   103,   104,   105,   106,   120,
 +     120,   120,    61,   111,    82,   113,    29,    32,   115,    30,
 +     116,   141,   142,   143,    32,   117,   108,   114,    30,   121,
 +      26,   125,    76,     1,     2,   126,   129,   134,   135,     3,
 +       4,   137,     5,   136,   138,    59,   150,     0,     0,    62,
 +      63,     5,     0,     0,     0,     0,     5,   109,     0,    31,
 +       1,     2,     0,     0,     0,   -62,     3,     4,    31,     0,
 +       0,     6,     0,     7,   -62,     8,     9,    27,    10,     0,
 +     139,   140,    23,     5,     0,     1,     2,   144,   145,     0,
 +       0,     3,     4,     0,     0,     0,     0,   149,     6,     0,
 +       7,     0,     8,     9,   110,    10,    79,     0,     5,     1,
-        2,     0,     0,     0,     0,     3,     4,     1,     2,     0,
-        0,     0,     0,     6,     0,     7,     0,     8,     9,     0,
++       2,     0,     0,     0,     0,     3,     4,     0,     0,     1,
++       2,     0,     0,     6,     0,     7,     0,     8,     9,     0,
 +      10,     0,     5,     1,     2,     0,     0,     0,     0,     3,
-        4,     0,     0,     0,     0,     0,     0,     6,     0,     7,
-        0,     8,     9,     0,    10,     6,     5,     7,     0,     8,
-        9,     0,    10,     0,     0,     0,     0,     0,     0,     0,
++       4,     0,     5,     0,     0,     0,     0,     6,     0,     7,
++       0,     8,     9,     0,    10,     0,     5,     6,     0,     7,
++       0,     8,     9,     0,    10,     0,     0,     0,     0,     0,
 +       0,     6,     0,     7,     0,     8,     9,     0,    10,    36,
 +      37,    38,     0,     0,     0,     0,     0,     0,     0,    39,
 +      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
 +       0,     0,     0,     0,     0,     0,    50,    51,    52,    53,
 +      54,    55,    56,    57,    58,    36,    37,    38,     0,     0,
 +       0,    75,     0,     0,     0,    39,    40,    41,    42,    43,
 +      44,    45,    46,    47,    48,    49,     0,     0,     0,     0,
 +       0,     0,    50,    51,    52,    53,    54,    55,    56,    57,
 +      58,     0,     0,    67,     0,     0,     0,   127,    36,    37,
 +      38,     0,     0,     0,    68,     0,     0,     0,    39,    40,
 +      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
 +       0,     0,     0,     0,     0,    50,    51,    52,    53,    54,
 +      55,    56,    57,    58,    36,    37,    38,     0,     0,     0,
         0,     0,     0,     0,    39,    40,    41,    42,    43,    44,
 -      45,    46,    47,    48,     0,     0,     0,     0,     0,     0,
 -      49,    50,    51,    52,    53,    54,    55,    56,    57,    36,
 -      37,    38,     0,     0,     0,    74,     0,     0,     0,    39,
 -      40,    41,    42,    43,    44,    45,    46,    47,    48,     0,
 -       0,     0,     0,     0,     0,    49,    50,    51,    52,    53,
 -      54,    55,    56,    57,     0,     0,    66,     0,     0,     0,
 -     125,    36,    37,    38,     0,     0,     0,    67,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,     0,
 -       0,     0,     0,     0,     0,     0,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 -       0,     0,    49,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,    72,     0,     0,     0,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,   110,
 -       0,     0,     0,     0,     0,     0,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 -       0,     0,    49,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,   120,     0,     0,     0,   128,   129,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,     0,
 -       0,     0,     0,     0,     0,     0,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 -       0,   126,    49,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,     0,     0,     0,     0,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,   131,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,     0,
 -       0,     0,     0,     0,     0,   144,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 -       0,     0,    49,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,     0,     0,     0,   145,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,     0,
 +      45,    46,    47,    48,    49,     0,     0,     0,     0,     0,
 +       0,    50,    51,    52,    53,    54,    55,    56,    57,    58,
 +      36,    37,    38,    73,     0,     0,     0,     0,     0,     0,
 +      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
 +      49,     0,     0,     0,     0,     0,     0,    50,    51,    52,
 +      53,    54,    55,    56,    57,    58,    36,    37,    38,   112,
         0,     0,     0,     0,     0,     0,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 -       0,   146,    49,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,     0,     0,     0,     0,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,     0,    49,    50,    51,
 -      52,    53,    54,    55,    56,    57,    36,    37,    38,     0,
 -       0,     0,     0,     0,     0,     0,    39,    40,    41,    42,
 -      43,    44,    45,    46,    47,    48,     0,     0,     0,     0,
 +      43,    44,    45,    46,    47,    48,    49,     0,     0,     0,
 +       0,     0,     0,    50,    51,    52,    53,    54,    55,    56,
 +      57,    58,    36,    37,    38,   122,     0,     0,     0,   130,
 +     131,     0,    39,    40,    41,    42,    43,    44,    45,    46,
 +      47,    48,    49,     0,     0,     0,     0,     0,     0,    50,
 +      51,    52,    53,    54,    55,    56,    57,    58,    36,    37,
 +      38,     0,     0,     0,     0,     0,     0,     0,    39,    40,
 +      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
 +       0,     0,     0,     0,   128,    50,    51,    52,    53,    54,
 +      55,    56,    57,    58,    36,    37,    38,     0,     0,     0,
 +       0,     0,     0,     0,    39,    40,    41,    42,    43,    44,
 +      45,    46,    47,    48,    49,     0,     0,     0,   133,     0,
 +       0,    50,    51,    52,    53,    54,    55,    56,    57,    58,
 +      36,    37,    38,     0,     0,     0,     0,     0,     0,   146,
 +      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
 +      49,     0,     0,     0,     0,     0,     0,    50,    51,    52,
 +      53,    54,    55,    56,    57,    58,    36,    37,    38,     0,
 +       0,     0,   147,     0,     0,     0,    39,    40,    41,    42,
 +      43,    44,    45,    46,    47,    48,    49,     0,     0,     0,
         0,     0,     0,    50,    51,    52,    53,    54,    55,    56,
 -      57,    36,    37,    38,     0,     0,     0,     0,     0,     0,
 -       0,    39,    40,    41,    42,    43,    44,    45,    46,    47,
 -      48,     0,     0,     0,     0,     0,    36,    37,     0,    51,
 -      52,    53,    54,    55,    56,    57,    39,    40,   -62,   -62,
 -     -62,   -62,   -62,   -62,    47,    48,     0,     0,     0,     0,
 -       0,    36,    37,     0,   -62,    52,    53,    54,    55,    56,
 -      57,    39,     0,     0,     0,     0,     0,     0,     0,    47,
 -      48,   -62,   -62,     0,     0,     0,     0,    36,    37,     0,
 -      52,    53,    54,    55,    56,    57,     0,     0,     0,   -62,
 -     -62,     0,     0,     0,     0,    47,    48,     0,     0,     0,
 -     -62,   -62,    54,    55,    56,    57,    52,    53,    54,    55,
 -      56,    57
 +      57,    58,    36,    37,    38,     0,     0,     0,     0,     0,
 +       0,     0,    39,    40,    41,    42,    43,    44,    45,    46,
 +      47,    48,    49,     0,     0,     0,     0,     0,   148,    50,
 +      51,    52,    53,    54,    55,    56,    57,    58,    36,    37,
 +      38,     0,     0,     0,     0,     0,     0,     0,    39,    40,
 +      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
 +       0,     0,     0,     0,     0,    50,    51,    52,    53,    54,
 +      55,    56,    57,    58,    36,    37,    38,     0,     0,     0,
 +       0,     0,     0,     0,    39,    40,    41,    42,    43,    44,
 +      45,    46,    47,    48,    49,     0,     0,     0,     0,     0,
 +       0,     0,    51,    52,    53,    54,    55,    56,    57,    58,
 +      36,    37,    38,     0,     0,     0,     0,     0,     0,     0,
 +      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
 +      49,     0,     0,     0,     0,     0,    36,    37,     0,    52,
 +      53,    54,    55,    56,    57,    58,    39,    40,   -63,   -63,
 +     -63,   -63,   -63,   -63,    47,    48,    49,     0,     0,     0,
 +       0,     0,    36,    37,     0,   -63,    53,    54,    55,    56,
 +      57,    58,    39,     0,     0,     0,     0,     0,     0,     0,
 +      47,    48,    49,   -63,   -63,     0,     0,     0,     0,    36,
 +      37,     0,    53,    54,    55,    56,    57,    58,     0,     0,
 +       0,   -63,   -63,   -63,     0,     0,     0,    47,    48,    49,
 +       0,     0,     0,   -63,   -63,    55,    56,    57,    58,    53,
 +      54,    55,    56,    57,    58
  };
  
  #define yypact_value_is_default(yystate) \
  
  static const yytype_int16 yycheck[] =
  {
 -       0,    10,    43,    77,     4,    33,    80,     7,     0,     9,
 -      27,    28,    75,    30,     4,    42,    43,    17,    80,    82,
 -       4,    49,     4,    15,    39,    40,    45,    46,     0,    47,
 -      44,    31,    42,    49,    42,    33,    36,    37,    38,    39,
 +       0,    10,    44,    78,     4,    34,    81,     7,     0,     9,
 +      28,    29,    76,    31,     4,    43,    44,    17,    81,    83,
 +       4,    50,     4,    15,    40,    41,    46,    47,     0,    48,
 +      45,    31,    43,    43,    42,    34,    36,    37,    38,    39,
        40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
 -      50,    51,    52,    53,    54,    55,    56,    57,   132,   133,
 -     134,     9,    62,    41,    64,     1,    75,    67,     4,    69,
 -     132,   133,   134,    82,     1,     4,     4,     4,    44,     1,
 -       4,    33,     4,     5,    47,    44,    32,    42,    10,    11,
 -      26,    42,    32,    42,    15,   147,    -1,    45,    46,    26,
 -      -1,    -1,     1,    -1,    26,     4,     5,    43,    -1,    -1,
 -      -1,    10,    11,    49,    -1,    -1,    43,    -1,    -1,    41,
 -      -1,    43,    49,    45,    46,    47,    48,    26,   128,   129,
 -       1,    -1,    -1,     4,     5,   135,   136,    -1,    -1,    10,
 -      11,    -1,    41,    -1,    43,   145,    45,    46,    47,    48,
 -      -1,    -1,    -1,     1,    -1,    26,     4,     5,    -1,    -1,
 -      -1,    -1,    10,    11,    -1,     4,     5,    -1,    -1,    -1,
 -      41,    -1,    43,    -1,    45,    46,    -1,    48,    26,     4,
 -       5,    -1,    -1,    -1,    -1,    10,    11,    26,    -1,    -1,
 -      -1,    -1,    -1,    41,    -1,    43,    -1,    45,    46,    -1,
 -      48,    26,    41,    -1,    43,    -1,    45,    46,    -1,    48,
 -      -1,    -1,    -1,    -1,    -1,    -1,    41,    -1,    43,    -1,
 -      45,    46,    -1,    48,     6,     7,     8,    -1,    -1,    -1,
 +      50,    51,    52,    53,    54,    55,    56,    57,    58,   134,
 +     135,   136,     9,    63,    50,    65,     1,    76,    68,     4,
 +      70,   134,   135,   136,    83,     1,     4,     4,     4,    45,
 +       1,     4,    34,     4,     5,    48,    45,    33,    43,    10,
 +      11,    33,    27,    43,    43,    15,   149,    -1,    -1,    46,
 +      47,    27,    -1,    -1,    -1,    -1,    27,     1,    -1,    44,
 +       4,     5,    -1,    -1,    -1,    50,    10,    11,    44,    -1,
 +      -1,    42,    -1,    44,    50,    46,    47,    48,    49,    -1,
 +     130,   131,     1,    27,    -1,     4,     5,   137,   138,    -1,
 +      -1,    10,    11,    -1,    -1,    -1,    -1,   147,    42,    -1,
 +      44,    -1,    46,    47,    48,    49,     1,    -1,    27,     4,
-        5,    -1,    -1,    -1,    -1,    10,    11,     4,     5,    -1,
-       -1,    -1,    -1,    42,    -1,    44,    -1,    46,    47,    -1,
++       5,    -1,    -1,    -1,    -1,    10,    11,    -1,    -1,     4,
++       5,    -1,    -1,    42,    -1,    44,    -1,    46,    47,    -1,
 +      49,    -1,    27,     4,     5,    -1,    -1,    -1,    -1,    10,
-       11,    -1,    -1,    -1,    -1,    -1,    -1,    42,    -1,    44,
-       -1,    46,    47,    -1,    49,    42,    27,    44,    -1,    46,
-       47,    -1,    49,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
++      11,    -1,    27,    -1,    -1,    -1,    -1,    42,    -1,    44,
++      -1,    46,    47,    -1,    49,    -1,    27,    42,    -1,    44,
++      -1,    46,    47,    -1,    49,    -1,    -1,    -1,    -1,    -1,
 +      -1,    42,    -1,    44,    -1,    46,    47,    -1,    49,     6,
 +       7,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,
 +      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
 +      -1,    -1,    -1,    -1,    -1,    -1,    33,    34,    35,    36,
 +      37,    38,    39,    40,    41,     6,     7,     8,    -1,    -1,
 +      -1,    48,    -1,    -1,    -1,    16,    17,    18,    19,    20,
 +      21,    22,    23,    24,    25,    26,    -1,    -1,    -1,    -1,
 +      -1,    -1,    33,    34,    35,    36,    37,    38,    39,    40,
 +      41,    -1,    -1,     1,    -1,    -1,    -1,    48,     6,     7,
 +       8,    -1,    -1,    -1,    12,    -1,    -1,    -1,    16,    17,
 +      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
 +      -1,    -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,
 +      38,    39,    40,    41,     6,     7,     8,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    16,    17,    18,    19,    20,    21,
 -      22,    23,    24,    25,    -1,    -1,    -1,    -1,    -1,    -1,
 -      32,    33,    34,    35,    36,    37,    38,    39,    40,     6,
 -       7,     8,    -1,    -1,    -1,    47,    -1,    -1,    -1,    16,
 -      17,    18,    19,    20,    21,    22,    23,    24,    25,    -1,
 -      -1,    -1,    -1,    -1,    -1,    32,    33,    34,    35,    36,
 -      37,    38,    39,    40,    -1,    -1,     1,    -1,    -1,    -1,
 -      47,     6,     7,     8,    -1,    -1,    -1,    12,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    -1,
 +      22,    23,    24,    25,    26,    -1,    -1,    -1,    -1,    -1,
 +      -1,    33,    34,    35,    36,    37,    38,    39,    40,    41,
 +       6,     7,     8,    45,    -1,    -1,    -1,    -1,    -1,    -1,
 +      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
 +      26,    -1,    -1,    -1,    -1,    -1,    -1,    33,    34,    35,
 +      36,    37,    38,    39,    40,    41,     6,     7,     8,    45,
        -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    44,    -1,    -1,    -1,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    44,
 -      -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    44,    -1,    -1,    -1,    13,    14,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    -1,
 -      -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,    31,    32,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    29,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    -1,
 -      -1,    -1,    -1,    -1,    -1,    15,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    -1,    -1,    -1,    12,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    -1,
 -      -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,    31,    32,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    34,
 -      35,    36,    37,    38,    39,    40,     6,     7,     8,    -1,
 -      -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 +      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    -1,
        -1,    -1,    -1,    33,    34,    35,    36,    37,    38,    39,
 -      40,     6,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
 -      -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
 -      25,    -1,    -1,    -1,    -1,    -1,     6,     7,    -1,    34,
 -      35,    36,    37,    38,    39,    40,    16,    17,    18,    19,
 -      20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,
 -      -1,     6,     7,    -1,    34,    35,    36,    37,    38,    39,
 -      40,    16,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    24,
 -      25,     6,     7,    -1,    -1,    -1,    -1,     6,     7,    -1,
 -      35,    36,    37,    38,    39,    40,    -1,    -1,    -1,    24,
 -      25,    -1,    -1,    -1,    -1,    24,    25,    -1,    -1,    -1,
 -      35,    36,    37,    38,    39,    40,    35,    36,    37,    38,
 -      39,    40
 +      40,    41,     6,     7,     8,    45,    -1,    -1,    -1,    13,
 +      14,    -1,    16,    17,    18,    19,    20,    21,    22,    23,
 +      24,    25,    26,    -1,    -1,    -1,    -1,    -1,    -1,    33,
 +      34,    35,    36,    37,    38,    39,    40,    41,     6,     7,
 +       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,    17,
 +      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
 +      -1,    -1,    -1,    -1,    32,    33,    34,    35,    36,    37,
 +      38,    39,    40,    41,     6,     7,     8,    -1,    -1,    -1,
 +      -1,    -1,    -1,    -1,    16,    17,    18,    19,    20,    21,
 +      22,    23,    24,    25,    26,    -1,    -1,    -1,    30,    -1,
 +      -1,    33,    34,    35,    36,    37,    38,    39,    40,    41,
 +       6,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,    15,
 +      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
 +      26,    -1,    -1,    -1,    -1,    -1,    -1,    33,    34,    35,
 +      36,    37,    38,    39,    40,    41,     6,     7,     8,    -1,
 +      -1,    -1,    12,    -1,    -1,    -1,    16,    17,    18,    19,
 +      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    -1,
 +      -1,    -1,    -1,    33,    34,    35,    36,    37,    38,    39,
 +      40,    41,     6,     7,     8,    -1,    -1,    -1,    -1,    -1,
 +      -1,    -1,    16,    17,    18,    19,    20,    21,    22,    23,
 +      24,    25,    26,    -1,    -1,    -1,    -1,    -1,    32,    33,
 +      34,    35,    36,    37,    38,    39,    40,    41,     6,     7,
 +       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,    17,
 +      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
 +      -1,    -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,
 +      38,    39,    40,    41,     6,     7,     8,    -1,    -1,    -1,
 +      -1,    -1,    -1,    -1,    16,    17,    18,    19,    20,    21,
 +      22,    23,    24,    25,    26,    -1,    -1,    -1,    -1,    -1,
 +      -1,    -1,    34,    35,    36,    37,    38,    39,    40,    41,
 +       6,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 +      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
 +      26,    -1,    -1,    -1,    -1,    -1,     6,     7,    -1,    35,
 +      36,    37,    38,    39,    40,    41,    16,    17,    18,    19,
 +      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    -1,
 +      -1,    -1,     6,     7,    -1,    35,    36,    37,    38,    39,
 +      40,    41,    16,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
 +      24,    25,    26,     6,     7,    -1,    -1,    -1,    -1,     6,
 +       7,    -1,    36,    37,    38,    39,    40,    41,    -1,    -1,
 +      -1,    24,    25,    26,    -1,    -1,    -1,    24,    25,    26,
 +      -1,    -1,    -1,    36,    37,    38,    39,    40,    41,    36,
 +      37,    38,    39,    40,    41
  };
  
  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@@ -2256,43 -2242,25 +2256,34 @@@ yyreduce
    case 32:
  
  /* Line 1806 of yacc.c  */
 -#line 311 "parser.y"
 +#line 313 "parser.y"
 +    {
 +  (yyval.blk) = gen_binop((yyvsp[(1) - (3)].blk), (yyvsp[(3) - (3)].blk), CONTAINS);
 +}
 +    break;
 +
 +  case 33:
 +
 +/* Line 1806 of yacc.c  */
 +#line 317 "parser.y"
-     {
-   (yyval.blk) = (yyvsp[(1) - (1)].blk);
- }
-     break;
-   case 34:
- /* Line 1806 of yacc.c  */
- #line 321 "parser.y"
      { 
    (yyval.blk) = (yyvsp[(1) - (1)].blk); 
  }
      break;
  
-   case 35:
 -  case 33:
++  case 34:
  
  /* Line 1806 of yacc.c  */
- #line 326 "parser.y"
 -#line 316 "parser.y"
++#line 322 "parser.y"
      {
    (yyval.blk) = (yyvsp[(2) - (3)].blk);
  }
      break;
  
-   case 36:
 -  case 34:
++  case 35:
  
  /* Line 1806 of yacc.c  */
- #line 331 "parser.y"
 -#line 321 "parser.y"
++#line 327 "parser.y"
      {
    block body = block_join((yyvsp[(4) - (5)].blk), gen_op_simple(RET));
    (yyval.blk) = gen_op_block_defn_rec(CLOSURE_CREATE, jv_string_value((yyvsp[(2) - (5)].literal)), body);
  }
      break;
  
-   case 37:
 -  case 35:
++  case 36:
  
  /* Line 1806 of yacc.c  */
- #line 337 "parser.y"
 -#line 327 "parser.y"
++#line 333 "parser.y"
      {
    block body = block_bind(gen_op_block_unbound(CLOSURE_PARAM, jv_string_value((yyvsp[(4) - (8)].literal))), block_join((yyvsp[(7) - (8)].blk), gen_op_simple(RET)), OP_IS_CALL_PSEUDO);
    (yyval.blk) = gen_op_block_defn_rec(CLOSURE_CREATE, jv_string_value((yyvsp[(2) - (8)].literal)), body);
  }
      break;
  
-   case 38:
 -  case 36:
++  case 37:
  
  /* Line 1806 of yacc.c  */
- #line 345 "parser.y"
 -#line 335 "parser.y"
++#line 341 "parser.y"
      {
    (yyval.blk) = gen_op_const(LOADK, jv_string(""));
  }
      break;
  
-   case 39:
 -  case 37:
++  case 38:
  
  /* Line 1806 of yacc.c  */
- #line 348 "parser.y"
 -#line 338 "parser.y"
++#line 344 "parser.y"
      {
    (yyval.blk) = gen_binop((yyvsp[(1) - (2)].blk), gen_op_const(LOADK, (yyvsp[(2) - (2)].literal)), '+');
  }
      break;
  
-   case 40:
 -  case 38:
++  case 39:
  
  /* Line 1806 of yacc.c  */
- #line 351 "parser.y"
 -#line 341 "parser.y"
++#line 347 "parser.y"
      {
    (yyval.blk) = gen_binop((yyvsp[(1) - (4)].blk), gen_format((yyvsp[(3) - (4)].blk)), '+');
  }
      break;
  
-   case 41:
 -  case 39:
++  case 40:
  
  /* Line 1806 of yacc.c  */
- #line 357 "parser.y"
 -#line 347 "parser.y"
++#line 353 "parser.y"
      {
    (yyval.blk) = gen_cond((yyvsp[(2) - (5)].blk), (yyvsp[(4) - (5)].blk), (yyvsp[(5) - (5)].blk));
  }
      break;
  
-   case 42:
 -  case 40:
++  case 41:
  
  /* Line 1806 of yacc.c  */
- #line 360 "parser.y"
 -#line 350 "parser.y"
++#line 356 "parser.y"
      {
    (yyval.blk) = (yyvsp[(2) - (3)].blk);
  }
      break;
  
-   case 43:
 -  case 41:
++  case 42:
  
  /* Line 1806 of yacc.c  */
- #line 365 "parser.y"
 -#line 355 "parser.y"
++#line 361 "parser.y"
      { 
    (yyval.blk) = block_join((yyvsp[(1) - (3)].blk), (yyvsp[(3) - (3)].blk));
  }
      break;
  
-   case 44:
 -  case 42:
++  case 43:
  
  /* Line 1806 of yacc.c  */
- #line 369 "parser.y"
 -#line 359 "parser.y"
++#line 365 "parser.y"
      {
    (yyval.blk) = (yyvsp[(1) - (1)].blk);
  }
      break;
  
-   case 45:
 -  case 43:
++  case 44:
  
  /* Line 1806 of yacc.c  */
- #line 375 "parser.y"
 -#line 365 "parser.y"
++#line 371 "parser.y"
      {
    (yyval.blk) = gen_noop(); 
  }
      break;
  
-   case 46:
 -  case 44:
++  case 45:
  
  /* Line 1806 of yacc.c  */
- #line 378 "parser.y"
 -#line 368 "parser.y"
++#line 374 "parser.y"
      {
    (yyval.blk) = gen_index((yyvsp[(1) - (3)].blk), gen_op_const(LOADK, (yyvsp[(3) - (3)].literal))); 
  }
      break;
  
-   case 47:
 -  case 45:
++  case 46:
  
  /* Line 1806 of yacc.c  */
- #line 381 "parser.y"
 -#line 371 "parser.y"
++#line 377 "parser.y"
      { 
    (yyval.blk) = gen_index(gen_noop(), gen_op_const(LOADK, (yyvsp[(2) - (2)].literal))); 
  }
      break;
  
-   case 48:
 -  case 46:
++  case 47:
  
  /* Line 1806 of yacc.c  */
- #line 385 "parser.y"
 -#line 375 "parser.y"
++#line 381 "parser.y"
      {
    (yyval.blk) = gen_index((yyvsp[(1) - (4)].blk), (yyvsp[(3) - (4)].blk)); 
  }
      break;
  
-   case 49:
 -  case 47:
++  case 48:
  
  /* Line 1806 of yacc.c  */
- #line 388 "parser.y"
 -#line 378 "parser.y"
++#line 384 "parser.y"
      {
    (yyval.blk) = block_join((yyvsp[(1) - (3)].blk), gen_op_simple(EACH)); 
  }
      break;
  
-   case 50:
 -  case 48:
++  case 49:
  
  /* Line 1806 of yacc.c  */
- #line 391 "parser.y"
 -#line 381 "parser.y"
++#line 387 "parser.y"
      {
    (yyval.blk) = gen_op_const(LOADK, (yyvsp[(1) - (1)].literal)); 
  }
      break;
  
 -  case 49:
++  case 50:
+ /* Line 1806 of yacc.c  */
 -#line 384 "parser.y"
++#line 390 "parser.y"
+     {
+   (yyval.blk) = (yyvsp[(1) - (1)].blk);
+ }
+     break;
 -  case 50:
 +  case 51:
  
  /* Line 1806 of yacc.c  */
- #line 394 "parser.y"
 -#line 387 "parser.y"
++#line 393 "parser.y"
      { 
    (yyval.blk) = (yyvsp[(2) - (3)].blk); 
  }
      break;
  
 -  case 51:
 +  case 52:
  
  /* Line 1806 of yacc.c  */
- #line 397 "parser.y"
 -#line 390 "parser.y"
++#line 396 "parser.y"
      { 
    (yyval.blk) = gen_collect((yyvsp[(2) - (3)].blk)); 
  }
      break;
  
 -  case 52:
 +  case 53:
  
  /* Line 1806 of yacc.c  */
- #line 400 "parser.y"
 -#line 393 "parser.y"
++#line 399 "parser.y"
      { 
    (yyval.blk) = gen_op_const(LOADK, jv_array()); 
  }
      break;
  
 -  case 53:
 +  case 54:
  
  /* Line 1806 of yacc.c  */
- #line 403 "parser.y"
 -#line 396 "parser.y"
++#line 402 "parser.y"
      { 
    (yyval.blk) = gen_subexp(gen_op_const(LOADK, jv_object()));
    block_append(&(yyval.blk), (yyvsp[(2) - (3)].blk));
  }
      break;
  
 -  case 54:
 +  case 55:
  
  /* Line 1806 of yacc.c  */
- #line 408 "parser.y"
 -#line 401 "parser.y"
++#line 407 "parser.y"
      {
    (yyval.blk) = gen_location((yyloc), gen_op_var_unbound(LOADV, jv_string_value((yyvsp[(2) - (2)].literal))));
    jv_free((yyvsp[(2) - (2)].literal));
  }
      break;
  
 -  case 55:
 +  case 56:
  
  /* Line 1806 of yacc.c  */
- #line 412 "parser.y"
 -#line 405 "parser.y"
++#line 411 "parser.y"
      {
    (yyval.blk) = gen_location((yyloc), gen_op_call(CALL_1_1, gen_op_block_unbound(CLOSURE_REF, jv_string_value((yyvsp[(1) - (1)].literal)))));
    jv_free((yyvsp[(1) - (1)].literal));
  }
      break;
  
 -  case 56:
 +  case 57:
  
  /* Line 1806 of yacc.c  */
- #line 416 "parser.y"
 -#line 409 "parser.y"
++#line 415 "parser.y"
      {
    (yyval.blk) = gen_op_call(CALL_1_1, 
                     block_join(gen_op_block_unbound(CLOSURE_REF, jv_string_value((yyvsp[(1) - (4)].literal))),
  }
      break;
  
 -  case 57:
 +  case 58:
  
  /* Line 1806 of yacc.c  */
- #line 426 "parser.y"
 -#line 419 "parser.y"
++#line 425 "parser.y"
      { (yyval.blk) = gen_noop(); }
      break;
  
 -  case 58:
 +  case 59:
  
  /* Line 1806 of yacc.c  */
- #line 427 "parser.y"
 -#line 420 "parser.y"
++#line 426 "parser.y"
      { (yyval.blk) = gen_noop(); }
      break;
  
 -  case 59:
 +  case 60:
  
  /* Line 1806 of yacc.c  */
- #line 428 "parser.y"
 -#line 421 "parser.y"
++#line 427 "parser.y"
      { (yyval.blk) = (yyvsp[(1) - (4)].blk); }
      break;
  
 -  case 60:
 +  case 61:
  
  /* Line 1806 of yacc.c  */
- #line 429 "parser.y"
 -#line 422 "parser.y"
++#line 428 "parser.y"
      { (yyval.blk) = gen_noop(); }
      break;
  
 -  case 61:
 +  case 62:
  
  /* Line 1806 of yacc.c  */
- #line 432 "parser.y"
 -#line 425 "parser.y"
++#line 431 "parser.y"
      { 
    (yyval.blk)=gen_noop(); 
  }
      break;
  
 -  case 62:
 +  case 63:
  
  /* Line 1806 of yacc.c  */
- #line 435 "parser.y"
 -#line 428 "parser.y"
++#line 434 "parser.y"
      { (yyval.blk) = (yyvsp[(1) - (1)].blk); }
      break;
  
 -  case 63:
 +  case 64:
  
  /* Line 1806 of yacc.c  */
- #line 436 "parser.y"
 -#line 429 "parser.y"
++#line 435 "parser.y"
      { (yyval.blk)=block_join((yyvsp[(1) - (3)].blk), (yyvsp[(3) - (3)].blk)); }
      break;
  
 -  case 64:
 +  case 65:
  
  /* Line 1806 of yacc.c  */
- #line 437 "parser.y"
 -#line 430 "parser.y"
++#line 436 "parser.y"
      { (yyval.blk) = (yyvsp[(3) - (3)].blk); }
      break;
  
 -  case 65:
 +  case 66:
  
  /* Line 1806 of yacc.c  */
- #line 440 "parser.y"
 -#line 433 "parser.y"
++#line 439 "parser.y"
      { 
    (yyval.blk) = gen_dictpair(gen_op_const(LOADK, (yyvsp[(1) - (3)].literal)), (yyvsp[(3) - (3)].blk));
   }
      break;
  
 -  case 66:
 +  case 67:
  
  /* Line 1806 of yacc.c  */
- #line 443 "parser.y"
 -#line 436 "parser.y"
++#line 442 "parser.y"
      {
    (yyval.blk) = gen_dictpair((yyvsp[(1) - (3)].blk), (yyvsp[(3) - (3)].blk));
    }
      break;
  
 -  case 67:
 +  case 68:
  
  /* Line 1806 of yacc.c  */
- #line 446 "parser.y"
 -#line 439 "parser.y"
++#line 445 "parser.y"
      {
    (yyval.blk) = gen_dictpair(gen_op_const(LOADK, jv_copy((yyvsp[(1) - (1)].literal))),
                      gen_index(gen_noop(), gen_op_const(LOADK, (yyvsp[(1) - (1)].literal))));
    }
      break;
  
 -  case 68:
 +  case 69:
  
  /* Line 1806 of yacc.c  */
- #line 450 "parser.y"
 -#line 443 "parser.y"
++#line 449 "parser.y"
      {
    (yyval.blk) = gen_dictpair((yyvsp[(2) - (5)].blk), (yyvsp[(5) - (5)].blk));
    }
      break;
  
 -  case 69:
 +  case 70:
  
  /* Line 1806 of yacc.c  */
- #line 453 "parser.y"
 -#line 446 "parser.y"
++#line 452 "parser.y"
      { (yyval.blk) = (yyvsp[(5) - (5)].blk); }
      break;
  
@@@ -2846,7 -2823,7 +2846,7 @@@ yyreturn
  
  
  /* Line 2067 of yacc.c  */
- #line 454 "parser.y"
 -#line 447 "parser.y"
++#line 453 "parser.y"
  
  
  int jq_parse(struct locfile* locations, block* answer) {
diff --cc parser.gen.info
index b5718b632a6e13b48003a75b7b72132b54c65e70,4a90d13c322fd45b344c662ad65c152877c5ceca..8f1f5656d85199602c2d08fd5880f887ea9b8991
@@@ -39,91 -39,90 +39,91 @@@ Gramma
     28    | Exp '>' Exp
     29    | Exp "<=" Exp
     30    | Exp ">=" Exp
 -   31    | Term
 -
 -   32 String: QQSTRING_START QQString QQSTRING_END
 -
 -   33 FuncDef: "def" IDENT ':' Exp ';'
 -   34        | "def" IDENT '(' IDENT ')' ':' Exp ';'
 -
 -   35 QQString: /* empty */
 -   36         | QQString QQSTRING_TEXT
 -   37         | QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
 -
 -   38 ElseBody: "elif" Exp "then" Exp ElseBody
 -   39         | "else" Exp "end"
 -
 -   40 ExpD: ExpD '|' ExpD
 -   41     | Term
 -
 -   42 Term: '.'
 -   43     | Term '.' IDENT
 -   44     | '.' IDENT
 -   45     | Term '[' Exp ']'
 -   46     | Term '[' ']'
 -   47     | LITERAL
 -   48     | String
 -   49     | '(' Exp ')'
 -   50     | '[' Exp ']'
 -   51     | '[' ']'
 -   52     | '{' MkDict '}'
 -   53     | '$' IDENT
 -   54     | IDENT
 -   55     | IDENT '(' Exp ')'
 -   56     | '(' error ')'
 -   57     | '[' error ']'
 -   58     | Term '[' error ']'
 -   59     | '{' error '}'
 -
 -   60 MkDict: /* empty */
 -   61       | MkDictPair
 -   62       | MkDictPair ',' MkDict
 -   63       | error ',' MkDict
 -
 -   64 MkDictPair: IDENT ':' ExpD
 -   65           | String ':' ExpD
 -   66           | IDENT
 -   67           | '(' Exp ')' ':' ExpD
 -   68           | '(' error ')' ':' ExpD
 +   31    | Exp "contains" Exp
-    32    | String
-    33    | Term
++   32    | Term
 +
-    34 String: QQSTRING_START QQString QQSTRING_END
++   33 String: QQSTRING_START QQString QQSTRING_END
 +
-    35 FuncDef: "def" IDENT ':' Exp ';'
-    36        | "def" IDENT '(' IDENT ')' ':' Exp ';'
++   34 FuncDef: "def" IDENT ':' Exp ';'
++   35        | "def" IDENT '(' IDENT ')' ':' Exp ';'
 +
-    37 QQString: /* empty */
-    38         | QQString QQSTRING_TEXT
-    39         | QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
++   36 QQString: /* empty */
++   37         | QQString QQSTRING_TEXT
++   38         | QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
 +
-    40 ElseBody: "elif" Exp "then" Exp ElseBody
-    41         | "else" Exp "end"
++   39 ElseBody: "elif" Exp "then" Exp ElseBody
++   40         | "else" Exp "end"
 +
-    42 ExpD: ExpD '|' ExpD
-    43     | Term
++   41 ExpD: ExpD '|' ExpD
++   42     | Term
 +
-    44 Term: '.'
-    45     | Term '.' IDENT
-    46     | '.' IDENT
-    47     | Term '[' Exp ']'
-    48     | Term '[' ']'
-    49     | LITERAL
++   43 Term: '.'
++   44     | Term '.' IDENT
++   45     | '.' IDENT
++   46     | Term '[' Exp ']'
++   47     | Term '[' ']'
++   48     | LITERAL
++   49     | String
 +   50     | '(' Exp ')'
 +   51     | '[' Exp ']'
 +   52     | '[' ']'
 +   53     | '{' MkDict '}'
 +   54     | '$' IDENT
 +   55     | IDENT
 +   56     | IDENT '(' Exp ')'
 +   57     | '(' error ')'
 +   58     | '[' error ']'
 +   59     | Term '[' error ']'
 +   60     | '{' error '}'
 +
 +   61 MkDict: /* empty */
 +   62       | MkDictPair
 +   63       | MkDictPair ',' MkDict
 +   64       | error ',' MkDict
 +
 +   65 MkDictPair: IDENT ':' ExpD
 +   66           | String ':' ExpD
 +   67           | IDENT
 +   68           | '(' Exp ')' ':' ExpD
 +   69           | '(' error ')' ':' ExpD
  
  
  Terminals, with rules where they appear
  
  $end (0) 0
 -'$' (36) 6 53
 -'(' (40) 34 49 55 56 67 68
 -')' (41) 34 49 55 56 67 68
 +'$' (36) 6 54
- '(' (40) 36 50 56 57 68 69
- ')' (41) 36 50 56 57 68 69
++'(' (40) 35 50 56 57 68 69
++')' (41) 35 50 56 57 68 69
  '*' (42) 21
  '+' (43) 17
 -',' (44) 16 62 63
 +',' (44) 16 63 64
  '-' (45) 19
- '.' (46) 44 45 46
 -'.' (46) 42 43 44
++'.' (46) 43 44 45
  '/' (47) 23
- ':' (58) 35 36 65 66 68 69
- ';' (59) 35 36
 -':' (58) 33 34 64 65 67 68
 -';' (59) 33 34
++':' (58) 34 35 65 66 68 69
++';' (59) 34 35
  '<' (60) 27
  '=' (61) 9
  '>' (62) 28
- '[' (91) 47 48 51 52 58 59
- ']' (93) 47 48 51 52 58 59
 -'[' (91) 45 46 50 51 57 58
 -']' (93) 45 46 50 51 57 58
 -'{' (123) 52 59
 -'|' (124) 6 15 40
 -'}' (125) 52 59
 -error (256) 8 56 57 58 59 63 68
++'[' (91) 46 47 51 52 58 59
++']' (93) 46 47 51 52 58 59
 +'{' (123) 53 60
- '|' (124) 6 15 42
++'|' (124) 6 15 41
 +'}' (125) 53 60
 +error (256) 8 57 58 59 60 64 69
  INVALID_CHARACTER (258)
- IDENT (259) 6 35 36 45 46 54 55 56 65 67
- LITERAL (260) 49
 -IDENT (259) 6 33 34 43 44 53 54 55 64 66
 -LITERAL (260) 47
++IDENT (259) 6 34 35 44 45 54 55 56 65 67
++LITERAL (260) 48
  "==" (261) 25
  "!=" (262) 26
  "//" (263) 12
  "as" (264) 6
- "def" (265) 35 36
 -"def" (265) 33 34
++"def" (265) 34 35
  "if" (266) 7 8
- "then" (267) 7 40
- "else" (268) 41
- "elif" (269) 40
- "end" (270) 41
 -"then" (267) 7 38
 -"else" (268) 39
 -"elif" (269) 38
 -"end" (270) 39
++"then" (267) 7 39
++"else" (268) 40
++"elif" (269) 39
++"end" (270) 40
  "and" (271) 11
  "or" (272) 10
  "|=" (273) 14
  "//=" (278) 13
  "<=" (279) 29
  ">=" (280) 30
 -QQSTRING_START (281) 32
 -QQSTRING_TEXT (282) 36
 -QQSTRING_INTERP_START (283) 37
 -QQSTRING_INTERP_END (284) 37
 -QQSTRING_END (285) 32
 +"contains" (281) 31
- QQSTRING_START (282) 34
- QQSTRING_TEXT (283) 38
- QQSTRING_INTERP_START (284) 39
- QQSTRING_INTERP_END (285) 39
- QQSTRING_END (286) 34
++QQSTRING_START (282) 33
++QQSTRING_TEXT (283) 37
++QQSTRING_INTERP_START (284) 38
++QQSTRING_INTERP_END (285) 38
++QQSTRING_END (286) 33
  
  
  Nonterminals, with rules where they appear
  
 -$accept (50)
 +$accept (51)
      on left: 0
 -TopLevel (51)
 +TopLevel (52)
      on left: 1 2, on right: 0
 -FuncDefs (52)
 +FuncDefs (53)
      on left: 3 4, on right: 2 4
 -Exp (53)
 +Exp (54)
      on left: 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, on right: 1 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 35 36 39 40
-     41 47 50 51 56 68
 -    25 26 27 28 29 30 31, on right: 1 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 33 34 37 38 39 45 49
 -    50 55 67
 -String (54)
 -    on left: 32, on right: 48 65
 -FuncDef (55)
 -    on left: 33 34, on right: 4 5
 -QQString (56)
 -    on left: 35 36 37, on right: 32 36 37
 -ElseBody (57)
 -    on left: 38 39, on right: 7 38
 -ExpD (58)
 -    on left: 40 41, on right: 40 64 65 67 68
 -Term (59)
 -    on left: 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59,
 -    on right: 6 31 41 43 45 46 58
 -MkDict (60)
 -    on left: 60 61 62 63, on right: 52 62 63
 -MkDictPair (61)
 -    on left: 64 65 66 67 68, on right: 61 62
++    25 26 27 28 29 30 31 32, on right: 1 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 34 35 38 39 40
++    46 50 51 56 68
 +String (55)
-     on left: 34, on right: 32 66
++    on left: 33, on right: 49 66
 +FuncDef (56)
-     on left: 35 36, on right: 4 5
++    on left: 34 35, on right: 4 5
 +QQString (57)
-     on left: 37 38 39, on right: 34 38 39
++    on left: 36 37 38, on right: 33 37 38
 +ElseBody (58)
-     on left: 40 41, on right: 7 40
++    on left: 39 40, on right: 7 39
 +ExpD (59)
-     on left: 42 43, on right: 42 65 66 68 69
++    on left: 41 42, on right: 41 65 66 68 69
 +Term (60)
-     on left: 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60, on right:
-     6 33 43 45 47 48 59
++    on left: 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60,
++    on right: 6 32 42 44 46 47 59
 +MkDict (61)
 +    on left: 61 62 63 64, on right: 53 63 64
 +MkDictPair (62)
 +    on left: 65 66 67 68 69, on right: 62 63
  
  
  state 0
@@@ -211,15 -209,15 +211,15 @@@ state 
  
  state 2
  
-    49 Term: LITERAL .
 -   47 Term: LITERAL .
++   48 Term: LITERAL .
  
-     $default  reduce using rule 49 (Term)
 -    $default  reduce using rule 47 (Term)
++    $default  reduce using rule 48 (Term)
  
  
  state 3
  
-    35 FuncDef: "def" . IDENT ':' Exp ';'
-    36        | "def" . IDENT '(' IDENT ')' ':' Exp ';'
 -   33 FuncDef: "def" . IDENT ':' Exp ';'
 -   34        | "def" . IDENT '(' IDENT ')' ':' Exp ';'
++   34 FuncDef: "def" . IDENT ':' Exp ';'
++   35        | "def" . IDENT '(' IDENT ')' ':' Exp ';'
  
      IDENT  shift, and go to state 18
  
@@@ -248,9 -246,9 +248,9 @@@ state 
  
  state 5
  
-    34 String: QQSTRING_START . QQString QQSTRING_END
 -   32 String: QQSTRING_START . QQString QQSTRING_END
++   33 String: QQSTRING_START . QQString QQSTRING_END
  
-     $default  reduce using rule 37 (QQString)
 -    $default  reduce using rule 35 (QQString)
++    $default  reduce using rule 36 (QQString)
  
      QQString  go to state 21
  
@@@ -287,12 -285,12 +287,12 @@@ state 
  
  state 8
  
-    44 Term: '.' .
-    46     | '.' . IDENT
 -   42 Term: '.' .
 -   44     | '.' . IDENT
++   43 Term: '.' .
++   45     | '.' . IDENT
  
      IDENT  shift, and go to state 25
  
-     $default  reduce using rule 44 (Term)
 -    $default  reduce using rule 42 (Term)
++    $default  reduce using rule 43 (Term)
  
  
  state 9
@@@ -407,9 -403,9 +407,9 @@@ state 1
  
  state 14
  
-    32 Exp: String .
 -   48 Term: String .
++   49 Term: String .
  
-     $default  reduce using rule 32 (Exp)
 -    $default  reduce using rule 48 (Term)
++    $default  reduce using rule 49 (Term)
  
  
  state 15
  state 16
  
      6 Exp: Term . "as" '$' IDENT '|' Exp
-    33    | Term .
-    45 Term: Term . '.' IDENT
-    47     | Term . '[' Exp ']'
-    48     | Term . '[' ']'
 -   31    | Term .
 -   43 Term: Term . '.' IDENT
 -   45     | Term . '[' Exp ']'
 -   46     | Term . '[' ']'
 -   58     | Term . '[' error ']'
++   32    | Term .
++   44 Term: Term . '.' IDENT
++   46     | Term . '[' Exp ']'
++   47     | Term . '[' ']'
 +   59     | Term . '[' error ']'
  
 -    "as"  shift, and go to state 60
 -    '.'   shift, and go to state 61
 -    '['   shift, and go to state 62
 +    "as"  shift, and go to state 61
 +    '.'   shift, and go to state 62
 +    '['   shift, and go to state 63
  
-     $default  reduce using rule 33 (Exp)
 -    $default  reduce using rule 31 (Exp)
++    $default  reduce using rule 32 (Exp)
  
  
  state 17
  
  state 18
  
-    35 FuncDef: "def" IDENT . ':' Exp ';'
-    36        | "def" IDENT . '(' IDENT ')' ':' Exp ';'
 -   33 FuncDef: "def" IDENT . ':' Exp ';'
 -   34        | "def" IDENT . '(' IDENT ')' ':' Exp ';'
++   34 FuncDef: "def" IDENT . ':' Exp ';'
++   35        | "def" IDENT . '(' IDENT ')' ':' Exp ';'
  
 -    ':'  shift, and go to state 64
 -    '('  shift, and go to state 65
 +    ':'  shift, and go to state 65
 +    '('  shift, and go to state 66
  
  
  state 19
@@@ -561,13 -555,13 +561,13 @@@ state 2
  
  state 21
  
-    34 String: QQSTRING_START QQString . QQSTRING_END
-    38 QQString: QQString . QQSTRING_TEXT
-    39         | QQString . QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
 -   32 String: QQSTRING_START QQString . QQSTRING_END
 -   36 QQString: QQString . QQSTRING_TEXT
 -   37         | QQString . QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
++   33 String: QQSTRING_START QQString . QQSTRING_END
++   37 QQString: QQString . QQSTRING_TEXT
++   38         | QQString . QQSTRING_INTERP_START Exp QQSTRING_INTERP_END
  
 -    QQSTRING_TEXT          shift, and go to state 68
 -    QQSTRING_INTERP_START  shift, and go to state 69
 -    QQSTRING_END           shift, and go to state 70
 +    QQSTRING_TEXT          shift, and go to state 69
 +    QQSTRING_INTERP_START  shift, and go to state 70
 +    QQSTRING_END           shift, and go to state 71
  
  
  state 22
@@@ -639,9 -631,9 +639,9 @@@ state 2
  
  state 25
  
-    46 Term: '.' IDENT .
 -   44 Term: '.' IDENT .
++   45 Term: '.' IDENT .
  
-     $default  reduce using rule 46 (Term)
 -    $default  reduce using rule 44 (Term)
++    $default  reduce using rule 45 (Term)
  
  
  state 26
@@@ -1332,23 -1299,23 +1332,23 @@@ state 6
  
      6 Exp: Term "as" . '$' IDENT '|' Exp
  
 -    '$'  shift, and go to state 105
 +    '$'  shift, and go to state 107
  
  
 -state 61
 +state 62
  
-    45 Term: Term '.' . IDENT
 -   43 Term: Term '.' . IDENT
++   44 Term: Term '.' . IDENT
  
 -    IDENT  shift, and go to state 106
 +    IDENT  shift, and go to state 108
  
  
 -state 62
 +state 63
  
-    47 Term: Term '[' . Exp ']'
-    48     | Term '[' . ']'
 -   45 Term: Term '[' . Exp ']'
 -   46     | Term '[' . ']'
 -   58     | Term '[' . error ']'
++   46 Term: Term '[' . Exp ']'
++   47     | Term '[' . ']'
 +   59     | Term '[' . error ']'
  
 -    error           shift, and go to state 107
 +    error           shift, and go to state 109
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
      "def"           shift, and go to state 3
@@@ -1391,38 -1358,36 +1391,38 @@@ state 6
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   55 Term: IDENT '(' Exp . ')'
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 -    ')'    shift, and go to state 110
 +   31    | Exp . "contains" Exp
 +   56 Term: IDENT '(' Exp . ')'
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
 +    ')'         shift, and go to state 112
  
  
 -state 64
 +state 65
  
-    35 FuncDef: "def" IDENT ':' . Exp ';'
 -   33 FuncDef: "def" IDENT ':' . Exp ';'
++   34 FuncDef: "def" IDENT ':' . Exp ';'
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
      Term     go to state 16
  
  
 -state 65
 +state 66
  
-    36 FuncDef: "def" IDENT '(' . IDENT ')' ':' Exp ';'
 -   34 FuncDef: "def" IDENT '(' . IDENT ')' ':' Exp ';'
++   35 FuncDef: "def" IDENT '(' . IDENT ')' ':' Exp ';'
  
 -    IDENT  shift, and go to state 112
 +    IDENT  shift, and go to state 114
  
  
 -state 66
 +state 67
  
      8 Exp: "if" Exp error .
  
@@@ -1476,16 -1441,16 +1476,16 @@@ state 6
      Term     go to state 16
  
  
 -state 68
 +state 69
  
-    38 QQString: QQString QQSTRING_TEXT .
 -   36 QQString: QQString QQSTRING_TEXT .
++   37 QQString: QQString QQSTRING_TEXT .
  
-     $default  reduce using rule 38 (QQString)
 -    $default  reduce using rule 36 (QQString)
++    $default  reduce using rule 37 (QQString)
  
  
 -state 69
 +state 70
  
-    39 QQString: QQString QQSTRING_INTERP_START . Exp QQSTRING_INTERP_END
 -   37 QQString: QQString QQSTRING_INTERP_START . Exp QQSTRING_INTERP_END
++   38 QQString: QQString QQSTRING_INTERP_START . Exp QQSTRING_INTERP_END
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
      Term     go to state 16
  
  
 -state 70
 -
 -   32 String: QQSTRING_START QQString QQSTRING_END .
 -
 -    $default  reduce using rule 32 (String)
 -
 -
  state 71
  
-    34 String: QQSTRING_START QQString QQSTRING_END .
 -   56 Term: '(' error ')' .
++   33 String: QQSTRING_START QQString QQSTRING_END .
  
-     $default  reduce using rule 34 (String)
 -    $default  reduce using rule 56 (Term)
++    $default  reduce using rule 33 (String)
  
  
  state 72
@@@ -1555,37 -1520,39 +1555,39 @@@ state 7
      MkDictPair  go to state 34
  
  
 -state 76
 +state 77
  
 -   59 Term: '{' error '}' .
 +   60 Term: '{' error '}' .
  
 -    $default  reduce using rule 59 (Term)
 +    $default  reduce using rule 60 (Term)
  
  
 -state 77
 +state 78
  
 -   64 MkDictPair: IDENT ':' . ExpD
 +   65 MkDictPair: IDENT ':' . ExpD
  
-     IDENT    shift, and go to state 1
-     LITERAL  shift, and go to state 2
-     '$'      shift, and go to state 6
-     '('      shift, and go to state 7
-     '.'      shift, and go to state 8
-     '['      shift, and go to state 9
-     '{'      shift, and go to state 10
+     IDENT           shift, and go to state 1
+     LITERAL         shift, and go to state 2
+     QQSTRING_START  shift, and go to state 5
+     '$'             shift, and go to state 6
+     '('             shift, and go to state 7
+     '.'             shift, and go to state 8
+     '['             shift, and go to state 9
+     '{'             shift, and go to state 10
  
-     ExpD  go to state 119
-     Term  go to state 120
+     String  go to state 14
 -    ExpD    go to state 117
 -    Term    go to state 118
++    ExpD    go to state 119
++    Term    go to state 120
  
  
 -state 78
 +state 79
  
 -   68 MkDictPair: '(' error . ')' ':' ExpD
 +   69 MkDictPair: '(' error . ')' ':' ExpD
  
 -    ')'  shift, and go to state 119
 +    ')'  shift, and go to state 121
  
  
 -state 79
 +state 80
  
      9 Exp: Exp . '=' Exp
     10    | Exp . "or" Exp
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   67 MkDictPair: '(' Exp . ')' ':' ExpD
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 -    ')'    shift, and go to state 120
 +   31    | Exp . "contains" Exp
 +   68 MkDictPair: '(' Exp . ')' ':' ExpD
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
 +    ')'         shift, and go to state 122
  
  
 -state 80
 +state 81
  
 -   65 MkDictPair: String ':' . ExpD
 +   66 MkDictPair: String ':' . ExpD
  
-     IDENT    shift, and go to state 1
-     LITERAL  shift, and go to state 2
-     '$'      shift, and go to state 6
-     '('      shift, and go to state 7
-     '.'      shift, and go to state 8
-     '['      shift, and go to state 9
-     '{'      shift, and go to state 10
+     IDENT           shift, and go to state 1
+     LITERAL         shift, and go to state 2
+     QQSTRING_START  shift, and go to state 5
+     '$'             shift, and go to state 6
+     '('             shift, and go to state 7
+     '.'             shift, and go to state 8
+     '['             shift, and go to state 9
+     '{'             shift, and go to state 10
  
-     ExpD  go to state 123
-     Term  go to state 120
+     String  go to state 14
 -    ExpD    go to state 121
 -    Term    go to state 118
++    ExpD    go to state 123
++    Term    go to state 120
  
  
 -state 81
 +state 82
  
 -   52 Term: '{' MkDict '}' .
 +   53 Term: '{' MkDict '}' .
  
 -    $default  reduce using rule 52 (Term)
 +    $default  reduce using rule 53 (Term)
  
  
 -state 82
 +state 83
  
 -   62 MkDict: MkDictPair ',' . MkDict
 +   63 MkDict: MkDictPair ',' . MkDict
  
 -    error           shift, and go to state 115
 +    error           shift, and go to state 117
      IDENT           shift, and go to state 30
      QQSTRING_START  shift, and go to state 5
      '('             shift, and go to state 31
@@@ -2714,31 -2598,31 +2718,31 @@@ state 10
  
      6 Exp: Term "as" '$' . IDENT '|' Exp
  
 -    IDENT  shift, and go to state 123
 +    IDENT  shift, and go to state 125
  
  
 -state 106
 +state 108
  
-    45 Term: Term '.' IDENT .
 -   43 Term: Term '.' IDENT .
++   44 Term: Term '.' IDENT .
  
-     $default  reduce using rule 45 (Term)
 -    $default  reduce using rule 43 (Term)
++    $default  reduce using rule 44 (Term)
  
  
 -state 107
 +state 109
  
 -   58 Term: Term '[' error . ']'
 +   59 Term: Term '[' error . ']'
  
 -    ']'  shift, and go to state 124
 +    ']'  shift, and go to state 126
  
  
 -state 108
 +state 110
  
-    48 Term: Term '[' ']' .
 -   46 Term: Term '[' ']' .
++   47 Term: Term '[' ']' .
  
-     $default  reduce using rule 48 (Term)
 -    $default  reduce using rule 46 (Term)
++    $default  reduce using rule 47 (Term)
  
  
 -state 109
 +state 111
  
      9 Exp: Exp . '=' Exp
     10    | Exp . "or" Exp
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   45 Term: Term '[' Exp . ']'
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 -    ']'    shift, and go to state 125
 +   31    | Exp . "contains" Exp
-    47 Term: Term '[' Exp . ']'
++   46 Term: Term '[' Exp . ']'
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
 +    ']'         shift, and go to state 127
  
  
 -state 110
 +state 112
  
 -   55 Term: IDENT '(' Exp ')' .
 +   56 Term: IDENT '(' Exp ')' .
  
 -    $default  reduce using rule 55 (Term)
 +    $default  reduce using rule 56 (Term)
  
  
 -state 111
 +state 113
  
      9 Exp: Exp . '=' Exp
     10    | Exp . "or" Exp
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   33 FuncDef: "def" IDENT ':' Exp . ';'
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    ';'    shift, and go to state 126
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 +   31    | Exp . "contains" Exp
-    35 FuncDef: "def" IDENT ':' Exp . ';'
++   34 FuncDef: "def" IDENT ':' Exp . ';'
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    ';'         shift, and go to state 128
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
  
  
 -state 112
 +state 114
  
-    36 FuncDef: "def" IDENT '(' IDENT . ')' ':' Exp ';'
 -   34 FuncDef: "def" IDENT '(' IDENT . ')' ':' Exp ';'
++   35 FuncDef: "def" IDENT '(' IDENT . ')' ':' Exp ';'
  
 -    ')'  shift, and go to state 127
 +    ')'  shift, and go to state 129
  
  
 -state 113
 +state 115
  
      7 Exp: "if" Exp "then" Exp . ElseBody
      9    | Exp . '=' Exp
@@@ -2938,8 -2816,7 +2942,8 @@@ state 11
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   37 QQString: QQString QQSTRING_INTERP_START Exp . QQSTRING_INTERP_END
 +   31    | Exp . "contains" Exp
-    39 QQString: QQString QQSTRING_INTERP_START Exp . QQSTRING_INTERP_END
++   38 QQString: QQString QQSTRING_INTERP_START Exp . QQSTRING_INTERP_END
  
      "=="                 shift, and go to state 36
      "!="                 shift, and go to state 37
@@@ -2983,33 -2883,26 +2987,33 @@@ state 11
  
  state 119
  
-    42 ExpD: ExpD . '|' ExpD
 -   68 MkDictPair: '(' error ')' . ':' ExpD
++   41 ExpD: ExpD . '|' ExpD
 +   65 MkDictPair: IDENT ':' ExpD .
  
 -    ':'  shift, and go to state 133
 +    '|'  shift, and go to state 134
 +
 +    $default  reduce using rule 65 (MkDictPair)
  
  
  state 120
  
-    43 ExpD: Term .
-    45 Term: Term . '.' IDENT
-    47     | Term . '[' Exp ']'
-    48     | Term . '[' ']'
 -   67 MkDictPair: '(' Exp ')' . ':' ExpD
++   42 ExpD: Term .
++   44 Term: Term . '.' IDENT
++   46     | Term . '[' Exp ']'
++   47     | Term . '[' ']'
 +   59     | Term . '[' error ']'
  
 -    ':'  shift, and go to state 134
 +    '.'  shift, and go to state 62
 +    '['  shift, and go to state 63
  
-     $default  reduce using rule 43 (ExpD)
++    $default  reduce using rule 42 (ExpD)
  
 -state 121
  
 -   40 ExpD: ExpD . '|' ExpD
 -   65 MkDictPair: String ':' ExpD .
 +state 121
  
 -    '|'  shift, and go to state 132
 +   69 MkDictPair: '(' error ')' . ':' ExpD
  
 -    $default  reduce using rule 65 (MkDictPair)
 +    ':'  shift, and go to state 135
  
  
  state 122
  
  state 123
  
-    42 ExpD: ExpD . '|' ExpD
 -    6 Exp: Term "as" '$' IDENT . '|' Exp
++   41 ExpD: ExpD . '|' ExpD
 +   66 MkDictPair: String ':' ExpD .
  
 -    '|'  shift, and go to state 135
 +    '|'  shift, and go to state 134
 +
 +    $default  reduce using rule 66 (MkDictPair)
  
  
  state 124
@@@ -3052,28 -2942,14 +3056,28 @@@ state 12
  
  state 127
  
-    47 Term: Term '[' Exp ']' .
 -   34 FuncDef: "def" IDENT '(' IDENT ')' . ':' Exp ';'
++   46 Term: Term '[' Exp ']' .
  
-     $default  reduce using rule 47 (Term)
 -    ':'  shift, and go to state 136
++    $default  reduce using rule 46 (Term)
  
  
  state 128
  
-    35 FuncDef: "def" IDENT ':' Exp ';' .
 -   39 ElseBody: "else" . Exp "end"
++   34 FuncDef: "def" IDENT ':' Exp ';' .
 +
-     $default  reduce using rule 35 (FuncDef)
++    $default  reduce using rule 34 (FuncDef)
 +
 +
 +state 129
 +
-    36 FuncDef: "def" IDENT '(' IDENT ')' . ':' Exp ';'
++   35 FuncDef: "def" IDENT '(' IDENT ')' . ':' Exp ';'
 +
 +    ':'  shift, and go to state 138
 +
 +
 +state 130
 +
-    41 ElseBody: "else" . Exp "end"
++   40 ElseBody: "else" . Exp "end"
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
      Term     go to state 16
  
  
 -state 129
 +state 131
  
-    40 ElseBody: "elif" . Exp "then" Exp ElseBody
 -   38 ElseBody: "elif" . Exp "then" Exp ElseBody
++   39 ElseBody: "elif" . Exp "then" Exp ElseBody
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
@@@ -3120,62 -2996,68 +3124,68 @@@ state 13
      $default  reduce using rule 7 (Exp)
  
  
 -state 131
 +state 133
  
-    39 QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END .
 -   37 QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END .
++   38 QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END .
  
-     $default  reduce using rule 39 (QQString)
 -    $default  reduce using rule 37 (QQString)
++    $default  reduce using rule 38 (QQString)
  
  
 -state 132
 +state 134
  
-    42 ExpD: ExpD '|' . ExpD
 -   40 ExpD: ExpD '|' . ExpD
++   41 ExpD: ExpD '|' . ExpD
  
-     IDENT    shift, and go to state 1
-     LITERAL  shift, and go to state 2
-     '$'      shift, and go to state 6
-     '('      shift, and go to state 7
-     '.'      shift, and go to state 8
-     '['      shift, and go to state 9
-     '{'      shift, and go to state 10
+     IDENT           shift, and go to state 1
+     LITERAL         shift, and go to state 2
+     QQSTRING_START  shift, and go to state 5
+     '$'             shift, and go to state 6
+     '('             shift, and go to state 7
+     '.'             shift, and go to state 8
+     '['             shift, and go to state 9
+     '{'             shift, and go to state 10
  
-     ExpD  go to state 141
-     Term  go to state 120
+     String  go to state 14
 -    ExpD    go to state 139
 -    Term    go to state 118
++    ExpD    go to state 141
++    Term    go to state 120
  
  
 -state 133
 +state 135
  
 -   68 MkDictPair: '(' error ')' ':' . ExpD
 +   69 MkDictPair: '(' error ')' ':' . ExpD
  
-     IDENT    shift, and go to state 1
-     LITERAL  shift, and go to state 2
-     '$'      shift, and go to state 6
-     '('      shift, and go to state 7
-     '.'      shift, and go to state 8
-     '['      shift, and go to state 9
-     '{'      shift, and go to state 10
+     IDENT           shift, and go to state 1
+     LITERAL         shift, and go to state 2
+     QQSTRING_START  shift, and go to state 5
+     '$'             shift, and go to state 6
+     '('             shift, and go to state 7
+     '.'             shift, and go to state 8
+     '['             shift, and go to state 9
+     '{'             shift, and go to state 10
  
-     ExpD  go to state 142
-     Term  go to state 120
+     String  go to state 14
 -    ExpD    go to state 140
 -    Term    go to state 118
++    ExpD    go to state 142
++    Term    go to state 120
  
  
 -state 134
 +state 136
  
 -   67 MkDictPair: '(' Exp ')' ':' . ExpD
 +   68 MkDictPair: '(' Exp ')' ':' . ExpD
  
-     IDENT    shift, and go to state 1
-     LITERAL  shift, and go to state 2
-     '$'      shift, and go to state 6
-     '('      shift, and go to state 7
-     '.'      shift, and go to state 8
-     '['      shift, and go to state 9
-     '{'      shift, and go to state 10
+     IDENT           shift, and go to state 1
+     LITERAL         shift, and go to state 2
+     QQSTRING_START  shift, and go to state 5
+     '$'             shift, and go to state 6
+     '('             shift, and go to state 7
+     '.'             shift, and go to state 8
+     '['             shift, and go to state 9
+     '{'             shift, and go to state 10
  
-     ExpD  go to state 143
-     Term  go to state 120
+     String  go to state 14
 -    ExpD    go to state 141
 -    Term    go to state 118
++    ExpD    go to state 143
++    Term    go to state 120
  
  
 -state 135
 +state 137
  
      6 Exp: Term "as" '$' IDENT '|' . Exp
  
      Term     go to state 16
  
  
 -state 136
 +state 138
  
-    36 FuncDef: "def" IDENT '(' IDENT ')' ':' . Exp ';'
 -   34 FuncDef: "def" IDENT '(' IDENT ')' ':' . Exp ';'
++   35 FuncDef: "def" IDENT '(' IDENT ')' ':' . Exp ';'
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
@@@ -3241,36 -3123,34 +3251,36 @@@ state 13
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   39 ElseBody: "else" Exp . "end"
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "end"  shift, and go to state 144
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 +   31    | Exp . "contains" Exp
-    41 ElseBody: "else" Exp . "end"
++   40 ElseBody: "else" Exp . "end"
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "end"       shift, and go to state 146
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
  
  
 -state 138
 +state 140
  
      9 Exp: Exp . '=' Exp
     10    | Exp . "or" Exp
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   38 ElseBody: "elif" Exp . "then" Exp ElseBody
 -
 -    "=="    shift, and go to state 36
 -    "!="    shift, and go to state 37
 -    "//"    shift, and go to state 38
 -    "then"  shift, and go to state 145
 -    "and"   shift, and go to state 39
 -    "or"    shift, and go to state 40
 -    "|="    shift, and go to state 41
 -    "+="    shift, and go to state 42
 -    "-="    shift, and go to state 43
 -    "*="    shift, and go to state 44
 -    "/="    shift, and go to state 45
 -    "//="   shift, and go to state 46
 -    "<="    shift, and go to state 47
 -    ">="    shift, and go to state 48
 -    '|'     shift, and go to state 49
 -    ','     shift, and go to state 50
 -    '='     shift, and go to state 51
 -    '<'     shift, and go to state 52
 -    '>'     shift, and go to state 53
 -    '+'     shift, and go to state 54
 -    '-'     shift, and go to state 55
 -    '*'     shift, and go to state 56
 -    '/'     shift, and go to state 57
 +   31    | Exp . "contains" Exp
-    40 ElseBody: "elif" Exp . "then" Exp ElseBody
++   39 ElseBody: "elif" Exp . "then" Exp ElseBody
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "then"      shift, and go to state 147
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
  
  
 -state 139
 +state 141
  
-    42 ExpD: ExpD . '|' ExpD
-    42     | ExpD '|' ExpD .
 -   40 ExpD: ExpD . '|' ExpD
 -   40     | ExpD '|' ExpD .
++   41 ExpD: ExpD . '|' ExpD
++   41     | ExpD '|' ExpD .
  
-     $default  reduce using rule 42 (ExpD)
 -    $default  reduce using rule 40 (ExpD)
++    $default  reduce using rule 41 (ExpD)
  
  
 -state 140
 +state 142
  
-    42 ExpD: ExpD . '|' ExpD
 -   40 ExpD: ExpD . '|' ExpD
 -   68 MkDictPair: '(' error ')' ':' ExpD .
++   41 ExpD: ExpD . '|' ExpD
 +   69 MkDictPair: '(' error ')' ':' ExpD .
  
 -    '|'  shift, and go to state 132
 +    '|'  shift, and go to state 134
  
 -    $default  reduce using rule 68 (MkDictPair)
 +    $default  reduce using rule 69 (MkDictPair)
  
  
 -state 141
 +state 143
  
-    42 ExpD: ExpD . '|' ExpD
 -   40 ExpD: ExpD . '|' ExpD
 -   67 MkDictPair: '(' Exp ')' ':' ExpD .
++   41 ExpD: ExpD . '|' ExpD
 +   68 MkDictPair: '(' Exp ')' ':' ExpD .
  
 -    '|'  shift, and go to state 132
 +    '|'  shift, and go to state 134
  
 -    $default  reduce using rule 67 (MkDictPair)
 +    $default  reduce using rule 68 (MkDictPair)
  
  
 -state 142
 +state 144
  
      6 Exp: Term "as" '$' IDENT '|' Exp .
      9    | Exp . '=' Exp
@@@ -3428,45 -3304,43 +3438,45 @@@ state 14
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   34 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp . ';'
 -
 -    "=="   shift, and go to state 36
 -    "!="   shift, and go to state 37
 -    "//"   shift, and go to state 38
 -    "and"  shift, and go to state 39
 -    "or"   shift, and go to state 40
 -    "|="   shift, and go to state 41
 -    "+="   shift, and go to state 42
 -    "-="   shift, and go to state 43
 -    "*="   shift, and go to state 44
 -    "/="   shift, and go to state 45
 -    "//="  shift, and go to state 46
 -    "<="   shift, and go to state 47
 -    ">="   shift, and go to state 48
 -    ';'    shift, and go to state 146
 -    '|'    shift, and go to state 49
 -    ','    shift, and go to state 50
 -    '='    shift, and go to state 51
 -    '<'    shift, and go to state 52
 -    '>'    shift, and go to state 53
 -    '+'    shift, and go to state 54
 -    '-'    shift, and go to state 55
 -    '*'    shift, and go to state 56
 -    '/'    shift, and go to state 57
 +   31    | Exp . "contains" Exp
-    36 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp . ';'
++   35 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp . ';'
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    ';'         shift, and go to state 148
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
  
  
 -state 144
 +state 146
  
-    41 ElseBody: "else" Exp "end" .
 -   39 ElseBody: "else" Exp "end" .
++   40 ElseBody: "else" Exp "end" .
  
-     $default  reduce using rule 41 (ElseBody)
 -    $default  reduce using rule 39 (ElseBody)
++    $default  reduce using rule 40 (ElseBody)
  
  
 -state 145
 +state 147
  
-    40 ElseBody: "elif" Exp "then" . Exp ElseBody
 -   38 ElseBody: "elif" Exp "then" . Exp ElseBody
++   39 ElseBody: "elif" Exp "then" . Exp ElseBody
  
      IDENT           shift, and go to state 1
      LITERAL         shift, and go to state 2
      Term     go to state 16
  
  
 -state 146
 +state 148
  
-    36 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp ';' .
 -   34 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp ';' .
++   35 FuncDef: "def" IDENT '(' IDENT ')' ':' Exp ';' .
  
-     $default  reduce using rule 36 (FuncDef)
 -    $default  reduce using rule 34 (FuncDef)
++    $default  reduce using rule 35 (FuncDef)
  
  
 -state 147
 +state 149
  
      9 Exp: Exp . '=' Exp
     10    | Exp . "or" Exp
     28    | Exp . '>' Exp
     29    | Exp . "<=" Exp
     30    | Exp . ">=" Exp
 -   38 ElseBody: "elif" Exp "then" Exp . ElseBody
 -
 -    "=="    shift, and go to state 36
 -    "!="    shift, and go to state 37
 -    "//"    shift, and go to state 38
 -    "else"  shift, and go to state 128
 -    "elif"  shift, and go to state 129
 -    "and"   shift, and go to state 39
 -    "or"    shift, and go to state 40
 -    "|="    shift, and go to state 41
 -    "+="    shift, and go to state 42
 -    "-="    shift, and go to state 43
 -    "*="    shift, and go to state 44
 -    "/="    shift, and go to state 45
 -    "//="   shift, and go to state 46
 -    "<="    shift, and go to state 47
 -    ">="    shift, and go to state 48
 -    '|'     shift, and go to state 49
 -    ','     shift, and go to state 50
 -    '='     shift, and go to state 51
 -    '<'     shift, and go to state 52
 -    '>'     shift, and go to state 53
 -    '+'     shift, and go to state 54
 -    '-'     shift, and go to state 55
 -    '*'     shift, and go to state 56
 -    '/'     shift, and go to state 57
 -
 -    ElseBody  go to state 148
 +   31    | Exp . "contains" Exp
-    40 ElseBody: "elif" Exp "then" Exp . ElseBody
++   39 ElseBody: "elif" Exp "then" Exp . ElseBody
 +
 +    "=="        shift, and go to state 36
 +    "!="        shift, and go to state 37
 +    "//"        shift, and go to state 38
 +    "else"      shift, and go to state 130
 +    "elif"      shift, and go to state 131
 +    "and"       shift, and go to state 39
 +    "or"        shift, and go to state 40
 +    "|="        shift, and go to state 41
 +    "+="        shift, and go to state 42
 +    "-="        shift, and go to state 43
 +    "*="        shift, and go to state 44
 +    "/="        shift, and go to state 45
 +    "//="       shift, and go to state 46
 +    "<="        shift, and go to state 47
 +    ">="        shift, and go to state 48
 +    "contains"  shift, and go to state 49
 +    '|'         shift, and go to state 50
 +    ','         shift, and go to state 51
 +    '='         shift, and go to state 52
 +    '<'         shift, and go to state 53
 +    '>'         shift, and go to state 54
 +    '+'         shift, and go to state 55
 +    '-'         shift, and go to state 56
 +    '*'         shift, and go to state 57
 +    '/'         shift, and go to state 58
 +
 +    ElseBody  go to state 150
 +
 +
 +state 150
 +
-    40 ElseBody: "elif" Exp "then" Exp ElseBody .
++   39 ElseBody: "elif" Exp "then" Exp ElseBody .
  
-     $default  reduce using rule 40 (ElseBody)
 -
 -state 148
 -
 -   38 ElseBody: "elif" Exp "then" Exp ElseBody .
 -
 -    $default  reduce using rule 38 (ElseBody)
++    $default  reduce using rule 39 (ElseBody)
diff --cc parser.y
index ddc41c5ed982efabd06fd8feaa1284f728e9be3c,d64a2ec5d90598bc66adf5da73fbc2781f9b637c..8a2495b5659019ac37c21a21d4c851c5a749620f
+++ b/parser.y
@@@ -310,14 -308,6 +310,10 @@@ Exp ">=" Exp 
    $$ = gen_binop($1, $3, GREATEREQ);
  } |
  
- String {
-   $$ = $1;
- } |
 +Exp "contains" Exp {
 +  $$ = gen_binop($1, $3, CONTAINS);
 +} |
 +
  Term { 
    $$ = $1; 
  }