1 #! /usr/bin/env python3
4 from lark import Lark, Transformer
7 class TagsTransformer(Transformer):
8 def and_expression(self, items):
12 right = self.and_expression(items[2:])
13 return ('AND', left, right)
15 def or_expression(self, items):
19 right = self.or_expression(items[2:])
20 return ('OR', left, right)
22 def not_expression(self, items):
23 return ('NOT', items[1])
25 def expression_parens(self, items):
26 return ('PARENS', items[0])
29 return ('NAME', name[0].value)
38 parser_dir = os.path.dirname(__file__)
39 with open(os.path.join(parser_dir, 'grammar.ebnf'), 'rt') as grammar_file:
40 grammar_text = grammar_file.read()
41 grammar_lines = [line for line in grammar_text.splitlines()
42 if not line.startswith('#')]
43 grammar_text = '\n'.join(grammar_lines)
44 _grammar = Lark(grammar_text)
50 tree = _grammar.parse(input)
51 return TagsTransformer().transform(tree)
54 if __name__ == '__main__':
58 print(parse('not test'))
59 print(parse('foo or bar'))
60 print(parse('foo && bar'))
61 print(parse('foo && bar && baz'))
62 print(parse('!foo && bar && baz'))
63 print(parse('(test)'))
64 print(parse('(foo || bar)'))
65 print(parse('(foo and !bar)'))