[Forensics-changes] [yara] 367/407: Make operator precedence compatible with the C language.

Hilko Bengen bengen at moszumanska.debian.org
Sat Jul 1 10:28:46 UTC 2017


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to annotated tag v3.3.0
in repository yara.

commit 925cc8bc4f442e113c7f00880ff427c8a5a3358d
Author: Victor Manuel Alvarez <vmalvarez at virustotal.com>
Date:   Sat Jan 31 19:39:33 2015 +0100

    Make operator precedence compatible with the C language.
    
    According to the operator precedence in C language the expression A ^ B & C is parsed as A ^ (B & C) not as (A ^ B) & C.
---
 libyara/grammar.c    | 500 ++++++++++++++++++++++++++-------------------------
 libyara/grammar.h    |  10 +-
 libyara/grammar.y    |  11 +-
 yara-python/tests.py |  10 +-
 4 files changed, 272 insertions(+), 259 deletions(-)

diff --git a/libyara/grammar.c b/libyara/grammar.c
index bb777e6..384e384 100644
--- a/libyara/grammar.c
+++ b/libyara/grammar.c
@@ -119,8 +119,8 @@
      _LT_ = 300,
      _SHIFT_RIGHT_ = 301,
      _SHIFT_LEFT_ = 302,
-     _NOT_ = 303,
-     UNARY_MINUS = 304
+     UNARY_MINUS = 303,
+     _NOT_ = 304
    };
 #endif
 /* Tokens.  */
@@ -169,8 +169,8 @@
 #define _LT_ 300
 #define _SHIFT_RIGHT_ 301
 #define _SHIFT_LEFT_ 302
-#define _NOT_ 303
-#define UNARY_MINUS 304
+#define UNARY_MINUS 303
+#define _NOT_ 304
 
 
 
@@ -260,7 +260,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 177 "grammar.y"
+#line 178 "grammar.y"
 {
   EXPRESSION      expression;
   SIZED_STRING*   sized_string;
@@ -499,7 +499,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   354
+#define YYLAST   383
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  70
@@ -523,16 +523,16 @@ static const yytype_uint8 yytranslate[] =
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,    55,    40,     2,
+       2,     2,     2,     2,     2,     2,     2,    55,    42,     2,
       67,    68,    53,    51,    69,    52,    64,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,    62,     2,
        2,    63,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    65,    54,    66,    42,     2,     2,     2,     2,     2,
+       2,    65,    54,    66,    41,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    60,    41,    61,    57,     2,     2,     2,
+       2,     2,     2,    60,    40,    61,    56,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -550,7 +550,7 @@ static const yytype_uint8 yytranslate[] =
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    43,    44,    45,    46,    47,
-      48,    49,    50,    56,    58,    59
+      48,    49,    50,    57,    58,    59
 };
 
 #if YYDEBUG
@@ -594,7 +594,7 @@ static const yytype_int8 yyrhs[] =
       -1,    10,    24,   104,    -1,    10,    29,    97,    -1,    -1,
       -1,    31,   103,     9,    29,    93,    96,    62,    94,    67,
       91,    68,    -1,    -1,    31,   103,    30,    99,    62,    95,
-      67,    91,    68,    -1,   103,    30,    99,    -1,    56,    91,
+      67,    91,    68,    -1,   103,    30,    99,    -1,    58,    91,
       -1,    91,    39,    91,    -1,    91,    38,    91,    -1,   104,
       48,   104,    -1,   104,    46,   104,    -1,   104,    47,   104,
       -1,   104,    45,   104,    -1,   104,    44,   104,    -1,   104,
@@ -608,26 +608,26 @@ static const yytype_int8 yyrhs[] =
       -1,    11,    -1,    12,    65,   104,    66,    -1,    12,    -1,
       88,    -1,    52,   104,    -1,   104,    51,   104,    -1,   104,
       52,   104,    -1,   104,    53,   104,    -1,   104,    54,   104,
-      -1,   104,    55,   104,    -1,   104,    42,   104,    -1,   104,
-      40,   104,    -1,   104,    41,   104,    -1,    57,   104,    -1,
+      -1,   104,    55,   104,    -1,   104,    41,   104,    -1,   104,
+      42,   104,    -1,   104,    40,   104,    -1,    56,   104,    -1,
      104,    50,   104,    -1,   104,    49,   104,    -1,    90,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   190,   190,   192,   193,   194,   195,   196,   201,   213,
-     232,   235,   263,   267,   295,   300,   301,   306,   307,   313,
-     316,   334,   347,   384,   385,   390,   406,   419,   432,   449,
-     450,   455,   469,   468,   487,   504,   505,   510,   511,   512,
-     513,   518,   606,   654,   714,   761,   764,   789,   825,   870,
-     887,   896,   905,   920,   934,   948,   964,   979,  1014,   978,
-    1128,  1127,  1206,  1212,  1218,  1224,  1232,  1241,  1250,  1259,
-    1268,  1277,  1286,  1290,  1298,  1299,  1304,  1326,  1338,  1354,
-    1353,  1359,  1368,  1369,  1374,  1379,  1388,  1389,  1393,  1401,
-    1405,  1415,  1429,  1445,  1455,  1464,  1487,  1502,  1517,  1539,
-    1583,  1602,  1620,  1638,  1656,  1674,  1684,  1694,  1704,  1714,
-    1724,  1734,  1744
+       0,   191,   191,   193,   194,   195,   196,   197,   202,   214,
+     233,   236,   264,   268,   296,   301,   302,   307,   308,   314,
+     317,   335,   348,   385,   386,   391,   407,   420,   433,   450,
+     451,   456,   470,   469,   488,   505,   506,   511,   512,   513,
+     514,   519,   607,   655,   715,   762,   765,   790,   826,   871,
+     888,   897,   906,   921,   935,   949,   965,   980,  1015,   979,
+    1129,  1128,  1207,  1213,  1219,  1225,  1233,  1242,  1251,  1260,
+    1269,  1278,  1287,  1291,  1299,  1300,  1305,  1327,  1339,  1355,
+    1354,  1360,  1369,  1370,  1375,  1380,  1389,  1390,  1394,  1402,
+    1406,  1416,  1430,  1446,  1456,  1465,  1488,  1503,  1518,  1540,
+    1584,  1603,  1621,  1639,  1657,  1675,  1685,  1695,  1705,  1715,
+    1725,  1735,  1745
 };
 #endif
 
