import os import subprocess # ЭТИ ПУТИ НАДО ЗАДАТЬ ВРУЧНУЮ # *.l и *.y файлы из директории ANALYZERS_DIR ДОЛЖНЫ НАЗЫВАТЬСЯ как basename этой директории!!! ANALYZERS_DIR = r'C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials' FLEX_EXE_PATH = r"C:\tools\win_flex_bison\win_flex.exe" BISON_EXE_PATH = r"C:\tools\win_flex_bison\win_bison.exe" DEPENDENCY_LIST = [ r"C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\stack\stack.c" ] def main(): # Подготовка путей analyzer_name = os.path.basename(ANALYZERS_DIR) lexical_analyzer_path = fr"{ANALYZERS_DIR}\{analyzer_name}.l" syntaxic_analyzer_path = fr"{ANALYZERS_DIR}\{analyzer_name}.y" # Преобразование списка зависимостей в строку для gcc dependencies_str = ' '.join(DEPENDENCY_LIST) # Подготовка списка команд cmds = [ f'{FLEX_EXE_PATH} {lexical_analyzer_path}', f'{BISON_EXE_PATH} -d {syntaxic_analyzer_path}', fr'gcc lex.yy.c {analyzer_name}.tab.c {dependencies_str} -o {analyzer_name}.exe' ] # Исполнение команд с выводом for cmd in cmds: print(f"\n\033[1mExecuting:\033[0m {cmd}") try: subprocess.run( cmd, shell=True, check=True, text=True, stderr=subprocess.PIPE ) print(f'\033[92mSuccessfully executed!\033[0m') except subprocess.CalledProcessError as e: print("\033[91mErrors:\033[0m") print(e.stderr) # Очистка промежуточных файлов (только если все команды успешны) for path in ['lex.yy.c', f'{analyzer_name}.tab.c', f'{analyzer_name}.tab.h']: try: os.remove(path) print(f"\033[1mRemoved:\033[0m {path}") except FileNotFoundError: pass if __name__ == "__main__": main()