1 #! /usr/bin/env python3
5 from lark import Lark, Transformer
8 class TagsTransformer(Transformer):
9 def and_expression(self, items):
13 right = self.and_expression(items[2:])
14 return ('AND', left, right)
16 def or_expression(self, items):
20 right = self.or_expression(items[2:])
21 return ('OR', left, right)
23 def not_expression(self, items):
24 return ('NOT', items[1])
26 def expression_parens(self, items):
27 return ('PARENS', items[0])
30 return ('NAME', name[0].value)
39 parser_dir = os.path.dirname(__file__)
40 with open(os.path.join(parser_dir, 'grammar.ebnf'), 'rt') as grammar_file:
41 grammar_text = grammar_file.read()
42 grammar_lines = [line for line in grammar_text.splitlines()
43 if not line.startswith('#')]
44 grammar_text = '\n'.join(grammar_lines)
45 _grammar = Lark(grammar_text)
51 tree = _grammar.parse(input)
52 return TagsTransformer().transform(tree)
55 if __name__ == '__main__':
59 print(parse('not test'))
60 print(parse('foo or bar'))
61 print(parse('foo && bar'))
62 print(parse('Foo && bar && baz'))
63 print(parse('!foo && bar && baz'))
64 print(parse('(test)'))
65 print(parse('(foo || bar)'))
66 print(parse('(foo and !bar)'))
67 print(parse(u'(Тест или тест)'))