Розробка програм в системі UNIX

Система UNIX була задумана як середовище для розробки програм У цій главі будуть розглянуті найбільш корисні інструменти раз работки Як приклад візьмемо реальну програму – інтерпретатор мови програмування, подібного Бейсік Цей приклад добре ілюструє, які проблеми виникають при розробці великих програм Крім того, багато програм можуть бути представлені як транслятори, інтерпретують мову вхідних даних у деяку послідовність дій, і тому корисно розповісти про засоби розробки мов

У цьому розділі ми вивчимо:

• yacc – генератор синтаксичних аналізаторів, який за описа нию граматики мови генерує для нього синтаксичний ана лизатор

• make – програму, призначену для управління процесом компіляції складних програм

• lex – програму для створення лексичних аналізаторів, аналогічну yacc

Хотілося б також звернути увагу на особливості реалізації подібних проектів, буде зазначено, що починати треба з невеликої працюючої програми і поступово розширювати її буде описана Евола ція мови і розказано про засоби, використаних при реалізації

Процес розробки мови проведемо в шість етапів, на кожному з яких буде отриманий логічно закінчений результат, що має самостійну цінність Ці етапи грунтуються на реальній послідовності написання програми

1 Калькулятор, що виконує чотири арифметичні дії – +,

-, *, / – Над числами з плаваючою точкою, з урахуванням дужок Кожне

вираз друкується на окремому рядку, результат виводиться негайно

2 Змінні з іменами від a до z Унарний мінус і обробка неко торих помилок

3 Імена змінних довільної довжини, вбудовані функції sin,

exp і т п, корисні константи, такі як π (записується як PI

через обмежені типографських можливостей), і оператор віз-

ведення в ступінь

4 Внутрішні зміни: замість виконання «на льоту» генерується код для всіх виразів, який потім виконується Нових функцій немає, але закладається основа для п 5

5 Оператори управління: оператори if-else і while, обєднання операторів в блоки фігурними дужками, оператори порівняння>,

<= Та інші.

6 Рекурсивні функції та процедури, які беруть аргументи

Оператори введення і виведення рядків і чисел

Одержаний мову описаний в розділі 9, де на його прикладі розглянуто програмне забезпечення для підготовки документів Довідкове керівництво знаходиться в додатку 2

Це досить довга голова, так як написання нетривіальною програми вимагає уваги до дуже багатьох деталей Передбачається, що читач знайомий з мовою Сі і має під рукою другий том спра кувального керівництва по UNIX, тому що в цій книзі просто не хва тит місця для пояснення всіх нюансів Проявіть завзятість і будьте готові перечитати главу двічі Повний текст остаточної версії наведено у додатку 3 – так легше побачити, як скомпонована програма

Автори витратили чимало часу, обговорюючи, як назвати цю мову, але так і не придумали йому гідного імені Ми зупинилися на назві hoc (high-order calculator – високоорганізований калькулятор) Відповідно, версії називаються hoc1, hoc2 і т д

Етап 1: Калькулятор, що виконує чотири операції

У цьому розділі розглянуто програму hoc1, що виконує практично ті ж дії, що і кишеньковий калькулятор, але поступається йому в мобільності Вона виконує тільки чотири дії: +, -, * і /, але зате обробляє дужки довільної глибини вкладеності, що доступно не всім кишеньковим калькуляторам Якщо після введення виразу натиснута клавіша RETURN, Результат обчислень зявляється на наступному рядку:

$ hoc1 4*3*2

24

(1+2)  * (3+4)

21

1/2 355/113

-3-4

05

31415929

hoc1:  syntax  error is on line 5   Унарний мінус поки не реалізований

$

Граматика

З тих пір як для опису Алгола була використана форма Бекуса-Наура, мови описуються за допомогою формальних граматик Абстрактне уявлення граматики hoc1 просте і коротке:

list:        expr  \n

list  expr  \n expr:             NUMBER

expr  + expr expr  – expr expr  * expr expr  / expr

( expr  )

Іншими словами, список (list) складається з послідовності виразів (expr), кожне з яких закінчується символом нового рядка (\ n) Вираз може бути числом або парою чисел з оператором між ними або виразом в дужках

Це неповний опис Серед іншого, в ньому відсутнє визначення пріоритетів та асоціативності операторів, немає і розяснення смис ла структурних компонентів І хоча список визначений у термінах вираження, а вираз – в термінах NUMBER, само NUMBER ніде не визначено Ці деталі необхідно уточнити при переході від схематичного представлення до працюючій програмі

