mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			56 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from parsing import ( | ||
|  |     InstDef, | ||
|  |     Macro, | ||
|  |     Pseudo, | ||
|  |     Family, | ||
|  |     Parser, | ||
|  |     Context, | ||
|  |     CacheEffect, | ||
|  |     StackEffect, | ||
|  |     OpName, | ||
|  |     AstNode, | ||
|  | ) | ||
|  | from formatting import prettify_filename | ||
|  | 
 | ||
|  | 
 | ||
|  | BEGIN_MARKER = "// BEGIN BYTECODES //" | ||
|  | END_MARKER = "// END BYTECODES //" | ||
|  | 
 | ||
|  | 
 | ||
|  | def parse_files(filenames: list[str]) -> list[AstNode]: | ||
|  |     result: list[AstNode] = [] | ||
|  |     for filename in filenames: | ||
|  |         with open(filename) as file: | ||
|  |             src = file.read() | ||
|  | 
 | ||
|  |         psr = Parser(src, filename=prettify_filename(filename)) | ||
|  | 
 | ||
|  |         # Skip until begin marker | ||
|  |         while tkn := psr.next(raw=True): | ||
|  |             if tkn.text == BEGIN_MARKER: | ||
|  |                 break | ||
|  |         else: | ||
|  |             raise psr.make_syntax_error( | ||
|  |                 f"Couldn't find {BEGIN_MARKER!r} in {psr.filename}" | ||
|  |             ) | ||
|  |         start = psr.getpos() | ||
|  | 
 | ||
|  |         # Find end marker, then delete everything after it | ||
|  |         while tkn := psr.next(raw=True): | ||
|  |             if tkn.text == END_MARKER: | ||
|  |                 break | ||
|  |         del psr.tokens[psr.getpos() - 1 :] | ||
|  | 
 | ||
|  |         # Parse from start | ||
|  |         psr.setpos(start) | ||
|  |         thing_first_token = psr.peek() | ||
|  |         while node := psr.definition(): | ||
|  |             assert node is not None | ||
|  |             result.append(node)  # type: ignore[arg-type] | ||
|  |         if not psr.eof(): | ||
|  |             psr.backup() | ||
|  |             raise psr.make_syntax_error( | ||
|  |                 f"Extra stuff at the end of {filename}", psr.next(True) | ||
|  |             ) | ||
|  |     return result |