Skip to content

Repository files navigation

Лабораторная работа 5. Построение AST и семантический анализ

Название работы и автор

  • Работа: Семантический анализатор для конструкции if-else
  • Автор: Александр, АВТ-314
  • Вариант: 95

Цель работы

Изучить назначение семантического анализатора в компиляторе, построить абстрактное синтаксическое дерево (AST) и реализовать проверку контекстно-зависимых условий для конструкции условного оператора if-else.

Вариант задания

Анализируемая конструкция (язык Python-подобного подмножества):

if a > b:
    max = a;
else:
    max = b;
;

Поддерживаются and, or, not, скобки в условиях, сравнения, присваивания, идентификаторы и целые числа.

Контекстно-зависимые условия (семантические проверки)

Реализованы проверки в модуле semantic_analyzer.py:

  1. Уникальность идентификаторов в области видимости

    • Повторное объявление имени в том же блоке (then или else) фиксируется как ошибка.
    • Пример сообщения: Идентификатор "x" уже объявлен в текущей области видимости.
  2. Совместимость типов

    • Для присваивания проверяется соответствие типа правой части уже известному типу идентификатора.
    • Пример сообщения: Несовместимость типов: "x" имеет тип Int, получено Unknown.
  3. Допустимые значения

    • Для целых литералов проверяется диапазон Int32: [-2147483648; 2147483647].
    • Пример сообщения: Значение 3000000000 выходит за диапазон Int32 [...].
  4. Использование идентификаторов

    • Идентификатор в выражении (условие/правая часть присваивания) должен быть объявлен ранее.
    • Пример сообщения: Идентификатор "a" используется до объявления.

Структура AST

Основные типы узлов:

  • IfNode — корень конструкции if-else.
  • CompareNode — операция сравнения (>, <, ==, ...).
  • LogicalBinaryNode — логические and / or.
  • NotNode — логическое отрицание.
  • AssignNode — оператор присваивания.
  • IdentifierNode — идентификатор.
  • IntLiteralNode — целочисленный литерал.

Текстовый вывод AST выполняется в формате дерева (├──, └──) и отображается в окне результатов после успешного синтаксического разбора.

Формат вывода программы

После запуска анализатора (F5) выводятся:

  1. Результаты лексического анализа.
  2. Результаты синтаксического анализа.
  3. AST (если синтаксических ошибок нет).
  4. Семантические ошибки с позицией:
    • строка N, позиция M
  5. Количество семантических ошибок отдельной строкой.

Тестовые примеры

  1. Корректный ввод
    if a > b:
    max = a;
    else:
    max = b;
    ;
  2. Повторное объявление
    if a > b:
    x = a;
    else:
    x = b;
    ;
  3. Несовместимость/неизвестный тип
    if a > b:
    x = y;
    else:
    x = 10;
    ;
  4. Выход за диапазон
    if a > b:
    x = 3000000000;
    else:
    x = 1;
    ;
  5. Использование необъявленного идентификатора
    if u > v:
    x = u;
    else:
    x = v;
    ;

Инструкция по запуску

  1. Установить зависимости:
    pip install -r requirements.txt
  2. Запустить приложение:
    python main.py
  3. Ввести тестовую строку в редакторе и нажать F5 (или меню Пуск -> Запуск анализатора).

Дополнительное задание: графическая визуализация AST

В проект добавлена отдельная функция визуализации AST в графическом виде.

Использованные графические средства

  • PyQt6 QGraphicsScene — сцена для рисования графа AST.
  • PyQt6 QGraphicsView — окно просмотра графа (поддержка прокрутки и масштаба).
  • QPainterPath.addRoundedRect + QGraphicsScene.addPath — закругленные прямоугольные блоки узлов AST.
  • addLine — ребра структуры «родитель -> потомок».

Как открыть граф AST

  1. Запустить анализатор (F5) на корректном входе без синтаксических ошибок.
  2. Нажать кнопку/пункт Показать AST (F6).
  3. Откроется отдельное графическое окно с деревом.

Что отображается в узлах

  • Тип узла: IfNode, CompareNode, AssignNode, IdentifierNode, IntLiteralNode и т.д.
  • Ключевые атрибуты узла: например operator, name, value.

Тестовые примеры для отчета (со скриншотами AST)

  1. Базовый if-else:
    if a > b:
    max = a;
    else:
    max = b;
    ;
  2. Условие с логическими операциями:
    if (a > b) and not (c == d):
    max = a;
    else:
    max = b;
    ;
  3. Условие с or:
    if a > b or c < d:
    x = 1;
    else:
    x = 2;
    ;

Скриншоты работы

Примеры

Примеры

Примеры

Примеры

Примеры

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages