]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blob - parser/parser.py
1fb9903c62ee93794a22925678df963c728d4f2c
[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 t_ignore = '[ \t]+'
18
19 def t_error(t):
20     """Avoid warnings on stderr"""
21
22 lexer = lex.lex()
23
24 def p_expression_name(p):
25     """expression : NAME"""
26     p[0] = ('NAME', p[1])
27
28 def p_expression_and_and(p):
29     """expression : expression AND_OP AND_OP expression"""
30     p[0] = ('AND', p[1], p[4])
31
32 def p_expression_and(p):
33     """expression : expression AND_OP expression"""
34     p[0] = ('AND', p[1], p[3])
35
36 def p_expression_not(p):
37     """expression : NOT_OP expression"""
38     p[0] = ('NOT', p[2])
39
40 def p_expression_or_or(p):
41     """expression : expression OR_OP OR_OP expression"""
42     p[0] = ('OR', p[1], p[4])
43
44 def p_expression_or(p):
45     """expression : expression OR_OP expression"""
46     p[0] = ('OR', p[1], p[3])
47
48 def p_expression_parens(p):
49     """expression : '(' expression ')'"""
50     p[0] = ('PARENS', p[2])
51
52 def p_error(p):
53     """Avoid warnings on stderr"""
54     yacc.restart()
55
56 precedence = (
57     ('left', 'OR_OP'),
58     ('left', 'AND_OP'),
59     ('right', 'NOT_OP'),
60 )
61
62 parser = yacc.yacc()