Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8_Vsi_razom.doc
Скачиваний:
7
Добавлен:
10.09.2019
Размер:
347.65 Кб
Скачать

41 Генератор лексичних аналізаторів.(lex)

Програма LEX специфікації пізнавання символьних рядків й будує еквівалентні програми мовою С.виконується в 2 етапи:

  • спочатку з LEX – спеціфікації будується функція розпізнавач у LEX мовою С, яка обробляє вхідний файл відокремлюючи в ньому рядки (лексеми), належать мові.

При розпізнаванні лексеми виконується дія користувача, яка зв’язана з лексемою. Ця дія може формувати вихідний файл, закінчувати роботу в LEX повертаючи значення оператором return.

Порядок роботи лексичного аналізатора

Готується специфікація лексичног аналізатора.

У цій програмі міститься таблиця представлення діаграм переходів і стандартну програму, яка використовує таблицю для розпізнавання лексем.

Дії які зв’язані з регулярними виразами є фрагментами програми мови С, які переносяться у файл lex.yy.c. без змін.

42. Генератор синтаксичних аналізаторів.

Генератор синтаксичних аналізаторів YACC- це програма, яка за граматико створює синтаксичний аналізатор мовою с для реалізації детермінованого безповоротного несхідного алгоритму LR(1) аналізу цієї граматики. Вона будує магазинний автомат для здійснення аналізу граматики і будуються таблиці для керування автоматами.

Вхідними даними є продукції граматики, необхідні дії цієї функції, а також функції виведення низького рівня.

YACC-специфікація розміщується в окремому файлі. Структура така ж як у лексичного аналізатора:

<означення>

%%

<продукції>

%%

<функції користувача>

Термінальні і нетермінальні символи граматики (лексеми) у програмі відображаються окремими символами, як у мові с, або іменами, які повинні бути явно описані в розділі означень наступним чином:

% token <ім’я 1> < ім’я 2>… < ім’я n>

Можна використовувати коментарі

/* */, де можна викликати імена. Ім’я, неописане явно, вважається нетермінованим, воно має появитися у лівій частині хоча б однієї продукції. З усіх терміналів вибирається один- стартовий і описується:

% start <ім’я>

А: тіло ,

де А- не термінал, а тіло- послідовність де терміналів та лексем. Дії можуть повертати скалярні значення і використовувати значення, що повертаються іншими діями. Для лексем значення може повертати лексичний аналізатор.

Для повернення значення для присвоєння його псевдо змінній # {# # = 1}. Доступ до повернених значень здійснюється через псевдо змінні #1, #2, …

Наприклад, маємо:

a: b’-’d

#1=b; #2=’-’; #3=d.

43. Приклади застосування генераторыв.

Приклад

%%

[ _ \t]+#;

[ _ \t]+printf(“ ”);

Є 2 регулярні вирази:

1) пробіли і символ табуляції опускаються в кінці рядка вхідного файлу.

2) символи пробіл і табуляції, що повторюються 1 раз або більше у вхідному файлі, будуть замінені 1 пробілом.

Функція yylex генерується так, щоб при кожному розпізнаванні визначеного регулярного виразу викликалася зв’язана з ним дія користувача, а нерозпізнані ланцюжки символів копіювалися у вихідний файл. Для складних дій, коли треба знати розпізнаний регулярний вираз, в рядок yylex збирає його глобальну змінну текстового типу yy_text. Наприклад, для виводу розпізнаного рядка малих латинських літер можна записати:

[a-z]+printf(“%S”, yy_text)

Досить часто треба знати не рядок, а довжину рядка. З цією метою yylex веде лічильник розпізнаних символів даним регулярним виразом.

Наприклад, є правило:

[a-z]+ {words++; char+=yyleng;}

Якщо появиться кінець вхідного файлу, ф-ція yyleng викликає ф-цію yywrap(). Якщо ця ф-ція повертає 1, то yylex обробляє кінець файлу звичайним чином. А якщо потрібно продовжити роботу, то ф-ція yywrap() має повертати 0.

19

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]