mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from parsing import (
 | |
|     InstDef,
 | |
|     Macro,
 | |
|     Pseudo,
 | |
|     Family,
 | |
|     Parser,
 | |
|     Context,
 | |
|     CacheEffect,
 | |
|     StackEffect,
 | |
|     InputEffect,
 | |
|     OpName,
 | |
|     AstNode,
 | |
| )
 | |
| 
 | |
| 
 | |
| def prettify_filename(filename: str) -> str:
 | |
|     # Make filename more user-friendly and less platform-specific,
 | |
|     # it is only used for error reporting at this point.
 | |
|     filename = filename.replace("\\", "/")
 | |
|     if filename.startswith("./"):
 | |
|         filename = filename[2:]
 | |
|     if filename.endswith(".new"):
 | |
|         filename = filename[:-4]
 | |
|     return 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
 | 
