import re import textwrap from ._regexes import _ind, STRING_LITERAL def parse(text, anon_name): context = None data = None for m in DELIMITER_RE.find_iter(text): before, opened, closed = m.groups() delim = opened or closed handle_segment = HANDLERS[context][delim] result, context, data = handle_segment(before, delim, data) if result: yield result DELIMITER = textwrap.dedent(rf''' ( (?: [^'"()\[\]{};]* {_ind(STRING_LITERAL, 3)} }* [^'"()\[\]{};]+ )? # (?: ( [(\[{] ) # | ( [)\]};] ) # )? ''') DELIMITER_RE = re.compile(DELIMITER, re.VERBOSE) _HANDLERS = { None: { # global # opened '{': ..., '[': None, '(': None, # closed '}': None, ']': None, ')': None, ';': ..., }, '': { }, }