Repository: 15five/scim2-filter-parser

Issue:
Issue when using multiple "or" or "and"
Hi,

I am facing an issue, where the query having two or more "and" or more than two "or" is failing.
Have a look at examples below: - 

1)```"displayName co \"username\" or nickName co \"username\" or userName co \"username\""```
   ```"displayName co \"username\" and nickName co \"username\" and userName co \"username\""```

the two queries fails giving ,
```scim2_filter_parser.parser.SCIMParserError: Parsing error at: Token(type='OR', value='or', lineno=1, index=52)```
 
notice above queries are having either only "or" or "and".

2)```"displayName co \"username\" and nickName co \"username\" or userName co \"username\""```
but this query works.


Discussion:

Patch:
diff --git a/src/scim2_filter_parser/parser.py b/src/scim2_filter_parser/parser.py
index 516f65d..12c693e 100644
--- a/src/scim2_filter_parser/parser.py
+++ b/src/scim2_filter_parser/parser.py
@@ -110,9 +110,8 @@ class SCIMParser(Parser):
     #       which takes precedence over "or"
     #   3.  Attribute operators
     precedence = (
-        ('nonassoc', OR),  # noqa F821
-        ('nonassoc', AND), # noqa F821
-        ('nonassoc', NOT), # noqa F821
+        ('left', OR, AND),  # noqa F821
+        ('right', NOT), # noqa F821
     )
 
     # FILTER    = attrExp / logExp / valuePath / *1"not" "(" FILTER ")"


Test patch:
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 4ff562c..19aa198 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -47,6 +47,24 @@ class BuggyQueries(TestCase):
         with self.assertRaises(parser.SCIMParserError):
             self.parser.parse(token_stream)
 
+    def test_g17_1_log_exp_order(self):
+        query = 'displayName co "username"  or nickName co "username"  or userName co "username"'
+
+        tokens = self.lexer.tokenize(query)
+        self.parser.parse(tokens)  # Should not raise error
+
+    def test_g17_2_log_exp_order(self):
+        query = 'displayName co "username" and nickName co "username" and userName co "username"'
+
+        tokens = self.lexer.tokenize(query)
+        self.parser.parse(tokens)  # Should not raise error
+
+    def test_g17_3_log_exp_order(self):
+        query = 'displayName co "username" and nickName co "username"  or userName co "username"'
+
+        tokens = self.lexer.tokenize(query)
+        self.parser.parse(tokens)  # Should not raise error
+
 
 class CommandLine(TestCase):
     def setUp(self):