30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
import pyparsing as pp
|
|
|
|
class node(object):
|
|
def __init__(self, args):
|
|
if len(args) == 3 and args[1] == '=':
|
|
self.a, self.b, self.c = args[0], None, args[2]
|
|
elif (args[1], args[3], args[4]) == ('[', ']', '='):
|
|
self.a, self.b, self.c = args[0], args[2], args[5]
|
|
else:
|
|
self.a, self.b, self.c = None, args[1], args[4]
|
|
|
|
def __repr__(self): return "{%s[%s]=%s}" % (self.a, self.b, self.c)
|
|
|
|
word = pp.Word(pp.alphanums+"_"+" "+"/"+"#")
|
|
quoted = pp.Combine("'" + word + "'")
|
|
bool_value = pp.CaselessLiteral("TRUE") | pp.CaselessLiteral("FALSE")
|
|
ref_val = word + "[" + word + "]"
|
|
rhs = quoted | bool_value | ref_val | word
|
|
stmt = (pp.Optional(word) + pp.Optional("[" + word + "]") + "=" + rhs).setParseAction(node)
|
|
bool_op = pp.CaselessLiteral("AND") | pp.CaselessLiteral("OR")
|
|
grammar = stmt + pp.Optional(pp.OneOrMore(bool_op + stmt))
|
|
|
|
def parse(exprs):
|
|
def _():
|
|
for expr in exprs.split(";"):
|
|
expr = "".join(c for c in expr if c not in "\r\n")
|
|
if not expr: continue
|
|
yield grammar.parseString(expr)
|
|
return list(_())
|