17db96d56Sopenharmony_ciimport re
27db96d56Sopenharmony_ciimport textwrap
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_cifrom ._regexes import _ind, STRING_LITERAL
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cidef parse(text, anon_name):
87db96d56Sopenharmony_ci    context = None
97db96d56Sopenharmony_ci    data = None
107db96d56Sopenharmony_ci    for m in DELIMITER_RE.find_iter(text):
117db96d56Sopenharmony_ci        before, opened, closed = m.groups()
127db96d56Sopenharmony_ci        delim = opened or closed
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci        handle_segment = HANDLERS[context][delim]
157db96d56Sopenharmony_ci        result, context, data = handle_segment(before, delim, data)
167db96d56Sopenharmony_ci        if result:
177db96d56Sopenharmony_ci            yield result
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciDELIMITER = textwrap.dedent(rf'''
217db96d56Sopenharmony_ci    (
227db96d56Sopenharmony_ci        (?:
237db96d56Sopenharmony_ci            [^'"()\[\]{};]*
247db96d56Sopenharmony_ci            {_ind(STRING_LITERAL, 3)}
257db96d56Sopenharmony_ci        }*
267db96d56Sopenharmony_ci        [^'"()\[\]{};]+
277db96d56Sopenharmony_ci     )?  # <before>
287db96d56Sopenharmony_ci    (?:
297db96d56Sopenharmony_ci        (
307db96d56Sopenharmony_ci            [(\[{]
317db96d56Sopenharmony_ci         )  # <open>
327db96d56Sopenharmony_ci        |
337db96d56Sopenharmony_ci        (
347db96d56Sopenharmony_ci            [)\]};]
357db96d56Sopenharmony_ci         )  # <close>
367db96d56Sopenharmony_ci     )?
377db96d56Sopenharmony_ci    ''')
387db96d56Sopenharmony_ciDELIMITER_RE = re.compile(DELIMITER, re.VERBOSE)
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci_HANDLERS = {
417db96d56Sopenharmony_ci    None: {  # global
427db96d56Sopenharmony_ci        # opened
437db96d56Sopenharmony_ci        '{': ...,
447db96d56Sopenharmony_ci        '[': None,
457db96d56Sopenharmony_ci        '(': None,
467db96d56Sopenharmony_ci        # closed
477db96d56Sopenharmony_ci        '}': None,
487db96d56Sopenharmony_ci        ']': None,
497db96d56Sopenharmony_ci        ')': None,
507db96d56Sopenharmony_ci        ';': ...,
517db96d56Sopenharmony_ci    },
527db96d56Sopenharmony_ci    '': {
537db96d56Sopenharmony_ci    },
547db96d56Sopenharmony_ci}
55