Просмотр исходного кода

SVI Добавление графики и логики

SVI 3 месяцев назад
Родитель
Сommit
dfb81da40b

+ 2 - 2
lev1/__init__.py

@@ -2,6 +2,6 @@
 Базовые компоненты языка
 Базовые компоненты языка
 """
 """
 
 
-from .pak_context import Context
+from .pak_ctx_line import CtxLine
 
 
-__all__ = ["Context"]
+__all__ = ["CtxLine"]

+ 0 - 7
lev1/pak_context/__init__.py

@@ -1,7 +0,0 @@
-""""
-Пакет контекста языка
-"""
-
-from .mod_context import Context
-
-__all__ = ["Context"]

+ 0 - 67
lev1/pak_context/mod_context.py

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

+ 9 - 0
lev1/pak_ctx_base/__init__.py

@@ -0,0 +1,9 @@
+""""
+Базовый контекст языка.
+
+На нём строятся все контексты.
+"""
+
+from .mod_ctx_base import CtxBase
+
+__all__: list[str] = ["CtxBase"]

+ 30 - 0
lev1/pak_ctx_base/mod_ctx_base.py

@@ -0,0 +1,30 @@
+""""
+Базовый контекст языка.
+
+На нём строятся все контексты.
+"""
+
+
+class CtxBase:
+    """
+    Контекст языка
+    """
+
+    def __init__(self, name: str, parent: "CtxBase"):
+        assert name != "", "CtxBase.__init__(): name context is empty"
+        self.__name = name
+        self.__parent = parent
+
+    @property
+    def name(self) -> str:
+        """
+        Имя текущего контекста
+        """
+        return self.__name
+
+    @property
+    def parent(self) -> "CtxBase":
+        """
+        Родительский контекст
+        """
+        return self.__parent

+ 8 - 0
lev1/pak_ctx_int/__init__.py

@@ -0,0 +1,8 @@
+"""
+Контекст целого числа.
+Напрямую можно использовать только в контексте "асм".
+"""
+
+from .mod_ctx_int import CtxInt
+
+__all__ = ["CtxInt"]

+ 17 - 0
lev1/pak_ctx_int/mod_ctx_int.py

@@ -0,0 +1,17 @@
+"""
+Контекст целых чисел.
+Можно использовать только в родительском контексте "асм".
+"""
+
+from collections.abc import Callable
+
+
+class CtxInt:
+    def __init__(self):
+        self.__dict_cmd: dict[str, Callable[]] = {}
+
+    def new_int(self, lst: list[str]) -> None:
+        """
+        Создаёт новую целочисленную переменную в родительском контексте
+        """
+        

+ 7 - 0
lev1/pak_ctx_line/__init__.py

@@ -0,0 +1,7 @@
+""""
+Пакет контекста строки
+"""
+
+from .mod_ctx_line import CtxLine
+
+__all__ = ["CtxLine"]

+ 103 - 0
lev1/pak_ctx_line/mod_ctx_line.py

