Лексический анализатор
Лексический анализатор предполагает разбиение слов и символов входного кода на токены (классификаторы), которые будут записаны в массив токенов.
например, строка
должна будет записана в массив токенов в виде:
Код:
|
[
[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".
Синтез кода
Проверенное семантическим анализом дерево должно быть свернуто в программу на выходном языке Питон.