""" Инструменты языка и вспомогательные инструменты. """ from lev0 import Logger from lev1 import CtxLine class Lang: """ Главный класс языка """ def __init__(self) -> None: self.__log = Logger("Lang") self.__log("start") self.__src: str = "" self.__lst_ctx: list[CtxLine] = [] self.__start_file() self.__parse_to_ctx() self.__step = 0 def step(self) -> None: """ Шаг выполнения """ self.__log("step!") if self.__step == len(self.__lst_ctx): self.__log("Конец программы") self.__reset() ctx: CtxLine = self.__lst_ctx[self.__step] ctx.run() self.__step += 1 def __reset(self) -> None: """ Сброс состояния ВМ """ self.__step = 0 def __start_file(self) -> str: """ Читает стартовый файл """ self.__log("") try: f = open("./plt/main.plt", "r", encoding="utf-8") self.__src = f.read() f.close() except Exception as e: self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}") return self.__src @property def start_file(self) -> str: """ Содержимое стартового файла """ return self.__src def __parse_to_ctx(self) -> None: """ Парсинг контекстов программы """ self.__log("") src = self.__src while src != "": lit = src[0] if lit == "(": ctx = CtxLine(src) self.__lst_ctx.append(ctx) src = ctx.tail # Отладочный вывод for num in range(len(self.__lst_ctx)): ctx = self.__lst_ctx[num] self.__log(f"{num}: {ctx.line}")