Priority of `not` raised.  It's now possible to write `not foo in bar`
as an alias to `foo not in bar` like in python.  Previously the grammar
required parentheses (`not (foo in bar)`) which was odd.

--HG--
branch : trunk
diff --git a/jinja2/parser.py b/jinja2/parser.py
index c607540..b6e23df 100644
--- a/jinja2/parser.py
+++ b/jinja2/parser.py
@@ -333,13 +333,19 @@
 
     def parse_and(self):
         lineno = self.stream.current.lineno
-        left = self.parse_compare()
+        left = self.parse_not()
         while self.stream.skip_if('name:and'):
-            right = self.parse_compare()
+            right = self.parse_not()
             left = nodes.And(left, right, lineno=lineno)
             lineno = self.stream.current.lineno
         return left
 
+    def parse_not(self):
+        if self.stream.current.test('name:not'):
+            lineno = self.stream.next().lineno
+            return nodes.Not(self.parse_not(), lineno=lineno)
+        return self.parse_compare()
+
     def parse_compare(self):
         lineno = self.stream.current.lineno
         expr = self.parse_add()
@@ -445,10 +451,6 @@
     def parse_unary(self):
         token_type = self.stream.current.type
         lineno = self.stream.current.lineno
-        if token_type == 'name' and self.stream.current.value == 'not':
-            self.stream.next()
-            node = self.parse_unary()
-            return nodes.Not(node, lineno=lineno)
         if token_type == 'sub':
             self.stream.next()
             node = self.parse_unary()