
- •Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”
- •Розробка системних програмних модулів та компонент систем програмування
- •Розробка системних програмних модулів та компонент систем програмування мета курсової роботи
- •Структура та обсяг курсової роботи
- •Вимоги до оформлення
- •Захист роботи
- •Теоретичні відомості
- •1. Лексичний аналіз
- •1.2. Побудова лексичного аналізатора засобами скінченного автомату
- •1.2.1. Особливості побудови лексичного аналізатора засобами скінченного автомату
- •1.2.2. Приклад побудови лексичного аналізатора засобами скінченного автомату
- •1.3. Інші способи Побудови лексичного аналізатора
- •1.3.1. Побудова лексичного аналізатора засобами регулярних виразів
- •1.3.2. Побудова лексичного аналізатора засобами спеціалізованого програмного забезпечення
- •1.3.3. Приклад файлу з правилами виділення лексем для Flex
- •2. Синтаксичний аналіз
- •2.1. Визначення синтаксичних правил мови програмування за допомогою формул Бекуса-Наура
- •2.1.1. Приклад визначення натуральних чисел за допомогою формул бнф
- •2.1.2. Формули Бекуса-Наура для мови Pascal
- •2.2. Способи побудови синтаксичного аналізатора
- •2.2.1. Низхідний аналіз
- •2.2.2. Приклад низхідного граматичного розбору
- •2.2.3. Розробка низхідного синтаксичного аналізатора
- •2.2.3.1. Опис вхідної мови в термінах нотації Бекуса-Наура
- •2.2.3.2. Розробка дерева граматичного розбору
- •2.2.4. Висхідний аналіз
- •2.2.5. Генератори синтаксичних аналізаторів
- •2.2.6. Приклад тексту специфікації для zubr
- •3. Генератор коду
- •3.1. Загальні принципи генерації коду
- •3.2. Способи внутрішнього представлення програм
- •3.2.1. Багатоадресний код з неявно іменованим результатом (тріади)
- •3.2.2. Постфіксна форма запису операцій (зворотний польський запис)
- •3.2.3. Перетворення з інфіксної нотації в зпз
- •3.3. Обчислення виразів на стековій машині
- •3.4. Генерація коду з використанням співпроцесора
- •Література
- •Завдання на курсову роботу
2.1.1. Приклад визначення натуральних чисел за допомогою формул бнф
<нуль> ::= 0
<ненульова цифра> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<цифра> ::= <нуль> | <ненульова цифра>
<послідовність цифр> ::= <нуль> | <ненульова цифра> | <цифра><послідовність цифр>
<натуральне число> ::= <цифра> | <ненульова цифра><послідовність цифр>
В цьому прикладі 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – термінальні символи. Решта символів – не термінальні. Запис <ненульова цифра> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 слід читати ненульова цифра визначена як 1 або 2 або 3 або 4 або 5 або 6 або 7 або 8 або 9 або 10. Запис <цифра> ::= <нуль> | <ненульова цифра> слід читати цифра визначена як нуль або ненульова цифра.
2.1.2. Формули Бекуса-Наура для мови Pascal
<програма> ::= <заголовок програми> <блок> .
<заголовок програми> ::= program <і’мя> (<і’мя файла> {,<і’мя файла>});
<і’мя файла> ::= <і’мя>
<і’мя> ::= <буква> {<буква чи цифра>}
<буква чи цифра> ::= <буква> | <цифра>
<блок> ::= <розділ міток> <розділ констант> <розділ типів> <розділ змінних>
<розділ процедур і функцій> <розділ операторів>
<розділ міток> ::= <пусто> | label <мітка> {,< мітка >};
<мітка> ::= <ціле без знаку>
<розділ констант> ::= <пусто> | const <визначення константи>
{; <визначення константи>};
<визначення константи> ::= <і’мя> = <константа>
<константа> ::= <число без знаку> | <знак> <число без знаку> | <ім’я константи> |
<знак> <ім’я константи> | <рядок>
<число без знаку> ::= <ціле без знаку> | <дійсне без знаку>
<ціле без знаку> ::= <цифра> {<цифра>}
<дійсне без знаку> ::= <ціле без знаку> . <цифра> {<цифра>} |
<ціле без знаку> . <цифра> {<цифра>} E <порядок> |
<ціле без знаку> E <порядок>
<порядок> ::= <ціле без знаку> | <знак> <ціле без знаку>
<знак> ::= + | –
<ім’я константи> ::= <ім’я>
<рядок> ::= ’<символ> {<символ>}’
<розділ типів> ::= <пусто> | type <визначення типу> {; <визначення типу>};
<визначення типу> ::= <ім’я> = <тип>
<тип> ::= <простий тип> | <складовий тип> | <вказівний тип>
<простий тип> ::= <скалярний тип> | <обмежений тип> | <ім’я типу>
<скалярний тип> ::= ( <ім’я> {, <ім’я>} )
<обмежений тип> ::= <константа> .. <константа>
<ім’я типу> ::= <ім’я>
<складовий тип> ::= <неупакований складовий тип> |
packed <неупакований складовий тип>
<неупакований складовий тип> ::= <регулярний тип> | <комбінований тип> |
<множинний тип> | <файловий тип>
<регулярний тип>::= array[ <тип індекса> {, <тип індекса>}] of <тип компонента>
<тип індекса> ::= <простий тип>
<тип компонента> ::= <тип>
<комбінований тип> ::= record <список полів> end
<список полів> ::= <фіксована частина> | <фіксована частина>
<варіантна частина> | <варіантна частина>
<фіксована частина> ::= <секція запису> {; <секція запису>}
<секція запису> ::= <ім’я поля> {, <ім’я поля>} : <тип> | <пусто>
<варіантна частина> ::= case <дискримінант> <ім’я типу> of <варіант> {; <варіант>}
<дискримінант> ::= <ім’я поля> : | <пусто>
<варіант> ::= <список міток варіанту> : ( <список полів>) | <пусто>
<список міток варіанту> ::= <мітка варіанту> {, <мітка варіанту>}
<мітка варіанту> ::= <константа>
<множинний тип> ::= set of <базовий тип>
<базовий тип> ::= <простий тип>
<файловий тип> ::= file of <тип>
<вказівний тип> ::= ^ <ім’я типу>
<розділ змінних> ::= <пусто> | var <опис змінної> {; <опис змінної>};
<опис змінної> ::= <ім’я> {, <ім’я>} : <тип>
<розділ процедур і функцій> ::= {<опис процедури чи функції>;}
<опис процедури чи функції> ::= <опис процедури> | <опис функції>
<опис процедури> ::= <заголовок процедури> <блок>
<заголовок процедури> ::= procedure <ім’я> |
procedure <ім’я> ( <розділ формальних параметрів>
{; <розділ формальних параметрів>});
<розділ формальних параметрів> ::= <група параметрів> | var <група параметрів> |
function <група параметрів> | procedure <ім’я> {, <ім’я>}
<група параметрів> ::= <ім’я> {, <ім’я>} : <ім’я типу>
<опис функції> ::= <заголовок функції> <блок>
<заголовок функції> ::= function <ім’я> : <тип результату> |
function <ім’я> ( <розділ формальних параметрів>
{; <розділ формальних параметрів>}) : <тип результату>;
<тип результату> ::= <ім’я типу>
<розділ операторів> ::= <складовий оператор>
<оператор> ::= <непозначений оператор> | <мітка> : <непозначений оператор>
<непозначений оператор> ::= <простий оператор> | <складний оператор>
<простий оператор> ::= <оператор присвоювання> | <оператор процедури> |
<оператор переходу> | <порожній оператор>
<оператор присвоювання> ::= <змінна> := <вираз> | <ім’я функції> := <вираз>
<змінна> ::= <повна змінна> | <компонентна змінна> | <вказівна змінна>
<повна змінна> ::= <ім’я змінної>
<ім’я змінної> ::= <ім’я>
<компонентна змінна> ::= <індексована змінна> | <позначення поля> | <буфер файла>
<індексована змінна> ::= <змінна-масив> [<вираз> {, <вираз>}]
<змінна-масив> ::= <змінна>
<позначення поля> ::= <змінна-запис> . <ім’я поля>
<змінна-запис> ::= <змінна>
<ім’я поля> ::= <ім’я>
<буфер файла> ::= <змінна-файл>^
<змінна-файл> ::= <змінна>
<вказівна змінна> ::= <змінна-посилання>^
<змінна-посилання> ::= <змінна>
<вираз> ::= <простий вираз>| <простий вираз> <операція відношення> <простий вираз>
<операція відношення> ::= = | <> | < | <= | > | >= | in
<простий вираз> ::= <доданок> | <знак> <доданок> |
<простий вираз> <адитивна операція> <доданок>
<адитивна операція> ::= + | – | or
<доданок> ::= <множник> | <доданок> <мультиплікативна операція> <множник>
<мультиплікативна операція> ::= * | / | div | mod | and
<множник> ::= <змінна> | <константа без знаку> | (<вираз>) |
<позначення функції> | <множина> | not <множник>
<константа без знаку> ::= <число без знаку> | <рядок> | <ім’я константи> | nil
<позначення функції> ::= <ім’я функції> | <ім’я функції> (<фактичний параметр>
{, <фактичний параметр>})
<ім’я функції> ::= <ім’я>
<множина> ::= [<список елементів>]
<список елементів> ::= <елемент> {, <елемент>} | <пусто>
<елемент> ::= <вираз> | <вираз> .. <вираз>
<оператор процедури> ::= <ім’я процедури> | <ім’я процедури> (<фактичний параметр> {, <фактичний параметр>})
<ім’я процедури> ::= <ім’я>
<фактичний параметр> ::= <вираз> | <змінна> | <ім’я процедури> | <ім’я функції>
<оператор переходу> ::= goto <мітка>
<порожній оператор> ::= <пусто>
<складний оператор> ::= <складовий оператор> | < вибираючий оператор > |
<оператор циклу> | <оператор приєднання>
<складовий оператор> ::= begin <оператор> {; <оператор>} end
< вибираючий оператор > ::= <умовний оператор> | <оператор варіанту>
<умовний оператор> ::= if <вираз> then <оператор>|
if <вираз> then <оператор> else <оператор>
<оператор варіанту> ::= case <вираз> of <елемент списку варіантів>
{; <елемент списку варіантів>} end
<елемент списку варіантів> ::= <список міток варіанту> : <оператор> | <пусто>
<список міток варіанту> ::= <мітка варіанту> {, <мітка варіанту>}
<оператор циклу> ::= <цикл з передумовою>| <цикл з післяумовою> |
<цикл з параметром>
<цикл з передумовою> ::= while <вираз> do <оператор>
<цикл з післяумовою> ::= repeat <оператор> {; <оператор>} until <вираз>
<цикл з параметром> ::= for <параметр циклу> := <список циклу> do <оператор>
<список циклу> ::= <початкове значення> to <кінцеве значення>|
<початкове значення> downto <кінцеве значення>
<параметр циклу> ::= <ім’я>
<початкове значення> ::= <вираз>
<кінцеве значення> ::= <вираз>
<оператор приєднання> ::= with <список змінних-записів> do <оператор>
<список змінних-записів> ::= <змінна-запис> {, <змінна-запис>}