- Работа: Семантический анализатор для конструкции
if-else - Автор: Александр, АВТ-314
- Вариант: 95
Изучить назначение семантического анализатора в компиляторе, построить абстрактное синтаксическое дерево (AST) и реализовать проверку контекстно-зависимых условий для конструкции условного оператора if-else.
Анализируемая конструкция (язык Python-подобного подмножества):
if a > b:
max = a;
else:
max = b;
;Поддерживаются and, or, not, скобки в условиях, сравнения, присваивания, идентификаторы и целые числа.
Реализованы проверки в модуле semantic_analyzer.py:
-
Уникальность идентификаторов в области видимости
- Повторное объявление имени в том же блоке (
thenилиelse) фиксируется как ошибка. - Пример сообщения:
Идентификатор "x" уже объявлен в текущей области видимости.
- Повторное объявление имени в том же блоке (
-
Совместимость типов
- Для присваивания проверяется соответствие типа правой части уже известному типу идентификатора.
- Пример сообщения:
Несовместимость типов: "x" имеет тип Int, получено Unknown.
-
Допустимые значения
- Для целых литералов проверяется диапазон
Int32: [-2147483648; 2147483647]. - Пример сообщения:
Значение 3000000000 выходит за диапазон Int32 [...].
- Для целых литералов проверяется диапазон
-
Использование идентификаторов
- Идентификатор в выражении (условие/правая часть присваивания) должен быть объявлен ранее.
- Пример сообщения:
Идентификатор "a" используется до объявления.
Основные типы узлов:
IfNode— корень конструкцииif-else.CompareNode— операция сравнения (>,<,==, ...).LogicalBinaryNode— логическиеand/or.NotNode— логическое отрицание.AssignNode— оператор присваивания.IdentifierNode— идентификатор.IntLiteralNode— целочисленный литерал.
Текстовый вывод AST выполняется в формате дерева (├──, └──) и отображается в окне результатов после успешного синтаксического разбора.
После запуска анализатора (F5) выводятся:
- Результаты лексического анализа.
- Результаты синтаксического анализа.
- AST (если синтаксических ошибок нет).
- Семантические ошибки с позицией:
строка N, позиция M
- Количество семантических ошибок отдельной строкой.
- Корректный ввод
if a > b: max = a; else: max = b; ;
- Повторное объявление
if a > b: x = a; else: x = b; ;
- Несовместимость/неизвестный тип
if a > b: x = y; else: x = 10; ;
- Выход за диапазон
if a > b: x = 3000000000; else: x = 1; ;
- Использование необъявленного идентификатора
if u > v: x = u; else: x = v; ;
- Установить зависимости:
pip install -r requirements.txt
- Запустить приложение:
python main.py
- Ввести тестовую строку в редакторе и нажать
F5(или менюПуск->Запуск анализатора).
В проект добавлена отдельная функция визуализации AST в графическом виде.
PyQt6 QGraphicsScene— сцена для рисования графа AST.PyQt6 QGraphicsView— окно просмотра графа (поддержка прокрутки и масштаба).QPainterPath.addRoundedRect+QGraphicsScene.addPath— закругленные прямоугольные блоки узлов AST.addLine— ребра структуры «родитель -> потомок».
- Запустить анализатор (
F5) на корректном входе без синтаксических ошибок. - Нажать кнопку/пункт
Показать AST(F6). - Откроется отдельное графическое окно с деревом.
- Тип узла:
IfNode,CompareNode,AssignNode,IdentifierNode,IntLiteralNodeи т.д. - Ключевые атрибуты узла: например
operator,name,value.
- Базовый
if-else:if a > b: max = a; else: max = b; ;
- Условие с логическими операциями:
if (a > b) and not (c == d): max = a; else: max = b; ;
- Условие с
or:if a > b or c < d: x = 1; else: x = 2; ;




