]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blob - parser/parser.py
c74eb78d21a29a5d33ec85af523ed85266b41796
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / parser.py
1 # Parse query
2
3 from ply import lex, yacc
4
5 literals = '()'
6
7 tokens = ('NAME', 'AND_OP', 'OR_OP', 'NOT_OP')
8
9 t_NAME = '[a-z][a-z0-9_]+'
10
11 t_AND_OP = '&'
12
13 t_OR_OP = r'\|'
14
15 t_NOT_OP = '!'
16
17 def t_error(t):
18     """Avoid warnings on stderr"""
19
20 lexer = lex.lex()
21
22 def p_expression_name(p):
23     """expression : NAME"""
24     p[0] = ('NAME', p[1])
25
26 def p_expression_and(p):
27     """expression : expression AND_OP expression"""
28     p[0] = ('AND', p[1], p[3])
29
30 def p_expression_not(p):
31     """expression : NOT_OP expression"""
32     p[0] = ('NOT', p[2])
33
34 def p_expression_or(p):
35     """expression : expression OR_OP expression"""
36     p[0] = ('OR', p[1], p[3])
37
38 def p_expression_parens(p):
39     """expression : '(' expression ')'"""
40     p[0] = ('PARENS', p[2])
41
42 def p_error(p):
43     """Avoid warnings on stderr"""
44     yacc.restart()
45
46 precedence = (
47     ('left', 'OR_OP'),
48     ('left', 'AND_OP'),
49     ('right', 'NOT_OP'),
50 )
51
52 parser = yacc.yacc()