@@ -644,9 +644,9 @@ static const char *const yytname[] =
   "_ASCII_", "_WIDE_", "_NOCASE_", "_FULLWORD_", "_AT_", "_FILESIZE_",
   "_ENTRYPOINT_", "_ALL_", "_ANY_", "_IN_", "_OF_", "_FOR_", "_THEM_",
   "_MATCHES_", "_CONTAINS_", "_IMPORT_", "_TRUE_", "_FALSE_", "_OR_",
-  "_AND_", "'&'", "'|'", "'^'", "_NEQ_", "_EQ_", "_GE_", "_GT_", "_LE_",
+  "_AND_", "'|'", "'^'", "'&'", "_NEQ_", "_EQ_", "_GE_", "_GT_", "_LE_",
   "_LT_", "_SHIFT_RIGHT_", "_SHIFT_LEFT_", "'+'", "'-'", "'*'", "'\\\\'",
-  "'%'", "_NOT_", "'~'", "UNARY_MINUS", "\"include\"", "'{'", "'}'", "':'",
+  "'%'", "'~'", "UNARY_MINUS", "_NOT_", "\"include\"", "'{'", "'}'", "':'",
   "'='", "'.'", "'['", "']'", "'('", "')'", "','", "$accept", "rules",
   "import", "rule", "meta", "strings", "condition", "rule_modifiers",
   "rule_modifier", "tags", "tag_list", "meta_declarations",
@@ -668,8 +668,8 @@ static const yytype_uint16 yytoknum[] =
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-      38,   124,    94,   295,   296,   297,   298,   299,   300,   301,
-     302,    43,    45,    42,    92,    37,   303,   126,   304,   305,
+     124,    94,    38,   295,   296,   297,   298,   299,   300,   301,
+     302,    43,    45,    42,    92,    37,   126,   303,   304,   305,
      123,   125,    58,    61,    46,    91,    93,    40,    41,    44
 };
 # endif
@@ -721,12 +721,12 @@ static const yytype_uint8 yydefact[] =
       98,    93,    94,     0,    95,    48,    90,    91,    87,    88,
        0,    50,    51,     0,     0,     0,     0,    99,   112,    14,
       49,     0,    72,    35,    34,     0,     0,     0,     0,     0,
-       0,     0,    86,   100,    63,   109,     0,    49,    72,     0,
+       0,     0,    86,   100,   109,    63,     0,    49,    72,     0,
        0,    45,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,    31,    35,    55,     0,    56,     0,     0,
        0,     0,     0,    73,    89,    42,     0,     0,    46,    65,
-      64,    81,    79,    62,    52,    53,   107,   108,   106,    71,
+      64,    81,    79,    62,    52,    53,   108,   106,   107,    71,
       70,    69,    67,    68,    66,   111,   110,   101,   102,   103,
      104,   105,    38,    37,    39,    40,    36,    33,     0,    97,
       92,    57,     0,    43,    44,     0,     0,     0,     0,    60,
