From 9d22f4f705db6a30fa2d49fdc074b901ec3cb3dc Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Sat, 21 Jun 2014 23:27:27 +0400 Subject: [PATCH] Allow '||' --- ChangeLog | 2 +- TODO | 4 ++-- parser/grammar | 3 ++- parser/parser.py | 4 ++++ parser/test_parser.py | 7 +++++-- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e6ffcb8..30d3438 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ Version 0.3 (2014-06-??) - Allow '&&'. + Allow '&&' and '||'. Version 0.2 (2014-06-06) diff --git a/TODO b/TODO index 312cfd3..12fe231 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ -Allow ' and ' and ' AND '. +Allow ' AND ' and ' and '. -Allow '||', ' or ' and ' OR '. +Allow ' OR ' and ' or '. Allow 'NOT ' and 'not '. diff --git a/parser/grammar b/parser/grammar index 17d3098..0017a96 100644 --- a/parser/grammar +++ b/parser/grammar @@ -4,7 +4,7 @@ # TAG - search blog posts that contain the tag; # !TAG - search blog posts that don't contain the tag; # TAG && TAG, TAG & TAG - search blog posts that contain both tags; -# TAG | TAG - search blog posts that contain any of the tags; +# TAG || TAG, TAG | TAG - search blog posts that contain any of the tags; # Parentheses are allowed to group expressions: # TAG & (TAG | TAG) # !(TAG | TAG) @@ -25,6 +25,7 @@ SP1 : '[ \t]+' expression : NAME | expression AND_OP AND_OP expression | expression AND_OP expression + | expression OR_OP OR_OP expression | expression OR_OP expression | NOT_OP expression | '(' expression ')' diff --git a/parser/parser.py b/parser/parser.py index 38c4cd2..1fb9903 100644 --- a/parser/parser.py +++ b/parser/parser.py @@ -37,6 +37,10 @@ def p_expression_not(p): """expression : NOT_OP expression""" p[0] = ('NOT', p[2]) +def p_expression_or_or(p): + """expression : expression OR_OP OR_OP expression""" + p[0] = ('OR', p[1], p[4]) + def p_expression_or(p): """expression : expression OR_OP expression""" p[0] = ('OR', p[1], p[3]) diff --git a/parser/test_parser.py b/parser/test_parser.py index a8d5227..628c984 100755 --- a/parser/test_parser.py +++ b/parser/test_parser.py @@ -21,11 +21,14 @@ class TestParser(unittest.TestCase): self.assertEqual(parser.parse('!(xxx & yyy)'), ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) + self.assertEqual(parser.parse('!xxx&yyy&zzz|ooo'), + ('OR', ('AND', ('AND', ('NOT', ('NAME', 'xxx')), ('NAME', 'yyy')), ('NAME', 'zzz')), ('NAME', 'ooo')) + ) self.assertEqual(parser.parse('!(xxx && yyy)'), ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) - self.assertEqual(parser.parse('!xxx&yyy&zzz|ooo'), - ('OR', ('AND', ('AND', ('NOT', ('NAME', 'xxx')), ('NAME', 'yyy')), ('NAME', 'zzz')), ('NAME', 'ooo')) + self.assertEqual(parser.parse('!(xxx || yyy)'), + ('NOT', ('PARENS', ('OR', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) def test_05_bad_expression(self): -- 2.39.2