@@ -0,0 +1,103 @@
+"""
+Модуль контекста 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

+ 1 - 0
lev3/pak_app/mod_app.py

@@ -25,6 +25,7 @@ class ProletApp:
         Запуск приложения
         Запуск приложения
         """
         """
         self.__log.debug(msg="start")
         self.__log.debug(msg="start")
+        self.__lang.lbl_step=self.__gui.win_main.frm_vm.lblStep
 
 
         self.__gui.run()
         self.__gui.run()
         self.__log("end")
         self.__log("end")

+ 8 - 1
lev3/pak_gui/mod_gui.py

@@ -18,11 +18,18 @@ class Gui:
         self.__win_main = WinMain()
         self.__win_main = WinMain()
         self.txt_code = self.__win_main.frm_code.txt_code
         self.txt_code = self.__win_main.frm_code.txt_code
 
 
+    @property
+    def win_main(self) -> WinMain:
+        """
+        Возвращает главное окно приложения
+        """
+        return self.__win_main
+
     def set_fn_step(self, fn_step: Callable[[], None]) -> None:
     def set_fn_step(self, fn_step: Callable[[], None]) -> None:
         """
         """
         Установка функции для выполнения шага
         Установка функции для выполнения шага
         """
         """
-        self.__win_main.set_fn_step(fn_step)
+        self.__win_main.set_fn(fn_step)
 
 
     def run(self) -> None:
     def run(self) -> None:
         """
         """

+ 3 - 1
lev3/pak_gui/pak_win_main/mod_win_main.py

@@ -6,6 +6,7 @@ from collections.abc import Callable
 
 
 from tkinter import Tk
 from tkinter import Tk
 from lev0 import Logger
 from lev0 import Logger
+from .pak_frm_vm import FrmVm
 from .pak_frm_code import FrmCode
 from .pak_frm_code import FrmCode
 from .pak_frm_status import FrmStatus
 from .pak_frm_status import FrmStatus
 
 
@@ -22,9 +23,10 @@ class WinMain(Tk):
         self.title("Prolet")
         self.title("Prolet")
         self.geometry("1000x600")
         self.geometry("1000x600")
         self.__frm_status = FrmStatus(self)
         self.__frm_status = FrmStatus(self)
+        self.frm_vm = FrmVm(self)
         self.frm_code = FrmCode(self)
         self.frm_code = FrmCode(self)
 
 
-    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
+    def set_fn(self, fn_step: Callable[[], None]) -> None:
         """
         """
         Устанавливает функцию для передачи значения
         Устанавливает функцию для передачи значения
         """
         """

+ 1 - 1
lev3/pak_gui/pak_win_main/pak_frm_code/__init__.py

@@ -1,5 +1,5 @@
 """
 """
-Фрейм с кодом главного окна
+Фрейм с состоянием ВМ
 """
 """
 
 
 from .mod_frm_code import FrmCode
 from .mod_frm_code import FrmCode

+ 7 - 0
lev3/pak_gui/pak_win_main/pak_frm_vm/__init__.py

@@ -0,0 +1,7 @@
+"""
+Фрейм с кодом главного окна
+"""
+
+from .mod_frm_vm import FrmVm
+
+__all__ = ["FrmVm"]

+ 22 - 0
lev3/pak_gui/pak_win_main/pak_frm_vm/mod_frm_vm.py

@@ -0,0 +1,22 @@
+"""
+Форма статуса ВМ
+"""
+
+from tkinter import Label, Tk, Frame
+
+class FrmVm(Frame):
+    """
+    Форма ВМ главного окна
+    """
+
+    def __init__(self, root: Tk):
+        Frame.__init__(self, root, border=3, relief="sunken")
+        self.pack(fill="y", side="left")
+        self.lblStep = Label(self, text="step: 0", border=2, relief="raised")
+        self.lblStep.pack(fill="x")
+
+    def get_step(self, ) -> Label:
+        """
+        Возвращает ссылку на шаг программы
+        """
+        return self.lblStep

+ 34 - 7
lev3/pak_lang/mod_lang.py

@@ -3,7 +3,7 @@
 """
 """
 
 
 from lev0 import Logger
 from lev0 import Logger
-from lev1 import Context
+from lev1 import CtxLine
 
 
 
 
 class Lang:
 class Lang:
@@ -15,19 +15,34 @@ class Lang:
         self.__log = Logger("Lang")
         self.__log = Logger("Lang")
         self.__log("start")
         self.__log("start")
         self.__src: str = ""
         self.__src: str = ""
-        self.__lst_ctx: list[Context] = []
+        self.__lst_ctx: list[CtxLine] = []
+        self.__start_file()
+        self.__parse_to_ctx()
+        self.__step = 0
 
 
     def step(self) -> None:
     def step(self) -> None:
         """
         """
         Шаг выполнения
         Шаг выполнения
         """
         """
         self.__log("step!")
         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
 
 
-    @property
-    def start_file(self) -> str:
+    def __reset(self) -> None:
         """
         """
-        Содержимое стартового файла
+        Сброс состояния ВМ
         """
         """
+        self.__step = 0
+
+    def __start_file(self) -> str:
+        """
+        Читает стартовый файл
+        """
+        self.__log("")
         try:
         try:
             f = open("./plt/main.plt", "r", encoding="utf-8")
             f = open("./plt/main.plt", "r", encoding="utf-8")
             self.__src = f.read()
             self.__src = f.read()
@@ -36,7 +51,14 @@ class Lang:
             self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}")
             self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}")
         return self.__src
         return self.__src
 
 
-    def parse_ctx(self) -> None:
+    @property
+    def start_file(self) -> str:
+        """
+        Содержимое стартового файла
+        """
+        return self.__src
+
+    def __parse_to_ctx(self) -> None:
         """
         """
         Парсинг контекстов программы
         Парсинг контекстов программы
         """
         """
@@ -45,5 +67,10 @@ class Lang:
         while src != "":
         while src != "":
             lit = src[0]
             lit = src[0]
             if lit == "(":
             if lit == "(":
-                ctx = Context(src)
+                ctx = CtxLine(src)
                 self.__lst_ctx.append(ctx)
                 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}")

+ 5 - 1
plt/main.plt

@@ -1 +1,5 @@
-(уст 0 рег0)
+(цел нов 10 а)
+(цел нов 20 б)
+(цел слож а б)
+(цел рез в)
+(печать в)