
- •4.Основні частини компілятора.
- •5Лексичний аналіз роботи з таблицями
- •6. Синтаксичний та семантичний аналіз, дерева
- •7. Польський запис, тетради.
- •8. Формальне визначення мови, операції над мовами.
- •9. Граматики
- •11.Регулярний вираз
- •12) Нормальна форма Бекуса-Наура
- •13. Ієрархія Хомського
- •14. Регулярні граматики.
- •15. Скінченні автомати
- •16. Детерміновані і недетерміновані кінцеві автомати.
- •18. Побудова детермінованих кінцевих автоматів за недетермінованими кінцевими автоматами.
- •19. Програмування сканера.
- •20. Таблиці символів, хеш-функції, хеш-адресація
- •21. Колізія, ре хешування
- •23.Контекстно-выльны граматики.
- •24. Синтаксично-керований переклад
- •25. Переклад інфіксної форми запису у польську
- •26. Алгоритм синтаксично-керованого перекладу:
- •27. Автомати з магазинною пам’яттю
- •28. Операторні граматики
- •29.Алгоритм розборуоператорних грамматик.
- •37. Оптимізація булевих виразів, циклів.
- •38. Генерація коду. Скп на мову Асамблер.
- •39. Інтерпретатори, адресація, представлення ідентифікаторів.
- •40 Компілятор компіляторів.
- •41 Генератор лексичних аналізаторів.(lex)
- •42. Генератор синтаксичних аналізаторів.
- •43. Приклади застосування генераторыв.
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.