mod_ctx_line.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """
  2. Модуль контекста prolet.
  3. Это главная конструкция языка
  4. """
  5. from lev0 import Logger
  6. class CtxLine:
  7. """
  8. Контекст каждого выражения.
  9. Основа всего языка.
  10. """
  11. def __init__(self, src: str | None = None) -> None:
  12. """
  13. Конструктор контекста
  14. @src - исходный код
  15. """
  16. self.__log = Logger("CtxLine")
  17. self.__log("")
  18. self.__line: str = ""
  19. self.__lst_param: list[str] = []
  20. if src is None:
  21. self.__log.error("Ошибка конструктора: строка кода отсутствует")
  22. exit(4)
  23. self.__param: str = ""
  24. self.__lst_ctx: list[CtxLine] = []
  25. self.__tail: str = src
  26. self.__strip_src()
  27. src = self.__tail
  28. # Отбор своего выражения
  29. lit = src[0]
  30. if lit != "(":
  31. self.__log.error(f"Это не начало контекста. Строка кода='{src}'")
  32. exit(5)
  33. src = src[1:]
  34. lit = src[0]
  35. while lit != ")":
  36. if lit != "(": # Простой перебор контекста со всеми переменными
  37. lit = src[0]
  38. if lit == ")":
  39. continue
  40. self.__line += lit
  41. src = src[1:]
  42. continue
  43. # Начался новый контекст
  44. ctx = CtxLine(src)
  45. self.__lst_ctx.append(ctx)
  46. src = ctx.tail
  47. lit = src[0]
  48. src = src[1:]
  49. # Остаток строки перебора
  50. self.__tail = src
  51. self.__strip_src()
  52. # self.__parse_to_call()
  53. def __parse_to_call(self) -> None:
  54. """
  55. Парсит строку контекста для выяснения команды
  56. """
  57. self.__lst_param = self.__line.split(" ")
  58. cmd: str = self.__lst_param[0]
  59. fnCmd = dict_cmd[cmd]
  60. if fnCmd is None:
  61. self.__log.error(f"Неизвестная команда='{cmd}'")
  62. def __strip_src(self) -> None:
  63. """
  64. Обрезает все литеры до открывающей скобки
  65. """
  66. src = self.__tail
  67. while len(src) > 0 and src[0] != "(":
  68. src = src[1:]
  69. self.__tail = src
  70. def run(self) -> None:
  71. """
  72. Исполняет свой контекст
  73. """
  74. self.__log(f"{self.__line}")
  75. @property
  76. def line(self) -> str:
  77. """
  78. Возвращает строку
  79. """
  80. return self.__line
  81. @property
  82. def param(self) -> str:
  83. """
  84. Возвращает параметр
  85. """
  86. return self.__param
  87. @property
  88. def tail(self) -> str:
  89. """
  90. Возвращает хвост исходного кода
  91. """
  92. return self.__tail