]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/parser.py
Move parser-related code and tests to parser/
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / parser.py
diff --git a/parser/parser.py b/parser/parser.py
new file mode 100644 (file)
index 0000000..c74eb78
--- /dev/null
@@ -0,0 +1,52 @@
+# Parse query
+
+from ply import lex, yacc
+
+literals = '()'
+
+tokens = ('NAME', 'AND_OP', 'OR_OP', 'NOT_OP')
+
+t_NAME = '[a-z][a-z0-9_]+'
+
+t_AND_OP = '&'
+
+t_OR_OP = r'\|'
+
+t_NOT_OP = '!'
+
+def t_error(t):
+    """Avoid warnings on stderr"""
+
+lexer = lex.lex()
+
+def p_expression_name(p):
+    """expression : NAME"""
+    p[0] = ('NAME', p[1])
+
+def p_expression_and(p):
+    """expression : expression AND_OP expression"""
+    p[0] = ('AND', p[1], p[3])
+
+def p_expression_not(p):
+    """expression : NOT_OP expression"""
+    p[0] = ('NOT', p[2])
+
+def p_expression_or(p):
+    """expression : expression OR_OP expression"""
+    p[0] = ('OR', p[1], p[3])
+
+def p_expression_parens(p):
+    """expression : '(' expression ')'"""
+    p[0] = ('PARENS', p[2])
+
+def p_error(p):
+    """Avoid warnings on stderr"""
+    yacc.restart()
+
+precedence = (
+    ('left', 'OR_OP'),
+    ('left', 'AND_OP'),
+    ('right', 'NOT_OP'),
+)
+
+parser = yacc.yacc()