""" Модуль контекста prolet. Это главная конструкция языка """ from lev0 import Logger class CtxLine: """ Контекст каждого выражения. Основа всего языка. """ def __init__(self, src: str | None = None) -> None: """ Конструктор контекста @src - исходный код """ self.__log = Logger("CtxLine") self.__log("") self.__line: str = "" self.__lst_param: list[str] = [] if src is None: self.__log.error("Ошибка конструктора: строка кода отсутствует") exit(4) self.__param: str = "" self.__lst_ctx: list[CtxLine] = [] self.__tail: str = src self.__strip_src() src = self.__tail # Отбор своего выражения lit = src[0] if lit != "(": self.__log.error(f"Это не начало контекста. Строка кода='{src}'") exit(5) src = src[1:] lit = src[0] while lit != ")": if lit != "(": # Простой перебор контекста со всеми переменными lit = src[0] if lit == ")": continue self.__line += lit src = src[1:] continue # Начался новый контекст ctx = CtxLine(src) self.__lst_ctx.append(ctx) src = ctx.tail lit = src[0] src = src[1:] # Остаток строки перебора self.__tail = src self.__strip_src() # self.__parse_to_call() def __parse_to_call(self) -> None: """ Парсит строку контекста для выяснения команды """ self.__lst_param = self.__line.split(" ") cmd: str = self.__lst_param[0] fnCmd = dict_cmd[cmd] if fnCmd is None: self.__log.error(f"Неизвестная команда='{cmd}'") def __strip_src(self) -> None: """ Обрезает все литеры до открывающей скобки """ src = self.__tail while len(src) > 0 and src[0] != "(": src = src[1:] self.__tail = src def run(self) -> None: """ Исполняет свой контекст """ self.__log(f"{self.__line}") @property def line(self) -> str: """ Возвращает строку """ return self.__line @property def param(self) -> str: """ Возвращает параметр """ return self.__param @property def tail(self) -> str: """ Возвращает хвост исходного кода """ return self.__tail