| 
									
										
										
										
											2023-12-07 12:49:40 +00:00
										 |  |  | from parsing import ( | 
					
						
							|  |  |  |     InstDef, | 
					
						
							|  |  |  |     Macro, | 
					
						
							|  |  |  |     Pseudo, | 
					
						
							|  |  |  |     Family, | 
					
						
							|  |  |  |     Parser, | 
					
						
							|  |  |  |     Context, | 
					
						
							|  |  |  |     CacheEffect, | 
					
						
							|  |  |  |     StackEffect, | 
					
						
							| 
									
										
										
										
											2023-12-18 13:16:45 +00:00
										 |  |  |     InputEffect, | 
					
						
							| 
									
										
										
										
											2023-12-07 12:49:40 +00:00
										 |  |  |     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 |