@@ -749,35 +749,35 @@ static const yytype_int16 yydefgoto[] =
 #define YYPACT_NINF -65
 static const yytype_int16 yypact[] =
 {
-     -65,     3,   -65,   -22,   -12,   -65,   -65,    80,   -65,   -65,
-     -65,   -65,     6,   -65,   -65,   -65,   -38,    25,   -20,   -65,
-      34,    46,   -65,    -7,    74,    81,    33,    92,    56,    81,
-     -65,   114,    59,    79,    43,   -65,    72,   114,   -65,    77,
-     -65,   -65,   -65,   -65,   -65,    98,   -65,   -65,    -1,   -65,
-      87,   -65,   -65,    90,   -65,   -65,   -65,   -65,   -65,   -65,
-     111,   -65,   -65,   134,    77,   134,    77,    -6,   -65,    68,
-     -65,   124,   267,   -65,   -65,   139,   134,    94,   134,   134,
-     134,     5,   299,   -65,   -65,   -65,    68,    99,   162,   153,
-     134,    77,    77,    77,   -31,   147,   134,   134,   134,   134,
-     134,   134,   134,   134,   134,   134,   134,   134,   134,   134,
-     134,   134,   134,    89,   -65,   299,   134,   -65,   222,   130,
-     182,   140,   -31,   -65,   -65,   -65,   240,    49,    93,   136,
-     -65,   -65,   -65,   -65,   -65,   299,   -33,   -33,   -33,   299,
-     299,   299,   299,   299,   299,    -4,    -4,    44,    44,   -65,
-     -65,   -65,   -65,   -65,   -65,   -65,   -65,    89,   283,   -65,
-     -65,   -65,   115,   -65,   -65,    77,    20,   112,   120,   -65,
-      93,   -65,   -65,    96,   -65,   134,   134,   126,   -65,   122,
-     -65,    20,   202,   105,   283,   -65,    77,   -65,   -65,   -65,
-     134,   123,   -29,   299,    77,   -65,   -27,   -65
+     -65,     5,   -65,   -28,    11,   -65,   -65,    13,   -65,   -65,
+     -65,   -65,    21,   -65,   -65,   -65,   -48,    33,    12,   -65,
+      68,    76,   -65,    45,    80,   101,    58,   116,    63,   101,
+     -65,   127,    77,    87,     7,   -65,    75,   127,   -65,    69,
+     -65,   -65,   -65,   -65,   -65,    81,   -65,   -65,    -9,   -65,
+      85,   -65,   -65,    93,   -65,   -65,   -65,   -65,   -65,   -65,
+     142,   -65,   -65,   162,   162,    69,    69,     9,   -65,    70,
+     -65,   122,   275,   -65,   -65,   145,   162,    98,   162,   162,
+     162,     4,    91,   -65,   -65,   -65,    70,   104,   190,   157,
+     162,    69,    69,    69,   -31,   156,   162,   162,   162,   162,
+     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
+     162,   162,   162,    25,   -65,    91,   162,   -65,   230,    62,
+     151,   153,   -31,   -65,   -65,   -65,   248,    50,    84,   141,
+     -65,   -65,   -65,   -65,   -65,    91,   307,   321,   328,    91,
+      91,    91,    91,    91,    91,    38,    38,    -3,    -3,   -65,
+     -65,   -65,   -65,   -65,   -65,   -65,   -65,    25,   291,   -65,
+     -65,   -65,   121,   -65,   -65,    69,    19,   120,   118,   -65,
+      84,   -65,   -65,    60,   -65,   162,   162,   124,   -65,   123,
+     -65,    19,   210,    94,   291,   -65,    69,   -65,   -65,   -65,
+     162,   128,   -35,    91,    69,   -65,   -27,   -65
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -65,   -65,   190,   191,   -65,   -65,   -65,   -65,   -65,   -65,
-     -65,   -65,   168,   -65,   163,   -65,    85,   -65,   -65,   -65,
-     125,   -39,   -64,   -65,   -65,   -65,   -65,    50,   -65,    97,
-     -65,   -65,    40,   165,   -34
+     -65,   -65,   186,   193,   -65,   -65,   -65,   -65,   -65,   -65,
+     -65,   -65,   168,   -65,   170,   -65,    96,   -65,   -65,   -65,
+     113,   -39,   -64,   -65,   -65,   -65,   -65,    31,   -65,    89,
+     -65,   -65,    32,   152,   -41
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -787,82 +787,88 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -87
 static const yytype_int16 yytable[] =
 {
-      69,   131,    87,     2,     3,    11,   -15,   -15,   -15,    92,
-      93,    92,    93,     4,   121,    16,   106,   107,   108,   109,
-     110,   111,   112,    76,    17,    84,    82,   128,    77,    83,
-     171,    85,    88,   172,    19,   122,   132,     8,     4,   195,
-      21,   197,   115,    22,   118,   119,   120,   108,   109,   110,
-     111,   112,    23,   129,   130,    25,   126,    41,    89,    90,
-      42,    91,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,    43,
-      44,    26,   158,    12,    13,    14,    47,    48,    49,    50,
-      28,    51,    52,    53,    54,    31,    55,   110,   111,   112,
-      32,   170,    56,    57,    58,    59,    92,    93,    60,   152,
-     153,   154,   155,    61,    62,    73,    74,   164,   165,    34,
-      47,    39,    49,    50,    36,    51,    52,    53,    54,    63,
-      55,   -49,   -49,    64,    65,    45,    56,    57,    58,    59,
-      40,   182,   184,    47,    66,    49,    50,   192,    51,    52,
-      53,    54,    78,    55,    94,   196,   193,    79,   114,    56,
-      57,   116,   125,    63,   180,   181,    55,   123,    65,   161,
-      97,    98,    99,   189,   190,    93,   175,   169,    80,   106,
-     107,   108,   109,   110,   111,   112,    63,   176,   185,   186,
-     194,    65,   -86,     9,    10,    95,    96,    35,   160,   157,
-      46,    80,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   178,   162,
-     134,   187,    97,    98,    99,    81,     0,     0,     0,     0,
-     124,   106,   107,   108,   109,   110,   111,   112,     0,     0,
-       0,     0,    97,    98,    99,     0,     0,     0,     0,     0,
-     124,   106,   107,   108,   109,   110,   111,   112,     0,     0,
-       0,     0,    97,    98,    99,     0,     0,     0,     0,     0,
-     188,   106,   107,   108,   109,   110,   111,   112,     0,     0,
-      97,    98,    99,     0,     0,     0,     0,     0,   159,   106,
-     107,   108,   109,   110,   111,   112,     0,   -86,     0,     0,
-      95,    96,     0,     0,     0,     0,   163,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,    97,    98,    99,     0,     0,     0,     0,
-       0,     0,   106,   107,   108,   109,   110,   111,   112,    97,
-      98,    99,     0,     0,     0,     0,     0,   167,   106,   107,
-     108,   109,   110,   111,   112
+      69,   131,    87,    92,    93,     2,     3,     4,   -15,   -15,
+     -15,    92,    93,   121,    17,    76,    12,    13,    14,    82,
+      77,    41,    83,    84,    42,    88,    85,   128,    11,   171,
+      16,     8,   172,   195,   122,   115,   132,   118,   119,   120,
+       4,   197,    19,    43,    44,   152,   153,   154,   155,   126,
+     110,   111,   112,   129,   130,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,    21,    89,    90,   158,    91,    22,    47,    48,
+      49,    50,    23,    51,    52,    53,    54,    26,    55,   108,
+     109,   110,   111,   112,    56,    57,    58,    59,    73,    74,
+      60,   170,    97,    98,    99,    61,    62,    25,    92,    93,
+      28,   106,   107,   108,   109,   110,   111,   112,   164,   165,
+      31,    63,   -49,   -49,    32,    64,    34,    65,   180,   181,
+     160,    97,    98,    99,   182,   184,    66,    36,    45,    39,
+     106,   107,   108,   109,   110,   111,   112,   192,    40,   193,
+      78,    47,    94,    49,    50,   196,    51,    52,    53,    54,
+      79,    55,   189,   190,   114,   116,   125,    56,    57,    58,
+      59,    47,   123,    49,    50,    55,    51,    52,    53,    54,
+      93,    55,   161,   169,   175,   176,   185,    56,    57,     9,
+     186,    97,    98,    99,    63,   194,    10,    35,    64,   178,
+     106,   107,   108,   109,   110,   111,   112,    46,   134,    80,
+     157,   162,    81,   187,    63,     0,     0,     0,    64,   124,
+     -86,     0,     0,    95,    96,     0,     0,     0,     0,    80,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,     0,     0,     0,     0,
+      97,    98,    99,     0,     0,     0,     0,     0,   124,   106,
+     107,   108,   109,   110,   111,   112,     0,     0,     0,     0,
+      97,    98,    99,     0,     0,     0,     0,     0,   188,   106,
+     107,   108,   109,   110,   111,   112,     0,     0,    97,    98,
+      99,     0,     0,     0,     0,     0,   159,   106,   107,   108,
+     109,   110,   111,   112,     0,   -86,     0,     0,    95,    96,
+       0,     0,     0,     0,   163,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+     112,    97,    98,    99,     0,     0,     0,     0,     0,     0,
+     106,   107,   108,   109,   110,   111,   112,     0,    98,    99,
+       0,     0,     0,     0,     0,   167,   106,   107,   108,   109,
+     110,   111,   112,    99,     0,     0,     0,     0,     0,     0,
+     106,   107,   108,   109,   110,   111,   112,   106,   107,   108,
+     109,   110,   111,   112
 };
 
 static const yytype_int16 yycheck[] =
 {
-      39,    32,    66,     0,     1,    17,     3,     4,     5,    38,
-      39,    38,    39,    35,     9,     9,    49,    50,    51,    52,
-      53,    54,    55,    24,    62,    64,    60,    91,    29,    63,
-      10,    65,    66,    13,     9,    30,    67,    59,    35,    68,
-      60,    68,    76,     9,    78,    79,    80,    51,    52,    53,
-      54,    55,     6,    92,    93,    62,    90,    14,    64,    65,
-      17,    67,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,    36,
-      37,     7,   116,     3,     4,     5,     9,    10,    11,    12,
-       9,    14,    15,    16,    17,    62,    19,    53,    54,    55,
-       8,   165,    25,    26,    27,    28,    38,    39,    31,    20,
-      21,    22,    23,    36,    37,    17,    18,    68,    69,    63,
-       9,    62,    11,    12,    10,    14,    15,    16,    17,    52,
-      19,    38,    39,    56,    57,    63,    25,    26,    27,    28,
-      61,   175,   176,     9,    67,    11,    12,   186,    14,    15,
-      16,    17,    65,    19,    30,   194,   190,    67,    19,    25,
-      26,    67,     9,    52,    68,    69,    19,    68,    57,    29,
-      40,    41,    42,    68,    69,    39,    64,    62,    67,    49,
-      50,    51,    52,    53,    54,    55,    52,    67,    62,    67,
-      67,    57,    30,     3,     3,    33,    34,    29,    68,   114,
-      37,    67,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,   168,   122,
-      95,   181,    40,    41,    42,    60,    -1,    -1,    -1,    -1,
-      68,    49,    50,    51,    52,    53,    54,    55,    -1,    -1,
-      -1,    -1,    40,    41,    42,    -1,    -1,    -1,    -1,    -1,
-      68,    49,    50,    51,    52,    53,    54,    55,    -1,    -1,
-      -1,    -1,    40,    41,    42,    -1,    -1,    -1,    -1,    -1,
-      68,    49,    50,    51,    52,    53,    54,    55,    -1,    -1,
-      40,    41,    42,    -1,    -1,    -1,    -1,    -1,    66,    49,
-      50,    51,    52,    53,    54,    55,    -1,    30,    -1,    -1,
-      33,    34,    -1,    -1,    -1,    -1,    66,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    40,    41,    42,    -1,    -1,    -1,    -1,
-      -1,    -1,    49,    50,    51,    52,    53,    54,    55,    40,
-      41,    42,    -1,    -1,    -1,    -1,    -1,    64,    49,    50,
-      51,    52,    53,    54,    55
+      39,    32,    66,    38,    39,     0,     1,    35,     3,     4,
+       5,    38,    39,     9,    62,    24,     3,     4,     5,    60,
+      29,    14,    63,    64,    17,    66,    65,    91,    17,    10,
+       9,    59,    13,    68,    30,    76,    67,    78,    79,    80,
+      35,    68,     9,    36,    37,    20,    21,    22,    23,    90,
+      53,    54,    55,    92,    93,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,    60,    64,    65,   116,    67,     9,     9,    10,
+      11,    12,     6,    14,    15,    16,    17,     7,    19,    51,
+      52,    53,    54,    55,    25,    26,    27,    28,    17,    18,
+      31,   165,    40,    41,    42,    36,    37,    62,    38,    39,
+       9,    49,    50,    51,    52,    53,    54,    55,    68,    69,
+      62,    52,    38,    39,     8,    56,    63,    58,    68,    69,
+      68,    40,    41,    42,   175,   176,    67,    10,    63,    62,
+      49,    50,    51,    52,    53,    54,    55,   186,    61,   190,
+      65,     9,    30,    11,    12,   194,    14,    15,    16,    17,
+      67,    19,    68,    69,    19,    67,     9,    25,    26,    27,
+      28,     9,    68,    11,    12,    19,    14,    15,    16,    17,
+      39,    19,    29,    62,    64,    67,    62,    25,    26,     3,
+      67,    40,    41,    42,    52,    67,     3,    29,    56,   168,
+      49,    50,    51,    52,    53,    54,    55,    37,    95,    67,
+     114,   122,    60,   181,    52,    -1,    -1,    -1,    56,    68,
+      30,    -1,    -1,    33,    34,    -1,    -1,    -1,    -1,    67,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    -1,    -1,    -1,    -1,
+      40,    41,    42,    -1,    -1,    -1,    -1,    -1,    68,    49,
+      50,    51,    52,    53,    54,    55,    -1,    -1,    -1,    -1,
+      40,    41,    42,    -1,    -1,    -1,    -1,    -1,    68,    49,
+      50,    51,    52,    53,    54,    55,    -1,    -1,    40,    41,
+      42,    -1,    -1,    -1,    -1,    -1,    66,    49,    50,    51,
+      52,    53,    54,    55,    -1,    30,    -1,    -1,    33,    34,
+      -1,    -1,    -1,    -1,    66,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    40,    41,    42,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    50,    51,    52,    53,    54,    55,    -1,    41,    42,
+      -1,    -1,    -1,    -1,    -1,    64,    49,    50,    51,    52,
+      53,    54,    55,    42,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    50,    51,    52,    53,    54,    55,    49,    50,    51,
+      52,    53,    54,    55
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -875,9 +881,9 @@ static const yytype_uint8 yystos[] =
       82,    62,     8,    76,    63,    82,    10,    83,    84,    62,
       61,    14,    17,    36,    37,    63,    84,     9,    10,    11,
       12,    14,    15,    16,    17,    19,    25,    26,    27,    28,
-      31,    36,    37,    52,    56,    57,    67,    88,    90,    91,
+      31,    36,    37,    52,    56,    58,    67,    88,    90,    91,
       92,   103,   104,    17,    18,    85,    24,    29,    65,    67,
-      67,   103,   104,   104,    91,   104,    91,    92,   104,    64,
+      67,   103,   104,   104,   104,    91,    91,    92,   104,    64,
       65,    67,    38,    39,    30,    33,    34,    40,    41,    42,
       43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
       53,    54,    55,    86,    19,   104,    67,    97,   104,   104,
@@ -1409,44 +1415,44 @@ yydestruct (yymsg, yytype, yyvaluep, yyscanner, compiler)
   switch (yytype)
     {
       case 9: /* "_IDENTIFIER_" */
-#line 168 "grammar.y"
+#line 169 "grammar.y"
 	{ yr_free((yyvaluep->c_string)); };
-#line 1415 "grammar.c"
+#line 1421 "grammar.c"
 	break;
       case 10: /* "_STRING_IDENTIFIER_" */
-#line 169 "grammar.y"
+#line 170 "grammar.y"
 	{ yr_free((yyvaluep->c_string)); };
-#line 1420 "grammar.c"
+#line 1426 "grammar.c"
 	break;
       case 11: /* "_STRING_COUNT_" */
-#line 170 "grammar.y"
+#line 171 "grammar.y"
 	{ yr_free((yyvaluep->c_string)); };
-#line 1425 "grammar.c"
+#line 1431 "grammar.c"
 	break;
       case 12: /* "_STRING_OFFSET_" */
-#line 171 "grammar.y"
+#line 172 "grammar.y"
 	{ yr_free((yyvaluep->c_string)); };
-#line 1430 "grammar.c"
+#line 1436 "grammar.c"
 	break;
       case 13: /* "_STRING_IDENTIFIER_WITH_WILDCARD_" */
-#line 172 "grammar.y"
+#line 173 "grammar.y"
 	{ yr_free((yyvaluep->c_string)); };
-#line 1435 "grammar.c"
+#line 1441 "grammar.c"
 	break;
       case 17: /* "_TEXT_STRING_" */
-#line 173 "grammar.y"
+#line 174 "grammar.y"
 	{ yr_free((yyvaluep->sized_string)); };
-#line 1440 "grammar.c"
+#line 1446 "grammar.c"
 	break;
       case 18: /* "_HEX_STRING_" */
-#line 174 "grammar.y"
+#line 175 "grammar.y"
 	{ yr_free((yyvaluep->sized_string)); };
-#line 1445 "grammar.c"
+#line 1451 "grammar.c"
 	break;
       case 19: /* "_REGEXP_" */
-#line 175 "grammar.y"
+#line 176 "grammar.y"
 	{ yr_free((yyvaluep->sized_string)); };
-#line 1450 "grammar.c"
+#line 1456 "grammar.c"
 	break;
 
       default:
@@ -1756,7 +1762,7 @@ yyreduce:
   switch (yyn)
     {
         case 8:
-#line 202 "grammar.y"
+#line 203 "grammar.y"
     {
         int result = yr_parser_reduce_import(yyscanner, (yyvsp[(2) - (2)].sized_string));
 
@@ -1767,7 +1773,7 @@ yyreduce:
     break;
 
   case 9:
-#line 214 "grammar.y"
+#line 215 "grammar.y"
     {
         int result = yr_parser_reduce_rule_declaration(
             yyscanner,
@@ -1784,14 +1790,14 @@ yyreduce:
     break;
 
   case 10:
-#line 232 "grammar.y"
+#line 233 "grammar.y"
     {
         (yyval.meta) = NULL;
       }
     break;
 
   case 11:
-#line 236 "grammar.y"
+#line 237 "grammar.y"
     {
         // Each rule have a list of meta-data info, consisting in a
         // sequence of YR_META structures. The last YR_META structure does
@@ -1817,7 +1823,7 @@ yyreduce:
     break;
 
   case 12:
-#line 263 "grammar.y"
+#line 264 "grammar.y"
     {
         (yyval.string) = NULL;
         compiler->current_rule_strings = (yyval.string);
@@ -1825,7 +1831,7 @@ yyreduce:
     break;
 
   case 13:
-#line 268 "grammar.y"
+#line 269 "grammar.y"
     {
         // Each rule have a list of strings, consisting in a sequence
         // of YR_STRING structures. The last YR_STRING structure does not
@@ -1852,34 +1858,34 @@ yyreduce:
     break;
 
   case 15:
-#line 300 "grammar.y"
+#line 301 "grammar.y"
     { (yyval.integer) = 0;  }
     break;
 
   case 16:
-#line 301 "grammar.y"
+#line 302 "grammar.y"
     { (yyval.integer) = (yyvsp[(1) - (2)].integer) | (yyvsp[(2) - (2)].integer); }
     break;
 
   case 17:
-#line 306 "grammar.y"
+#line 307 "grammar.y"
     { (yyval.integer) = RULE_GFLAGS_PRIVATE; }
     break;
 
   case 18:
-#line 307 "grammar.y"
+#line 308 "grammar.y"
     { (yyval.integer) = RULE_GFLAGS_GLOBAL; }
     break;
 
   case 19:
-#line 313 "grammar.y"
+#line 314 "grammar.y"
     {
         (yyval.c_string) = NULL;
       }
     break;
 
   case 20:
-#line 317 "grammar.y"
+#line 318 "grammar.y"
     {
         // Tags list is represented in the arena as a sequence
         // of null-terminated strings, the sequence ends with an
@@ -1896,7 +1902,7 @@ yyreduce:
     break;
 
   case 21:
-#line 335 "grammar.y"
+#line 336 "grammar.y"
     {
         char* identifier;
 
@@ -1912,7 +1918,7 @@ yyreduce:
     break;
 
   case 22:
-#line 348 "grammar.y"
+#line 349 "grammar.y"
     {
         char* tag_name = (yyvsp[(1) - (2)].c_string);
         size_t tag_length = tag_name != NULL ? strlen(tag_name) : 0;
@@ -1947,17 +1953,17 @@ yyreduce:
     break;
 
   case 23:
-#line 384 "grammar.y"
+#line 385 "grammar.y"
     {  (yyval.meta) = (yyvsp[(1) - (1)].meta); }
     break;
 
   case 24:
-#line 385 "grammar.y"
+#line 386 "grammar.y"
     {  (yyval.meta) = (yyvsp[(1) - (2)].meta); }
     break;
 
   case 25:
-#line 391 "grammar.y"
+#line 392 "grammar.y"
     {
         SIZED_STRING* sized_string = (yyvsp[(3) - (3)].sized_string);
 
@@ -1976,7 +1982,7 @@ yyreduce:
     break;
 
   case 26:
-#line 407 "grammar.y"
+#line 408 "grammar.y"
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -1992,7 +1998,7 @@ yyreduce:
     break;
 
   case 27:
-#line 420 "grammar.y"
+#line 421 "grammar.y"
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -2008,7 +2014,7 @@ yyreduce:
     break;
 
   case 28:
-#line 433 "grammar.y"
+#line 434 "grammar.y"
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -2024,17 +2030,17 @@ yyreduce:
     break;
 
   case 29:
-#line 449 "grammar.y"
+#line 450 "grammar.y"
     { (yyval.string) = (yyvsp[(1) - (1)].string); }
     break;
 
   case 30:
-#line 450 "grammar.y"
+#line 451 "grammar.y"
     { (yyval.string) = (yyvsp[(1) - (2)].string); }
     break;
 
   case 31:
-#line 456 "grammar.y"
+#line 457 "grammar.y"
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner,
@@ -2050,14 +2056,14 @@ yyreduce:
     break;
 
   case 32:
-#line 469 "grammar.y"
+#line 470 "grammar.y"
     {
         compiler->error_line = yyget_lineno(yyscanner);
       }
     break;
 
   case 33:
-#line 473 "grammar.y"
+#line 474 "grammar.y"
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner,
@@ -2075,7 +2081,7 @@ yyreduce:
     break;
 
   case 34:
-#line 488 "grammar.y"
+#line 489 "grammar.y"
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner,
@@ -2091,37 +2097,37 @@ yyreduce:
     break;
 
   case 35:
-#line 504 "grammar.y"
+#line 505 "grammar.y"
     { (yyval.integer) = 0; }
     break;
 
   case 36:
-#line 505 "grammar.y"
+#line 506 "grammar.y"
     { (yyval.integer) = (yyvsp[(1) - (2)].integer) | (yyvsp[(2) - (2)].integer); }
     break;
 
   case 37:
-#line 510 "grammar.y"
+#line 511 "grammar.y"
     { (yyval.integer) = STRING_GFLAGS_WIDE; }
     break;
 
   case 38:
-#line 511 "grammar.y"
+#line 512 "grammar.y"
     { (yyval.integer) = STRING_GFLAGS_ASCII; }
     break;
 
   case 39:
-#line 512 "grammar.y"
+#line 513 "grammar.y"
     { (yyval.integer) = STRING_GFLAGS_NO_CASE; }
     break;
 
   case 40:
-#line 513 "grammar.y"
+#line 514 "grammar.y"
     { (yyval.integer) = STRING_GFLAGS_FULL_WORD; }
     break;
 
   case 41:
-#line 519 "grammar.y"
+#line 520 "grammar.y"
     {
         int var_index = yr_parser_lookup_loop_variable(yyscanner, (yyvsp[(1) - (1)].c_string));
 
@@ -2212,7 +2218,7 @@ yyreduce:
     break;
 
   case 42:
-#line 607 "grammar.y"
+#line 608 "grammar.y"
     {
         YR_OBJECT* field = NULL;
 
@@ -2263,7 +2269,7 @@ yyreduce:
     break;
 
   case 43:
-#line 655 "grammar.y"
+#line 656 "grammar.y"
     {
         if ((yyvsp[(1) - (4)].expression).type == EXPRESSION_TYPE_OBJECT &&
             (yyvsp[(1) - (4)].expression).value.object->type == OBJECT_TYPE_ARRAY)
@@ -2325,7 +2331,7 @@ yyreduce:
     break;
 
   case 44:
-#line 715 "grammar.y"
+#line 716 "grammar.y"
     {
         char* args_fmt;
 
@@ -2370,14 +2376,14 @@ yyreduce:
     break;
 
   case 45:
-#line 761 "grammar.y"
+#line 762 "grammar.y"
     {
         (yyval.c_string) = yr_strdup("");
       }
     break;
 
   case 46:
-#line 765 "grammar.y"
+#line 766 "grammar.y"
     {
         (yyval.c_string) = (char*) yr_malloc(MAX_FUNCTION_ARGS + 1);
 
@@ -2405,7 +2411,7 @@ yyreduce:
     break;
 
   case 47:
-#line 790 "grammar.y"
+#line 791 "grammar.y"
     {
         if (strlen((yyvsp[(1) - (3)].c_string)) == MAX_FUNCTION_ARGS)
         {
@@ -2440,7 +2446,7 @@ yyreduce:
     break;
 
   case 48:
-#line 826 "grammar.y"
+#line 827 "grammar.y"
     {
         SIZED_STRING* sized_string = (yyvsp[(1) - (1)].sized_string);
         RE* re;
@@ -2484,7 +2490,7 @@ yyreduce:
     break;
 
   case 49:
-#line 871 "grammar.y"
+#line 872 "grammar.y"
     {
         if ((yyvsp[(1) - (1)].expression).type == EXPRESSION_TYPE_STRING)
         {
@@ -2501,7 +2507,7 @@ yyreduce:
     break;
 
   case 50:
-#line 888 "grammar.y"
+#line 889 "grammar.y"
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 1, NULL);
@@ -2513,7 +2519,7 @@ yyreduce:
     break;
 
   case 51:
-#line 897 "grammar.y"
+#line 898 "grammar.y"
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 0, NULL);
@@ -2525,7 +2531,7 @@ yyreduce:
     break;
 
   case 52:
-#line 906 "grammar.y"
+#line 907 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_STRING, "matches");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_REGEXP, "matches");
@@ -2543,7 +2549,7 @@ yyreduce:
     break;
 
   case 53:
-#line 921 "grammar.y"
+#line 922 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_STRING, "contains");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_STRING, "contains");
@@ -2560,7 +2566,7 @@ yyreduce:
     break;
 
   case 54:
-#line 935 "grammar.y"
+#line 936 "grammar.y"
     {
         int result = yr_parser_reduce_string_identifier(
             yyscanner,
@@ -2577,7 +2583,7 @@ yyreduce:
     break;
 
   case 55:
-#line 949 "grammar.y"
+#line 950 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "at");
 
@@ -2596,7 +2602,7 @@ yyreduce:
     break;
 
   case 56:
-#line 965 "grammar.y"
+#line 966 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner,
@@ -2613,7 +2619,7 @@ yyreduce:
     break;
 
   case 57:
-#line 979 "grammar.y"
+#line 980 "grammar.y"
     {
         int var_index;
 
@@ -2651,7 +2657,7 @@ yyreduce:
     break;
 
   case 58:
-#line 1014 "grammar.y"
+#line 1015 "grammar.y"
     {
         int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
         int8_t* addr;
@@ -2689,7 +2695,7 @@ yyreduce:
     break;
 
   case 59:
-#line 1049 "grammar.y"
+#line 1050 "grammar.y"
     {
         int mem_offset;
 
@@ -2771,7 +2777,7 @@ yyreduce:
     break;
 
   case 60:
-#line 1128 "grammar.y"
+#line 1129 "grammar.y"
     {
         int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
         int8_t* addr;
@@ -2804,7 +2810,7 @@ yyreduce:
     break;
 
   case 61:
-#line 1158 "grammar.y"
+#line 1159 "grammar.y"
     {
         int mem_offset;
 
@@ -2856,7 +2862,7 @@ yyreduce:
     break;
 
   case 62:
-#line 1207 "grammar.y"
+#line 1208 "grammar.y"
     {
         yr_parser_emit(yyscanner, OP_OF, NULL);
 
@@ -2865,7 +2871,7 @@ yyreduce:
     break;
 
   case 63:
-#line 1213 "grammar.y"
+#line 1214 "grammar.y"
     {
         yr_parser_emit(yyscanner, OP_NOT, NULL);
 
@@ -2874,7 +2880,7 @@ yyreduce:
     break;
 
   case 64:
-#line 1219 "grammar.y"
+#line 1220 "grammar.y"
     {
         yr_parser_emit(yyscanner, OP_AND, NULL);
 
@@ -2883,7 +2889,7 @@ yyreduce:
     break;
 
   case 65:
-#line 1225 "grammar.y"
+#line 1226 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_BOOLEAN, "or");
 
@@ -2894,7 +2900,7 @@ yyreduce:
     break;
 
   case 66:
-#line 1233 "grammar.y"
+#line 1234 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "<", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2906,7 +2912,7 @@ yyreduce:
     break;
 
   case 67:
-#line 1242 "grammar.y"
+#line 1243 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, ">", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2918,7 +2924,7 @@ yyreduce:
     break;
 
   case 68:
-#line 1251 "grammar.y"
+#line 1252 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "<=", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2930,7 +2936,7 @@ yyreduce:
     break;
 
   case 69:
-#line 1260 "grammar.y"
+#line 1261 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, ">=", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2942,7 +2948,7 @@ yyreduce:
     break;
 
   case 70:
-#line 1269 "grammar.y"
+#line 1270 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "==", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2954,7 +2960,7 @@ yyreduce:
     break;
 
   case 71:
-#line 1278 "grammar.y"
+#line 1279 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "!=", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -2966,31 +2972,31 @@ yyreduce:
     break;
 
   case 72:
-#line 1287 "grammar.y"
+#line 1288 "grammar.y"
     {
         (yyval.expression) = (yyvsp[(1) - (1)].expression);
       }
     break;
 
   case 73:
-#line 1291 "grammar.y"
+#line 1292 "grammar.y"
     {
         (yyval.expression) = (yyvsp[(2) - (3)].expression);
       }
     break;
 
   case 74:
-#line 1298 "grammar.y"
+#line 1299 "grammar.y"
     { (yyval.integer) = INTEGER_SET_ENUMERATION; }
     break;
 
   case 75:
-#line 1299 "grammar.y"
+#line 1300 "grammar.y"
     { (yyval.integer) = INTEGER_SET_RANGE; }
     break;
 
   case 76:
-#line 1305 "grammar.y"
+#line 1306 "grammar.y"
     {
         if ((yyvsp[(2) - (6)].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3011,7 +3017,7 @@ yyreduce:
     break;
 
   case 77:
-#line 1327 "grammar.y"
+#line 1328 "grammar.y"
     {
         if ((yyvsp[(1) - (1)].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3026,7 +3032,7 @@ yyreduce:
     break;
 
   case 78:
-#line 1339 "grammar.y"
+#line 1340 "grammar.y"
     {
         if ((yyvsp[(3) - (3)].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3040,7 +3046,7 @@ yyreduce:
     break;
 
   case 79:
-#line 1354 "grammar.y"
+#line 1355 "grammar.y"
     {
         // Push end-of-list marker
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL);
@@ -3048,7 +3054,7 @@ yyreduce:
     break;
 
   case 81:
-#line 1360 "grammar.y"
+#line 1361 "grammar.y"
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL);
         yr_parser_emit_pushes_for_strings(yyscanner, "$*");
@@ -3056,7 +3062,7 @@ yyreduce:
     break;
 
   case 84:
-#line 1375 "grammar.y"
+#line 1376 "grammar.y"
     {
         yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[(1) - (1)].c_string));
         yr_free((yyvsp[(1) - (1)].c_string));
@@ -3064,7 +3070,7 @@ yyreduce:
     break;
 
   case 85:
-#line 1380 "grammar.y"
+#line 1381 "grammar.y"
     {
         yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[(1) - (1)].c_string));
         yr_free((yyvsp[(1) - (1)].c_string));
@@ -3072,28 +3078,28 @@ yyreduce:
     break;
 
   case 87:
-#line 1390 "grammar.y"
+#line 1391 "grammar.y"
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL);
       }
     break;
 
   case 88:
-#line 1394 "grammar.y"
+#line 1395 "grammar.y"
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, 1, NULL);
       }
     break;
 
   case 89:
-#line 1402 "grammar.y"
+#line 1403 "grammar.y"
     {
         (yyval.expression) = (yyvsp[(2) - (3)].expression);
       }
     break;
 
   case 90:
-#line 1406 "grammar.y"
+#line 1407 "grammar.y"
     {
         compiler->last_result = yr_parser_emit(
             yyscanner, OP_FILESIZE, NULL);
@@ -3106,7 +3112,7 @@ yyreduce:
     break;
 
   case 91:
-#line 1416 "grammar.y"
+#line 1417 "grammar.y"
     {
         yywarning(yyscanner,
             "Using deprecated \"entrypoint\" keyword. Use the \"entry_point\" "
@@ -3123,7 +3129,7 @@ yyreduce:
     break;
 
   case 92:
-#line 1430 "grammar.y"
+#line 1431 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(3) - (4)].expression), EXPRESSION_TYPE_INTEGER, "intXXXX or uintXXXX");
 
@@ -3142,7 +3148,7 @@ yyreduce:
     break;
 
   case 93:
-#line 1446 "grammar.y"
+#line 1447 "grammar.y"
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, (yyvsp[(1) - (1)].integer), NULL);
@@ -3155,7 +3161,7 @@ yyreduce:
     break;
 
   case 94:
-#line 1456 "grammar.y"
+#line 1457 "grammar.y"
     {
         compiler->last_result = yr_parser_emit_with_arg_double(
             yyscanner, OP_PUSH, (yyvsp[(1) - (1)].double_), NULL);
@@ -3167,7 +3173,7 @@ yyreduce:
     break;
 
   case 95:
-#line 1465 "grammar.y"
+#line 1466 "grammar.y"
     {
         SIZED_STRING* sized_string;
 
@@ -3193,7 +3199,7 @@ yyreduce:
     break;
 
   case 96:
-#line 1488 "grammar.y"
+#line 1489 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner,
@@ -3211,7 +3217,7 @@ yyreduce:
     break;
 
   case 97:
-#line 1503 "grammar.y"
+#line 1504 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner,
@@ -3229,7 +3235,7 @@ yyreduce:
     break;
 
   case 98:
-#line 1518 "grammar.y"
+#line 1519 "grammar.y"
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner,
@@ -3254,7 +3260,7 @@ yyreduce:
     break;
 
   case 99:
-#line 1540 "grammar.y"
+#line 1541 "grammar.y"
     {
         if ((yyvsp[(1) - (1)].expression).type == EXPRESSION_TYPE_INTEGER)  // loop identifier
         {
@@ -3301,7 +3307,7 @@ yyreduce:
     break;
 
   case 100:
-#line 1584 "grammar.y"
+#line 1585 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(2) - (2)].expression), EXPRESSION_TYPE_INTEGER | EXPRESSION_TYPE_FLOAT, "-");
 
@@ -3323,7 +3329,7 @@ yyreduce:
     break;
 
   case 101:
-#line 1603 "grammar.y"
+#line 1604 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "+", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -3344,7 +3350,7 @@ yyreduce:
     break;
 
   case 102:
-#line 1621 "grammar.y"
+#line 1622 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "-", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -3365,7 +3371,7 @@ yyreduce:
     break;
 
   case 103:
-#line 1639 "grammar.y"
+#line 1640 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "*", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -3386,7 +3392,7 @@ yyreduce:
     break;
 
   case 104:
-#line 1657 "grammar.y"
+#line 1658 "grammar.y"
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "\\", (yyvsp[(1) - (3)].expression), (yyvsp[(3) - (3)].expression));
@@ -3407,7 +3413,7 @@ yyreduce:
     break;
 
   case 105:
-#line 1675 "grammar.y"
+#line 1676 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, "%");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "%");
@@ -3420,7 +3426,7 @@ yyreduce:
     break;
 
   case 106:
-#line 1685 "grammar.y"
+#line 1686 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, "^");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "^");
@@ -3433,7 +3439,7 @@ yyreduce:
     break;
 
   case 107:
-#line 1695 "grammar.y"
+#line 1696 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, "^");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "^");
@@ -3446,7 +3452,7 @@ yyreduce:
     break;
 
   case 108:
-#line 1705 "grammar.y"
+#line 1706 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, "|");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "|");
@@ -3459,7 +3465,7 @@ yyreduce:
     break;
 
   case 109:
-#line 1715 "grammar.y"
+#line 1716 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(2) - (2)].expression), EXPRESSION_TYPE_INTEGER, "~");
 
@@ -3472,7 +3478,7 @@ yyreduce:
     break;
 
   case 110:
-#line 1725 "grammar.y"
+#line 1726 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, "<<");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, "<<");
@@ -3485,7 +3491,7 @@ yyreduce:
     break;
 
   case 111:
-#line 1735 "grammar.y"
+#line 1736 "grammar.y"
     {
         CHECK_TYPE((yyvsp[(1) - (3)].expression), EXPRESSION_TYPE_INTEGER, ">>");
         CHECK_TYPE((yyvsp[(3) - (3)].expression), EXPRESSION_TYPE_INTEGER, ">>");
@@ -3498,7 +3504,7 @@ yyreduce:
     break;
 
   case 112:
-#line 1745 "grammar.y"
+#line 1746 "grammar.y"
     {
         (yyval.expression) = (yyvsp[(1) - (1)].expression);
       }
@@ -3506,7 +3512,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 3510 "grammar.c"
+#line 3516 "grammar.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3720,6 +3726,6 @@ yyreturn:
 }
 
 
-#line 1750 "grammar.y"
+#line 1751 "grammar.y"
 
 
diff --git a/libyara/grammar.h b/libyara/grammar.h
index a2d3a3e..e63f102 100644
--- a/libyara/grammar.h
+++ b/libyara/grammar.h
@@ -84,8 +84,8 @@
      _LT_ = 300,
      _SHIFT_RIGHT_ = 301,
      _SHIFT_LEFT_ = 302,
-     _NOT_ = 303,
-     UNARY_MINUS = 304
+     UNARY_MINUS = 303,
+     _NOT_ = 304
    };
 #endif
 /* Tokens.  */
@@ -134,15 +134,15 @@
 #define _LT_ 300
 #define _SHIFT_RIGHT_ 301
 #define _SHIFT_LEFT_ 302
-#define _NOT_ 303
-#define UNARY_MINUS 304
+#define UNARY_MINUS 303
+#define _NOT_ 304
 
 
 
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 177 "grammar.y"
+#line 178 "grammar.y"
 {
   EXPRESSION      expression;
   SIZED_STRING*   sized_string;
diff --git a/libyara/grammar.y b/libyara/grammar.y
index 64cf4b0..79c9fdb 100644
--- a/libyara/grammar.y
+++ b/libyara/grammar.y
@@ -127,14 +127,15 @@ limitations under the License.
 
 %left _OR_
 %left _AND_
-%left '&' '|' '^'
-%left _LT_ _LE_ _GT_ _GE_ _EQ_ _NEQ_
+%left '|'
+%left '^'
+%left '&'
+%left _EQ_ _NEQ_
+%left _LT_ _LE_ _GT_ _GE_
 %left _SHIFT_LEFT_ _SHIFT_RIGHT_
 %left '+' '-'
 %left '*' '\\' '%'
-%right _NOT_
-%right '~'
-%left UNARY_MINUS
+%right _NOT_ '~' UNARY_MINUS
 
 %type <string> strings
 %type <string> string_declaration
diff --git a/yara-python/tests.py b/yara-python/tests.py
index 2c75cf7..4c719f1 100644
--- a/yara-python/tests.py
+++ b/yara-python/tests.py
@@ -342,10 +342,16 @@ class TestYara(unittest.TestCase):
 
         self.assertTrueRules([
             'rule test { condition: 0x55 | 0xAA == 0xFF }',
-            'rule test { condition: ~0xAA ^ 0x5A & 0xFF == 0x0F }',
+            'rule test { condition: ~0xAA ^ 0x5A & 0xFF == (~0xAA) ^ (0x5A & 0xFF) }',
             'rule test { condition: ~0x55 & 0xFF == 0xAA }',
             'rule test { condition: 8 >> 2 == 2 }',
-            'rule test { condition: 1 << 3 == 8 }'
+            'rule test { condition: 1 << 3 == 8 }',
+            'rule test { condition: 1 | 3 ^ 3 == 1 | (3 ^ 3) }'
+            ])
+            
+        self.assertFalseRules([
+            'rule test { condition: ~0xAA ^ 0x5A & 0xFF == 0x0F }',
+            'rule test { condition: 1 | 3 ^ 3 == (1 | 3) ^ 3}'
         ])
 
     def testStrings(self):

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/forensics/yara.git



More information about the forensics-changes mailing list