Огляд yacc

Програма yacc – це генератор синтаксичних аналізаторів1, тобто програма, що перетворює формальний опис граматики мови, подібне до наведеного вище, в програму синтаксичного

1 Імя yacc – це абревіатура «yet another compiler-compiler» (ще один ком пілятор компіляторів), як назвав його автор, Стів Джонсон (Steve Johnson), коментуючи кількість аналогічних програм в той момент (при мірно в 1972 році) Але успіх мали лише деякі компілятори, серед них і yacc

аналізу, що виконує синтаксичний розбір виразів Крім того, yacc надає можливість звязати смислові значення з граматичними елементами таким чином, що в процесі синтаксичного аналізу оцінюється також і їх семантика При використанні yacc необхідно дотримуватися певну послідовність дій

По-перше, треба описати граматику, як це було зроблено вище, тільки більш докладно Так визначається синтаксис мови На цьому етапі yacc можна використовувати для пошуку помилок і невизначеностей в граматиці

По-друге, кожнепороджує правилоцієї граматики може бути доповнено дією – описом того, що повинно бути виконано, коли в розглядуваної програмі зустрінеться задана граматична форма Ця частина пишеться на Сі з дотриманням угод про взаємодію з граматикою Так визначається семантика мови

По-третє, необхідний лексичний аналізатор, Який читатиме вихідний текст і виділяти в ньому фрагменти, піддаються інтерпретації синтаксичним аналізатором Прикладом такої лексичної одиниці, що складається з декількох символів, є NUMBER, а також Односимвольні оператори + і * Подібний лексичний фрагмент традиційно називається лексемою

Нарешті, потрібна керуюча програма, яка запускає синтаксичний аналізатор, побудований за допомогою yacc

Програма yacc перетворює граматику і семантичні операції у функцію аналізатора, звану yyparse, і розміщує згенерований код Сі в окремому файлі При відсутності помилок синтаксичний аналізатор, лексичний аналізатор і керуюча програма можуть бути відкомпільовані, скомпоновані – можливо, з іншими підпрограмами на Сі – і виконані

У процесі виконання ця програма викликає лексичний аналізатор, що виділяє лексеми, розпізнає граматичні (синтаксичні) структури і виконує для кожної з них певні семантикою дії Функція лексичного аналізу повинна називатися yylex, так як саме це імя використовується програмою yyparse для отримання чергової лексеми (Всі імена, використовувані yacc, починаються з y)

Вхідний файл yacc має такий вигляд:

%{

необовязкова секція

оператори Сі, такі як #include, Оголошення і т п

%}

оголошення yacc: лексичні одиниці, граматичні змінні, пріоритети і асоціативність

%%

граматичні правила і дії

%%

додаткові оператори Сі (необовязково):

main()  {  ..;  yyparse()  ..  } yylex()  {  ..  }

Цей текст обробляється yacc, і результат виводиться у файл з імям ytabc, що має формат:

оператори Сі, розташовані між %{ і %}, Якщо є оператори Сі, розташовані після другого%%, Якщо є: main()  { ..; yyparse()  ..  }

yylex() { .. }

yyparse() { синтаксичний аналізатор, що викликає yylex() }

Те, що yacc створює текст на Сі, а не скомпільований обєктний ( O) файл, типово для UNIX Це найбільш гнучкий підхід – згенерований код переносимо і може використовуватися в будь-якому іншому місці

Сам yacc є потужним засобом Зусилля, витрачені на його вивчення, окупаються багато разів Згенеровані їм аналізатори компактні, ефективні і коректні (хоча за семантичну обробку відповідає користувач) більшість рутинних проблем грам ної аналізу вирішуються автоматично Мовні програми легко створюються і (мабуть, це більш важливо) можуть бути швидко вимірюв нени по мірі розвитку мови

Етап 1

Оригінальний текст hoc1 складається з опису граматики і дій, лек січеской підпрограми yylex і функції main, збережених у файлі hocy (Імена файлів yacc традиційно закінчуються на Y, але сам yacc не навязує це позначення, на відміну від cc і c) Перша половина hocy містить опис граматики:

$ cat  hocy

%{

# Define YYSTYPE double / * тип даних для стека yacc * /

%}

%token  NUMBER

% Left + – / * левоассоціатівние, однаковий пріоритет * /

% Left * / / * левоассоціатівние, більш високий пріоритет * /

%%

list: / * нічого * /

| list \n

| list expr  \n        { printf(&quot\t%8g\n&quot,

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*