| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- """
- Модуль контекста 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
|