того, що в {}) викликається рекурсія. p>
if (Lexemes [i]. body == "struct")
{add_tabs (dest, tabs); <<"struct" <<' n'; + +; i + +; (Lexemes [i]. type == "Ідентифікатор" ;)
{ tabs -;
{//i + +;
i = MakeBinTree (dest, tabs, tabs, i, 1, "@ # $% ^ & (", tecFN);// виклик рекурсії для того, що в {} + +;
// tabs -;
} (Lexemes [i]. type == "Ідентифікатор")// 18:48 додала умова, щоб виводилися об'єкти структури
{while (Lexemes [i]. type == "Ідентифікатор" | | Lexemes [i]. body == ",")
{if (Lexemes [i]. type == "Ідентифікатор")
{add_tabs (dest, tabs); <
} + +;
}
} -;
}
Спочатку дерево записується в текстовий файл, як тільки програма аналізує весь масив, дані з текстового файлу завантажуються в об'єкт TreeView.
Для запису об'єкта в текстовий файл використовується функція add_tabs.
void add_tabs (ofstream & dest, int tabs)
{//передаю рівень, йду по циклу ставлю табуляцію
for (int j = 0; j
dest <<' t';
}
В результаті розбору будується синтаксичне дерево Малюнок 4.
Синтаксичні помилки включають невірно поставлені крапки з комою або зайві відсутні дужки, відсутність умов (для оператора while), відсутність тіла (switch, while, do while), невірне колічесво параметрів (for), невизначений тип ( якщо змінна не була оголошена).
В
Рисунок 4 - Результат роботи синтаксичного аналізатора
В
Рисунок 5 - Результат роботи синтаксичного аналізатора із знайденими помилками
Семантичний аналіз
Семантичний аналіз - третя фаза компіляції. Так як на етапі синтаксичного аналізу немає достатньої інформації про типи, парсер перевіряє лише формальну коректність послідовності токенів. Завдання семантичного аналізу полягає в тому, щоб сконструювати користувача типи і проконтролювати відповідність типів в програмі. У разі, коли типи не збігаються, але можливо неявне приведення, семантичний аналізатор повинен вбудувати функції приведення типів в абстрактне синтаксичне дерево, отримане на вході. p align="justify"> Так як за фактом виконується не що інше, як обхід дерева, семантичний аналіз реалізується набором рекурсивних функцій для обходу блоків, абстрактного синтаксичного дерева і для перевірки коректності типу даних В«ЗаписВ», тому що він теж має деревоподібну структуру.
В