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')
64 print parse('(foo || bar)')
65 print parse('(foo and !bar)')