mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			55 lines
		
	
	
	
		
			1,007 B
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
	
		
			1,007 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,
							 | 
						||
| 
								 | 
							
								        ';': ...,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '': {
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								}
							 |