mod_lang.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. """
  2. Инструменты языка и вспомогательные инструменты.
  3. """
  4. from lev0 import Logger
  5. from lev1 import CtxLine
  6. class Lang:
  7. """
  8. Главный класс языка
  9. """
  10. def __init__(self) -> None:
  11. self.__log = Logger("Lang")
  12. self.__log("start")
  13. self.__src: str = ""
  14. self.__lst_ctx: list[CtxLine] = []
  15. self.__start_file()
  16. self.__parse_to_ctx()
  17. self.__step = 0
  18. def step(self) -> None:
  19. """
  20. Шаг выполнения
  21. """
  22. self.__log("step!")
  23. if self.__step == len(self.__lst_ctx):
  24. self.__log("Конец программы")
  25. self.__reset()
  26. ctx: CtxLine = self.__lst_ctx[self.__step]
  27. ctx.run()
  28. self.__step += 1
  29. def __reset(self) -> None:
  30. """
  31. Сброс состояния ВМ
  32. """
  33. self.__step = 0
  34. def __start_file(self) -> str:
  35. """
  36. Читает стартовый файл
  37. """
  38. self.__log("")
  39. try:
  40. f = open("./plt/main.plt", "r", encoding="utf-8")
  41. self.__src = f.read()
  42. f.close()
  43. except Exception as e:
  44. self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}")
  45. return self.__src
  46. @property
  47. def start_file(self) -> str:
  48. """
  49. Содержимое стартового файла
  50. """
  51. return self.__src
  52. def __parse_to_ctx(self) -> None:
  53. """
  54. Парсинг контекстов программы
  55. """
  56. self.__log("")
  57. src = self.__src
  58. while src != "":
  59. lit = src[0]
  60. if lit == "(":
  61. ctx = CtxLine(src)
  62. self.__lst_ctx.append(ctx)
  63. src = ctx.tail
  64. # Отладочный вывод
  65. for num in range(len(self.__lst_ctx)):
  66. ctx = self.__lst_ctx[num]
  67. self.__log(f"{num}: {ctx.line}")