Показать сообщение отдельно
  #2 (permalink)  
Старый 29.05.2022, 16:51
Аспирант
Отправить личное сообщение для Дмитрий Луценко Посмотреть профиль Найти все сообщения от Дмитрий Луценко
 
Регистрация: 24.05.2022
Сообщений: 36

Лексический анализатор
Лексический анализатор предполагает разбиение слов и символов входного кода на токены (классификаторы), которые будут записаны в массив токенов.
например, строка
Код:
int summa = 0;
должна будет записана в массив токенов в виде:
Код:
[
[id:0, tokenName: 'L_TYPE', tokenValue: 'int' ],
[id:1, tokenName: 'L_VARIABLE', tokenValue: 'summa'],
[id:2, tokenName: 'L_EQUAL', tokenValue: '='],
[id:3, tokenName: 'L_NUM', tokenValue: '0'],
[id:4, tokenName: 'L_SEMICOLON', tokenValue: ';']
];
Синтаксический анализатор

Синтаксический анализатор: Полученный на лексическом анализе массив токенов необходимо преобразовать в виде абстрактного синтаксического дерева. Таким образом проверяется корректность структуры набора токенов, правильно ли строится блок кода.

L_TYPE L_VARIABLE (int abc) показывает синтаксически правильное объявление переменной.

L_VARIABLE L_TYPE (inty int) - является синтаксически некорректным, т.к L_VARIABLE ожидает либо "=", либо операций сравнения (<, >, ==, !=, и тд), либо ";".

А L_TYPE ожидает перед собой либо }, либо ";", а после себя только L_VAR (название переменной.)

Дерево таким образом построить не получится(ведь с точки зрения, к примеру, бинарного дерева, у которого должны быть заполнены и левая и правая ветвь, одна из ветвей будет пустовать, чего быть не должно).

Код:
int summa = 0;
int var_a = -90;
Варианты обхода синтаксического анализа могут быть нисходящим и восходящим (Выбирайте любой)
Итоговое дерево для объявления и инициализации переменных:


Семантический анализ.

Итоговое дерево после синтаксического анализа должно быть проверено на соответствие типов переменных и их значений.

Код:
summa = 0;
int var_a = "3334";
В ходе повторного обхода дерева Семантический анализатор должен проверить, summa ранее была ли объявлена или нет, соответствует ли целочисленный тип var_a со значением "3334".

Синтез кода

Проверенное семантическим анализом дерево должно быть свернуто в программу на выходном языке Питон.
Ответить с цитированием