55 lines
1007 B
Python
55 lines
1007 B
Python
|
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)}
|
||
|
}*
|
||
|
[^'"()\[\]{};]+
|
||
|
)? # <before>
|
||
|
(?:
|
||
|
(
|
||
|
[(\[{]
|
||
|
) # <open>
|
||
|
|
|
||
|
(
|
||
|
[)\]};]
|
||
|
) # <close>
|
||
|
)?
|
||
|
''')
|
||
|
DELIMITER_RE = re.compile(DELIMITER, re.VERBOSE)
|
||
|
|
||
|
_HANDLERS = {
|
||
|
None: { # global
|
||
|
# opened
|
||
|
'{': ...,
|
||
|
'[': None,
|
||
|
'(': None,
|
||
|
# closed
|
||
|
'}': None,
|
||
|
']': None,
|
||
|
')': None,
|
||
|
';': ...,
|
||
|
},
|
||
|
'': {
|
||
|
},
|
||
|
}
|