Розроблення компіляторів
Компілятор та його типи. Компілятори мов програмування. Граматики модельної мови. Алгоритм лексичного аналізатора. Робота синтаксичного аналізатора на прикладі простої програми модельної мови. Метод рекурсивного спуску. Опис логічної структури програми.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 14.02.2013 |
Размер файла | 934,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ”ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра систем автоматизованого проектування
ПОЯСНЮВАЛЬНА ЗАПИСКА
до курсової роботи
з дисципліни ”Лінгвістичне забезпечення САПР”
на тему: розроблення компіляторів
Прийняв:
ст.викл.каф. САПР
Свірідова Т.В.
Львів 2011
Анотація
Дана курсова робота складається з тридцяти сторінок, чотирьох таблиць та чотирьох рисунків. Під час виконання курсової роботи, було використано три джерела інформації.
Мета роботи: закріплення теоретичних знань в області теорії формальних мов, граматик, автоматів і методів трансляції; формування практичних умінь і навичок розробки власного компілятора модельної мови програмування; закріплення практичних навичок самостійного рішення інженерних завдань, розвиток творчих здібностей студентів і умінь користуватися технічною, нормативною і довідковою літературою.
Об'єктом дослідження є компілятор, який потрібно зробити трьох прохідним, тобто компілятор повинен виконувати лексичний, синтаксичний і семантичний аналіз модельної мови, і давати результат про правильність тексту з точки зору лексичного, синтаксичного і семантичного аналізу.
КАЛЕНДАРНИЙ ПЛАН
№ п/п |
Назва етапів курсового проекту (роботи) |
Термін виконання етапів проекту (роботи) |
Примітки |
|
Зміст
Завдання на курсовий проект
Анотація
Календарний план
Специфікації
1. Вступ
2. Визначення і структура лінгвістичного забезпечення САПР
3. Компілятор та його типи
4. Процес компіляції
5. Компілятори мов програмування
6. Теоретична частина
6.1 Таблиці ідентифікаторів та термінальних символів
6.2 Граматики модельної мови
6.3 Приклади програм на модельній мові
6.4 Алгоритм лексичного аналізатора
6.5 Робота синтаксичного аналізатора на прикладі простої програми модельної мови
6.6 Метод рекурсивного спуску
6.7 Семантичний аналізатор
6.8 Переведення різних конструкцій в ПОЛІЗ
7. Практична частина
7.1 Алгоритм роботи програми
7.2 Опис програми
7.3 Опис логічної структури програми
7.4 Результати виконання програми
Висновки
Список використаної літератури
Специфікації
1. КВ-граматики - контекстно-вільні граматики
2. ПОЛІЗ - польський запис
3. САПР - система автоматизованого проектування
4. ЕОМ - електронно-обчислювальна машина
5. ЛА - лексичний аналізатор
6. СА - синтаксичний аналізатор
7. ПП - програмний продукт
1. Вступ
Система автоматизованого проектування (САПР) - це організаційно-технічна система, яка містить комплекс засобів автоматизованого проектування, які взаємозв'язані з підрозділами проектної організації.
Функціональними складовими САПР є: технічне забезпечення, математичне забезпечення, програмне забезпечення, лінгвістичне забезпечення, інформаційне забезпечення, методичне забезпечення, організаційне забезпечення;
Лінгвістичне забезпечення - це сукупність мов, які використовуються в САПР для представлення інформації про проектовані об'єкти, процес і засоби проектування, якими обмінюються користувачі з ЕОМ і між собою в процесі автоматизованого проектування.
Основні завдання курсу «Лінгвістичне забезпечення САПР» - дати теоретичні і практичні знання в галузі використання мов програмування і розробки мов проектування на основі аналізу об'єкта проектування. Дати основні поняття, принципи і навички створення мовних процесорів: трансляторів, компіляторів, інтерпретаторів.
Формальні граматики це дуже потужній математичний інструмент, який використовується в математичній та комп'ютерній лінгвістиці, описі мов програмування, розробці компіляторів в теорії програмування. Найбільш вживаними є КВ-граматики і регулярні, бо їх найлегше описати алгоритмічно.
Проектування лінгвістичного забезпечення є важливим компонентом при розробці САПР, так програмні засоби, які будуть створені внаслідок проектування лінгвістичного забезпечення, будуть створювати можливості для спілкування користувача цієї системи і комп'ютера, або ЕОМ.
2. Визначення і структура лінгвістичного забезпечення САПР
Лінгвістичне забезпечення САПР - це сукупність мов, які використовуються в САПР для висвітлення інформації про об'єкти, що проектуються, про процес та засоби проектування, якою обмінюються люди з ЕОМ між собою в процесі автоматизованого проектування.
Однією із важливіших задач при створенні лінгвістичного забезпечення САПР є вибір мов взаємодії та форм спілкування проектувальника з ЕОМ.
Мови взаємодії є особливими, спеціально орієнтованими на потреби проектувальника. Якщо мови програмування направлені, головним чином, на універсальність та зручність їх трансляції в машинні мови, то мови взаємодії призначені для забезпечення найбільших зручностей при спілкуванні проектувальника з ЕОМ, найбільш компактного приставлення проектної інформації, найбільших зручностей при здійсненні проектних процедур і т. інше.
Мови забезпечення САПР включають в себе мови проектування та мови програмування і охоплює терміни, визначення, правила формалізації звичайної мов, методи стиснення та розширення.
До мовного забезпечення ставлять такі вимоги:
ефективність мови;
повнота мови;
розширюваність мови;
виразність мови;
проблема орієнтації мови.
Ефективність - це точність опису та лаконічність запису.
Повнота - це можливість опису будь-яких об'єктів, на проектування яких орієнтована САПР.
Розширюваність - це розширюваність алфавіту та синтаксису мови, яка повинна забезпечувати розвиток мови.
Виразність та проблемна орієнтація - повинні забезпечувати простоту вивчення та використання мови.
Мови взаємодії можна розподілити на слідуючі основні типи: природня, обмежена природня, командна, “меню” та “шаблони”.
Природня мова користувача не завжди може бути використана для спілкування з ЕОМ в сучасних САПР, так як виникають труднощі автоматичного аналізу повідомлень користувача, виражених на природній мові в межах жорстко обмежених ситуацій, які пов'язані з задачами проектування.
Обмежена природня мова є на даний час перспективним способом взаємодії. Основний недолік такої взаємодії полягає в тому, що користувач повинен добре уявляти синтаксичні та семантичні обмеження, які накладаються на природню мову.
Командна мова є розповсюдженим способом взаємодії. Користувачу приставляється набір команд, за допомогою яких він може управляти виконанням різноманітних проектних процедур. Ці команди виконують два види
функцій: визначають процеси, які повинні бути виконані; вміщують в собі дані, що передаються цим процесам.
При діалоговій взаємодії інформація, що вводиться користувачем, розбивається на велике число команд, які вміщують відносно малу кількість даних. В цьому випадку введені данні тут же виводяться системою (еховідображення), що полегшує виправлення помилок при вводі.
“Меню” та “Шаблони”. Дані мови є найбільш поширеним способом діалогової взаємодії з прикладними програмами САПР. З допомогою “меню” користувач керує виконанням проектної процедури, вибираючи необхідну функцію із перерахованих в “меню”.
“Шаблон” являє собою спеціальним чином організований кадр діалогу, який відображується на екрані дисплею, та призначений для введення та виведення даних. “Шаблон” включає інформаційні поля, які розміщуються в визначених місцях екрану та призначені для введення-виведення даних та пояснювальні надписи до них.
Організація взаємодії тільки з використанням “меню” та “шаблонів” не має достатньої гнучкості, через це даний спосіб взаємодії використовується, як правило, разом з командними мовами.
3. Компілятор та його типи
Компілятор - це програма, яка здійснює переклад початкової програми в еквівалентну їй об'єктну програму на мові машинних команд або мові асемблера.
Основні функції компілятора :
1) перевірка початкового ланцюжка символів на приналежність до вхідної мови;
2) генерація вихідного ланцюжка символів на мові машинних команд або асемблері.
Компілятори поділяються на:
1) Векторний. Компілює вихідний код в машинний код для комп'ютерів, оснащених векторним процесором.
2) Гнучкий. Сконструйований за модульним принципом, управляється таблицями і запрограмований на мові високого рівня або реалізований за допомогою компілятора компіляторів.
3) Інкрементальний. Повторно транслює/компонує фрагменти програми і доповнення до неї без перекомпіляції всієї програми.
4) Інтерпретуючий (покроковий). Послідовно виконує незалежну компіляцію кожного окремого оператора (команди) вихідної програми.
5) Компілятор компіляторів. Компілятор, що сприймає формальний опис мови програмування і генеруючий компілятор для цієї мови.
6) Налагоджувальний. Усуває окремі види синтаксичних помилок.
7) Резидентний. Постійно знаходиться в оперативній пам'яті і доступний для повторного використання багатьма завданнями.
8) Самокомпіюючий. Написаний на тій же мові, з якої здійснюється компіляція.
9) Універсальний. Заснований на формальному описі синтаксису і семантики вхідної мови. Важливими складовими частинами такого компілятора є: ядро, синтаксичний і семантичний завантажувачі.
4. Процес компіляції
Будь-який компілятор складається з транслятора і компоновника. Часто як компонувальника компілятор використовує зовнішній компонувальник, реалізований у вигляді самостійної програми, а сам виконує лише трансляцію вихідний текст (з цієї причини багато хто помилково вважає компілятор різновид транслятора). Компілятор може бути реалізований і як своєрідна програма-менеджер, для трансляції програми викликала сооствествующій транслятор (транслятори - якщо різні частини програми написані на різних мовах програмування) і потім - для компонування програми, - що викликає компонувальник. Яскравим прикладом такого компілятора є наявна у всіх UNIX-системах (і Linux-системах в тому числі) утиліта make (є реалізації утиліти make і в інших системах, зокрема в Windows-системах).
Процес компіляції складається з наступних фаз:
1) Лексичний аналіз. На цій фазі послідовність символів вихідного файлу перетвориться в послідовність лексем.
2) Синтаксичний (граматичний) аналіз. Послідовність лексем перетворюється на дерево розбору.
3) Семантичний аналіз. Дерево розбору обробляється з метою встановлення його семантики (сенсу) - наприклад, прив'язка ідентифікаторів до їх визначення, типами даними, перевірка сумісності типів даних, визначення результуючих типів даних виразів і т. д. Результат зазвичай називається «проміжним поданням / кодом», і може бути доповненим древом розбору, новим деревом, абстрактним набором команд або чимось ще, зручним для подальшої обробки.
4) Оптимізація. Видаляються надлишкові команди і спрощується (де це можливо) код із збереженням його сенсу, тобто реалізованого їм алгоритму (в тому числі перечисляються (тобто обчислюються на фазі трансляції) висловлювання, результати яких практично є константами). Оптимізація може бути на різних рівнях і етапах - наприклад, над проміжним кодом або над кінцевим машинним кодом.
5) Генерація коду. З проміжного представлення породжується код на цільовому мовою (в тому числі виконується компонування програми).
У конкретних реалізаціях компіляторів ці фази можуть бути розділені або, навпаки, поєднані в тому чи іншому вигляді.
5. Компілятори мов програмування
Більшість компіляторів компілює (в тому числі транслює) програму з деякої високорівневої мови програмування в машинний код, який може бути безпосередньо виконаний центральним процесором. Як правило, цей код також орієнтований на виконання в середовищі конкретної операційної системи, оскільки використовує надані нею можливості (системні виклики, бібліотеки функцій, API). Архітектура чи платформа (набір програмно-апаратних засобів), для якої проводиться компіляція, називається цільової машиною або, також, цільової платформою.
Деякі компілятори (наприклад, Java) переводять програму не в машинний код, а в програму на деякій спеціально створеній низькорівневій інтерпретуючій мові. Така мова - байт-код (у випадку з Java Java-байт-код) - також можна вважати мовою машинних команд, оскільки в якості його інтерпретатором використовується віртуальна машина. Байт-код не є машинним кодом будь-якого комп'ютера, тобто машинним кодом у прямому сенсі слова, і може переноситися на різні комп'ютерні архітектури без перекомпіляції. Байт-код інтерпретується (виповнюється) віртуальною машиною.
Наприклад, для мови Java це JVM (мова віртуальної машини Java), або так званий байт-код Java (слідом за ним всі проміжні низькорівневі інтерпретуючі мови стали називати байт-кодами). Для мов програмування на платформі. NET Framework (C #, Managed C + +, Visual Basic. NET та інші) - це MSIL (Microsoft Intermediate Language).
Програма на байт-коді підлягає інтерпретації віртуальною машиною, або ще однієї компіляції вже в машинний код безпосередньо перед виконанням. Останнє називається «Just-In-Time компіляція» (JIT), за назвою подібного компілятора для Java. MSIL-код компілюється в код цільової машини також JIT-компілятором, а бібліотеки. NET Framework компілюються заздалегідь.
Для кожної цільової машини (IBM, Apple, Sun і т. д.) і кожної операційної системи або сімейства операційних систем, що працюють на цільовій машині, потрібно написання свого компілятора. Існують також так звані крос-компілятори, що дозволяють на одній машині і в середовищі однієї ОС генерувати код, призначений для виконання на іншій цільовій машині і / або в середовищі іншої ОС. Крім того, компілятори можуть бути оптимізовані під різні типи процесорів з одного сімейства (шляхом підтримки специфічних для цих процесорів машинних команд). Наприклад, код, скомпільований під процесори сімейства Pentium, може використовувати специфічні для цих процесорів набори інструкцій - MMX, SSE, SSE2.
Також існують компілятори, що переводять програму з мови високого рівня на мову асемблера. (Щоправда такі компілятори, взагалі-то слід було б називати трансляторами).
Існують програми, які вирішують зворотну задачу - переклад програми з низькорівневої мови на високорівневу. Цей процес називають декомпіляція, а такі програми - декомпіляторами. (Яскравий приклад таких програм - дизасемблери) Але оскільки компіляція - це процес із втратами, точно відновити вихідний код, скажімо, на C + +, в загальному випадку неможливо. Більш ефективно декомпілюются програми в байт-коди - наприклад, існує досить надійний декомпілятор для Flash. Різновид декомпілювання є дизасемблювання машинного коду в код на мові асемблера, який завжди виконується успішно. Пов'язано це з тим, що між кодами машинних команд і командами асемблера є практично взаємно-однозначна відповідність.
компілятор програма лексичний аналізатор
6. Теоретична частина
Номер варіанту 1, номер завдання 111111
<операції_групи_відношення>:: = < > | = | < | <= | > | >=
<операції_групи_додавання>:: = + | - | or
<операції_групи_множення>::= * | / | and
<унарна_операція>::= not
Вирази мови задаються правилами:
<вираз>::= <операнд>{<операції_групи_відношення> <операнд>}
<операнд>::= <доданок> {<операції_групи_додавання> <доданок>}
<доданок>::= <множник> {<операції_групи_множення> <множник>}
<множник>::= <ідентифікатор> | <число> | <логічна_константа> |
<унарна_операція> <множник> |<вираз>)
<число>::= <ціле> | <дійсне>
<логічна_константа>::= true | false
Правила, що визначають ідентифікатор, букву і цифру :
<ідентифікатор>::= <буква> {<буква> | <цифра>}
<буква>::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
U | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k |l | m | n | o | p |q | r | s | t | u | v | w | x | y | z
<цифра>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Правила, що визначають цілі числа:
<ціле>::= <двійкове> | <вісімкове> | <десяткове> |<шістнадцяткове>
<двійкове>::= {/ 0 | 1 /} (B | b)
<вісімкове>::= {/ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 /} (O | o)
<десяткове>::= {/ <цифра> /} [D | d]
<шістнадцяткове>::= <цифра> {<цифра> | A | B | C | D | E | F | a | b | c | d | e| f} (H | h)
Правила, що описують дійсні числа:
<дійсне>::= <числовий_рядок> <порядок> |[<числовий_рядок>] .
<числовий_рядок> [порядок]
<числовий_рядок>::= {/ <цифра> /}
<порядок>::= ( E | e )[+ | -] <числовий_рядок>
<програма> = program var <опис> begin <оператор> {; <оператор>} end.
<опис>::= {<ідентифікатор> {, <ідентіфікатор> } : <тип> ;}
<тип>::= % | ! | $
<складений>::= <оператор> { ( : | перевід стрічки) <оператор> }
< присвоєння >::= <ідентифікатор> ass <вираз>
<умовний>::= if <вираз> then <оператор> [ else <оператор>]
<фіксований_цикл>::= for <присвоєння> to <вираз> do <оператор>
<умовний_цикл>::= while <вираз> do <оператор>
<ввід>::= read (<ідентифікатор> {, <ідентифікатор> })
<вивід>::= write (<вираз> {, <вираз> })
Ознака початку коментаря { Ознака кінця коментаря }
6.1 Таблиця розділювачів і службових слів
Номер |
Ім'я |
|
1 |
begin |
|
2 |
end |
|
3 |
while |
|
4 |
read |
|
5 |
write |
|
6 |
for |
|
7 |
to |
|
8 |
do |
|
9 |
if |
|
10 |
then |
|
11 |
else |
|
12 |
% |
|
13 |
! |
|
14 |
$ |
|
15 |
ass |
|
16 |
true |
|
17 |
false |
|
18 |
not |
|
19 |
and |
|
20 |
or |
|
21 |
program |
|
22 |
var |
Табл. 1 Таблиця службових слів
Номер |
Розділювач |
|
1 |
> |
|
2 |
< |
|
3 |
= |
|
4 |
+ |
|
5 |
- |
|
6 |
* |
|
7 |
/ |
|
8 |
: |
|
9 |
, |
|
10 |
. |
|
11 |
| |
|
12 |
( |
|
13 |
) |
|
14 |
; |
Табл. 2 Таблиця розділювачів
6.2 Граматика для модельної мови
S> program S1
S1>var S2
S2>II1| begin B
I1>,S2|:TYP
TYP>%Kr_Kom|!Kr_Kom|$Kr_Kom
Kr_Kom>;S2
B> read R_W| write N| if Q| while H| for F| else B| end B| .
R_W>(L
L>IL_next
L_next>,L|)L2
L2>;O_end
P>ass P1|
P1>IP2|WP2|(P1
P2>*P1|/P2|+P2|-P2|)P2|;O_end
F>IF1
F1>ass F2
F2>IF3|WF3
F3>to F4
F4> IF5|WF5
F5>do F6
F6>;O_end
N>(N1
N1>IN2|(N1|WN2
N2>*N1|/N1|+N1|-N1|,N1|)N2|;O_end
Q>IQ1|IQ1|(Q
Q1>*Q2|/Q2|+Q2|-Q2|)Q1|<Q2|>Q2|=Q3
Q2>>Q3|=Q3|IQ4|WQ4|(Q3
Q3>IQ4|WQ4|(Q3
Q4>*Q3|/Q3|+Q3|-Q3|)Q4|thenQ5
Q5>;O_end
H>IH1|IH1|(H
H1>*H2|/H2|+H2|-H2|)H1|<H2|>H2|=H3
H2>>H3|=H3|IH4|WH4|(H3
H3>IH4|WH4|(H3
H4>*H3|/H3|+H3|-H3|)H4|thenH5
H5>;O_end
O_end>(O1
O1>:O2
O2>|O3
O3>)B
I>I0
I0>a..z I1| A..Z I1| a..z | A..Z
I1>a..z I1| A..Z I1| 0..9 I1| a..z| A..Z| 0..9
W>W0
W0>0..9 W1| A..F W1| a..f W1| 0..9| a..f| A..F
W1>0..9 W1| A..F W1| a..f W1| 0..9| a..f| A..F| eW2|b| h| d| B| H| D
W2>0..9 W2|0..9
6.3 Приклади програм на модельній мові
1. Програма, яка сумує два числа.
program
var
a1,a2,suma:%;
begin
read(a1,a2);
suma ass a1 + a2;
write(suma);
end.
2. Програма, яка працює з арифметичними операціями.
program
var
s1,s2,s3,rez:%;
begin
read(s1,s2,s3);
rez ass 100b-(s2*(s1+s1))/s3 ;
write(rez);
end.
3. Програма, яка працює з оператором вибору та булевими типами змінних.
program
var
zm:!;
bol:$;
begin
write(zm);
if zm>0 then(:|
)bol ass true(:|
)else(:|
)bol ass false;
end.
4. Програма, яка виводить середнє арифметичне значення чисел введених з клавіатури. Також показано можливість функції коментування.
program {Serednje aryfmety4ne}
var
k,n,sum,i:!;
begin
read(n);
sum ass 0;
i ass 1;
while i<=n do(:|
)read(k)(:|
)sum ass sum+k(:|
)k ass k+1;
write(sum/n);
end.
5. Програма, яка обчислює площу та периметр квадрата.
program
var
plosh4a,perymetr,storona:!;
begin
read(storona);
plosh4a ass storona*storona;
perymetr ass storona+storona+storona+storona;
write(plosh4a);
write(perymetr);
end.
6.4 Алгоритм роботи лексичного аналізатора
Скануємо символи до появи пробілу. Пробіл видаляємо, зупиняємо сканування, перевіряємо чи скановане слово є розділювачом, якщо є, створюємо лексему для нього у форматі (2,n), де n - номер лексеми у таблиці розділювачів, якщо не вдалося створити, або є якась лексична помилка, переривається виконання алгоритму і видається помилка.
Якщо скановане слово не є розділювачом, перевіряємо чи воно є зарезервованим службовим словом, якщо так, то створюємо для нього лексему у форматі (1,n).
Якщо скановане слово не є службовим словом, то перевіряємо чи воно є цифрою. Якщо воно є числом, то перевіряємо правильність запису числа. Якщо число записане неправильно, то видаємо повідомлення про помилку, і перериваємо компілювання. Якщо число записане правильно, то записуємо його у табличку використаних цифр, і створюємо для нього лексему.
Якщо скановане слово не є числом, то перевіряємо правильність запису ідентифікатора. Якщо він записаний неправильно, то видаємо повідомлення про помилку і перериваємо компілювання. Якщо він записаний правильно, то записуємо його у табличку використаних ідентифікаторів і створюємо лексему.
6.5 Робота синтаксичного аналізатора на прикладі простої програми модельної мови. Метод рекурсивного спуску
Наприклад у нас задана така програма:
program
var
i:%;
begin
read(i);
end.
S>programS1>program varS2>program var iI1>program var i: TYP> program var i:%Kr_Kom> program var i:%;S2> program var i:%; begin B> program var i:%; begin read R_W> program var i:%; begin read (L> program var i:%; begin read (iIL_next>program var i:%; begin read (i)L2> program var i:%; begin read (i);B> program var i:%; begin read (i);end B> program var i:%; begin read (i);end.
program
var
:
i
%
;
begin
read
(
)
i
;
end
. end
Рис. 1 Дерево розбору програми
6.6 Робота семантичного аналізатора
Після виконання семантичного аналізу над програмою, ми отримаємо таблицю ідентифікаторів.
Для такої програми:
program
var
k,n,sum:%;
i:!;
begin
read(n);
sum ass 0;
i ass 1;
while i<=n do(:|
)read(k)(:|
)sum ass sum+k(:|
)k ass k+1;
write(sum/n);
end.
k |
% |
1 |
|
n |
% |
1 |
|
sum |
% |
1 |
|
i |
! |
1 |
Табл. 3 Ідентифікатори даної програми
Операція |
Тип1 |
Тип2 |
Результат |
|
Ass |
% |
% |
% |
|
<= |
% |
% |
$ |
|
+ |
% |
% |
% |
|
Ass |
! |
! |
! |
|
/ |
% |
% |
% |
Табл. 4 Таблиця двомісних операцій
Динаміка зміну стеку при перевірці виразу a ass a+b*c
1) % ass % + % * %
2) % ass % + %
3) % ass %
4) %
6.7 . Перевід різних конструкцій у ПОЛІЗ
1) Перевід виразу присвоєння
w ass k+s в ПОЛІЗ буде мати вигляд w k s+ ass
2) Перевід умовного оператора у ПОЛІЗ
if a<5 then(:| )k ass a+s(:| )else(:| )k ass a-s; в ПОЛІЗ буде мати вигляд:
Лексема |
a |
5 |
> |
11 |
!F |
k |
a |
s |
+ |
ass |
! |
k |
a |
s |
- |
ass |
|
номер |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
3) Перевід оператора циклу з передумовою
while k<0 do(:| )k ass a +s;
Лексема |
k |
0 |
< |
11 |
!F |
k |
a |
s |
+ |
ass |
! |
|
номер |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
4) Перевід оператора циклу for
for i ass 0 to 10 do(:| )k ass a+s;
Лексема |
i |
0 |
ass |
17 |
!F |
k |
a |
s |
+ |
ass |
i |
i |
1 |
+ |
ass |
4 |
! |
|
номер |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
7. Практична частина
7.1 Опис програмної реалізації вибраного алгоритму
Програма написана на мові високого рівня JAVA. Для компіляції програми необхідно мати JAVA (JDK, JRE)віртуальну машину та середовище програмування(Eclipse, NetBeans та ін.). Програма запускається за допомогою програмного середовища, шляхом відкриття файлу kursak.java.
Для зручності ми самі вибираємо файл, який потрібно скомпілювати. На виході отримуються файли 3.txt(числа),4.txt(змінні) та L_A.txt(лексичний аналіз).
7.2 Загальний алгоритм роботи програми
Рис.3 Загальний алгоритм роботи програми
Спочатку текст програми перевіряється лексичним аналізатором, створюється файл лексем, а також файли використаних ідентифікаторів і чисел. Якщо під час лексичного аналізу знайдена лексична помилка, видається про це відповідне повідомлення, і компіляція припиняється.
Після успішного виконання лексичного аналізу, програма переходить до синтаксичного аналізу. На вхід йде файл лексем, якщо під час синтаксичного аналізу знайдена помилка, видається про це відповідне повідомлення, і компіляція припиняється.
Після успішного виконання синтаксичного аналізу, алгоритм переходить до семантичного аналізу. На вхід іде файл лексем, якщо під час семантичного аналізу знайдена семантична помилка, видається про це відповідне повідомлення, і компіляція припиняється.
Після успішного виконання семантичного аналізу видається повідомлення про успішну компіляцію тексту програми.
7.3 Опис логічної структури програми
Рис 4. Візуальне представлення програми
Після запуску програми відкривається форма «Курсова робота»(Рис. 3). В ній розміщені 2 текстові області(jTextAreа, jTextArea1) та меню. Меню складається з пунків: «Файл» та «Компілювати».
Для зручності програма дає користувачу можливість самому обрати розташування коду програми на модельній мові(Рис 4)шляхом нажаття пункту «Файл»->«Відкрити» . Після вибору файлу розширення .txt та нажаття кнопки «Відкрити файл» область jTextArea буде заповнена текстом.
Рис 5. Форма для вибору файлу
Щоб скомпілювати код відкритої програми слід нажати «Компілювати». Результатом буде заповнена текстова область jTextArea1, яка буде показувати чи компіляція була завершено успішно.
Для того щоб завершити роботу з программою слід нажатии пункт «Вихід» у меню «Файл».
7.4 Результати виконання програми
1) Результат виконання при правильно написаній програмі
2) Неправильно описане число
3) Неправильно описаний ідентифікатор
4) Пропущена дужка
5) Не описаний ідентифікатор
6) Різні типи у виразах
Висновки
На даній курсовій роботі, я закріпив знання, які я отримав під час вивчення курсу Лінгвістичне забезпечення САПР. Оволодів знаннями про основні стадії компіляції, формальні граматики, форми внутрішнього представлення вхідної інформації.
Я розробив власний компілятор, який по заданих граматиках перевіряє правильність тексту з точки лексичного, синтаксичного та семантичного контролю.
При розробці лінгвістичного забезпечення потрібно звернути особливу увагу на формальні граматики, так як вони є потужним математичним інструментом який використовується математичній та комп'ютерній лінгвістиці, описі мов програмування, розробці компіляторів в теорії програмування.
Лінгвістичне забезпечення САПР є необхідною складовою під час розробки систем САПР, так як за допомогою лінгвістичного забезпечення, ми можемо створювати взаємодію машини - ЕОМ і людини - користувача системи САПР.
Список використаних джерел
1. Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий 2-е изд. -- М.: Вильямс, 2008
2. Серебряков В.И. Лекции по конструированию компиляторов. - М.: МГУ, 1997. - 171с.
3. Герберт Шилдт. Полный справочник по Java SE6. - Киев 2007.
Размещено на Allbest.ru
...Подобные документы
Модель аналізу-синтезу компіляції. Формальний опис вхідної мови програмування. Вибір технології програмування, проектування таблиць транслятора та вибір структур даних. Опис програми реалізації лексичного аналізатора. Розробка дерев граматичного розбору.
курсовая работа [75,8 K], добавлен 26.12.2009Мови програмування. Алгоритм програми, функціональні обмеження на застосування. Опис логічної структури. Типи комп'ютерів, що використовуються при роботі програми. Виклик і завантаження. Організація, характер та попередня підготовка вихідних даних.
курсовая работа [95,0 K], добавлен 01.04.2016Вивчення складових частин, основних принципів побудови і функціонування компіляторів. Поняття хешування, сутність алгоритму роботи лексичного аналізатора. Практичне освоєння методів побудови простих компіляторів для заданої вхідної мови - Borland Delphi.
дипломная работа [763,6 K], добавлен 27.05.2013Розробка програми стеження за натиснутими клавішами клавіатури. Програмне забезпечення, необхідне для функціонування програми, мови програмування. Опис логічної структури, алгоритм програми та її зв'язок з іншими програмами. Характер та організація даних.
курсовая работа [375,4 K], добавлен 01.04.2016Програми і мови програмування. Алфавіт мови програмування. Лексеми, зарезервовані слова мови Pascal. Ідентифікатори, типи даних. Арифметичні вирази, операції. Стандартні функції, структура програми. Процедури введення-виведення. Правила написання команд.
лекция [445,0 K], добавлен 24.07.2014Розробка програми автоматизації роботи з матрицями. Оформлення даних у вигляді матриць цілих чисел. Перелік операцій над матрицями, які реалізуються у програмі. Програмне забезпечення, мови програмування. Опис логічної структури та алгоритм програми.
курсовая работа [312,2 K], добавлен 01.04.2016Позначення та назва програми, технічне забезпечення, необхідне для функціонування. Призначення програми, функціональні обмеження на застосування. Опис логічної структури, алгоритм. Типи комп'ютерів та пристроїв, що використовуються при роботі програми.
курсовая работа [284,0 K], добавлен 01.04.2016Прості та умовні оператори мови С++. Робота з двовимірними масивами. Пошук та сортування даних. Робота з файлами та з динамічними структурами даних. Опис мови програмування Delphi. Складення програми до розроблених алгоритмів. Організація циклів.
отчет по практике [4,3 M], добавлен 28.08.2014Огляд існуючих методів розробки компіляторів, детальний опис мови. Характеристика та специфіка процесу розробки програми компілятора на рівні блок-схем і тексту програми. Подання тексту компілятора, а також результатів тестування розробленої програми.
курсовая работа [510,2 K], добавлен 03.06.2011Використання мови програмуванння Java при виконанні "задачі лінійного програмування": її лексична структура і типи даних. Методи розв’язання задачі. Особливості логічної структури програми, побудова її зручного інтерфейсу за допомогою симплекс методу.
курсовая работа [437,9 K], добавлен 24.01.2011Позначення і назва програми, забезпечення, необхідне для її функціонування. Опис логічної структури, алгоритм, структура. Типи комп'ютерів і пристроїв, що використовуються при роботі програми. Формат, описання та спосіб кодування вхідних і вихідних даних.
курсовая работа [163,6 K], добавлен 01.04.2016Проектування бази даних (БД). Проектування логічної моделі БД. Реалізація БД та створення таблиць. Встановлення зв’язків, вибір мови та середовища програмування. Опис функціональних елементів та реалізація програми. Опис та тестовий приклад програми.
дипломная работа [1,6 M], добавлен 07.01.2017Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Методика розробки компілятору з вхідної мови програмування Pascal, оболонка, якого розроблена в середовищі програмування Borland C під операційну систему Windows. Блок-схема програми. Розробка оптимізатора та генератора коду. Тестування компілятора.
курсовая работа [218,6 K], добавлен 04.06.2011Методи використання предикатів Cut, Fail. Організація циклу (repeat), складання програми. Алгоритм роботи зі списками та рядками. Елементарні операції і базові функції мови програмування Лісп. Робота зі складними типами даних на прикладі бази даних АТС.
контрольная работа [219,3 K], добавлен 17.06.2011Розробка програми для спрощення та автоматизації обчислення інтегралів методом трапецій у визначених межах інтегрування із заданою точністю. Елементи програми "Інтеграл", алгоритм, способи логічної структуризації, засоби обміну даними, мова програмування.
курсовая работа [234,5 K], добавлен 12.12.2013Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.
курсовая работа [3,4 M], добавлен 17.11.2014Характеристика методів та етапів створення простих програм на мові програмування С++. Особливості структури та порядку запуску програми. Функції вводу і виводу та маніпулятори мови С++. Робота з одновимірними масивами. Символьна інформація та рядки.
дипломная работа [91,2 K], добавлен 19.06.2010Характеристика предметної області: FTP-server для ОС Windows. Шляхи встановлення FTP-серверу в ОС Windows. Опис мови та середовища програмування, компонентів та функцій програми. Аналіз реалізованої програми FTP-клієнта. Тестовий запуск та опис програми.
курсовая работа [1,7 M], добавлен 22.06.2017Розробка кросплатформового інструменту електронного тестування учнів молодших та середніх класів по іноземній мові. Вибір середовища розробки та системи контролю версій. Опис мови програмування Java та лістинг програми. Апаратні та програмні вимоги.
дипломная работа [608,3 K], добавлен 26.10.2010