подальшої обробки. br/>В
Рисунок 3 - Місце синтаксичного аналізатора в моделі компілятора
Існують різні форми проміжного представлення програми, наприклад, трійчастий код або абстрактне синтаксичне дерево. У даному випадку використовується абстрактне синтаксичне дерево. p align="justify"> Методи, зазвичай вживані в компіляторах, можна класифікувати як спадні (зверху вниз - top-down) або висхідні (знизу вгору - bottom-up). Як випливає з назв, низхідні синтаксичні аналізатори будують дерево розбору від кореня і листю, тоді як висхідні починають з листя і йдуть до кореня. В обох випадках вхідний потік синтаксичного аналізатора сканується посимвольний зліва направо. p align="justify"> Найбільш ефективні спадні і висхідні методи працюють тільки з підкласами граматик, проте деякі з цих класів, такі як LL-і LR-граматики, достатньо виразні для опису основних синтаксичних конструкцій мов програмування. Реалізовані вручну синтаксичні аналізатори частіше працюють з LL-граматиками; наприклад, предикативне підхід працює з LL-граматиками. Синтаксичні аналізатори для більшого класу LR-граматик зазвичай створюються за допомогою автоматизованих інструментів. p align="justify"> Виходом синтаксичного аналізатора є деяке уявлення дерева розбору потоку токенів від лексичного аналізатора. На практиці є безліч завдань, які можуть супроводжувати процес розбору, такі як збір інформації про різні токенах в таблицю символів, виконання перевірки типів і інших видів семантичного аналізу, а також генерація проміжного коду. br/>
Алгоритм роботи синтаксичного аналізатора
Створено структуру TLexeme, мінлива curr_par типу cell, до неї записуються дані з масиву, який передає лексичний аналізатор. З змінної curr_cell дані переписуються в масив Lexemes. Далі працюємо тільки з масивом Lexemes. br/>
struct TLexeme
{String type;// тип токенаbody;// сам токенposition;// рядок
}; * Lexemes;// Знайдені лексеми: тип, тіло, строкаcurr_par;// об'єкт структури (сама структура в 1.h)
int Number = Form1-> scaner_result.size ();// передаємо кількість лексем = new TLexeme [Number];// нейденние лексеми (int i = 0, j = 0; i
{//в "рядок" переміщаємо дані з ВЕЛИКОГО масиву
curr_par = Form1-> scaner_result [j];
// відразу записуємо в новий
Lexemes [j]. type = curr_par.type;
Lexemes [j]. body = curr_par.value; [j]. position = curr_par.str; + +;
}
Далі по циклу перевіряємо приналежність лексеми до якої-небудь синтаксичної конструкції.
Якщо лексема належить конструкції, записуємо її в корінь, одержуємо необхідні параметри, для тіла, якщо це цикл, структура, функція (тобто для...