2 from parsimonious import Grammar, NodeVisitor
11 parser_dir = os.path.dirname(__file__)
12 with open(os.path.join(parser_dir, 'grammar.ebnf'), 'rt') as grammar_file:
13 grammar_text = grammar_file.read()
14 _grammar = Grammar(grammar_text)
20 return _grammar.parse(input)
23 def cleanup_children(visited_children):
24 children = [c for c in visited_children if c]
25 if len(children) == 1:
31 class Compiler(NodeVisitor):
32 def generic_visit(self, node, visited_children):
33 return cleanup_children(visited_children)
35 def visit_or_expression(self, node, visited_children):
36 return ('OR', visited_children[0], visited_children[2])
38 def visit_and_expression(self, node, visited_children):
39 return ('AND', visited_children[0], visited_children[2])
41 def visit_not_expression(self, node, visited_children):
42 return ('NOT', visited_children[2])
44 def visit_parens_expression(self, node, visited_children):
45 return ('PARENS', visited_children[2])
47 def visit_name(self, node, visited_children):
48 return ('NAME', node.text)
52 if isinstance(tree, str):
54 return Compiler().visit(tree)