Конвертер програми з підмножини мови Сі в Паскаль з допомогою LL (1) методу синтаксичного аналізу (выражения)
З допомогою СІ можна зробити це, що у Паскале вдіяти не можна (чи практично неможливо) — наприклад, написати фрагмент ОС (чи нову операційну систему), утиліти тощо. Так, ряд трансляторів з Паскаля написані на СІ; зворотне неможливо уявити. У той самий час, неодноразово зазначалося, що прикладні програми, написані Паскале, відрізняються більшої надійністю, ніж написані СІ; їх легше читати… Читати ще >
Конвертер програми з підмножини мови Сі в Паскаль з допомогою LL (1) методу синтаксичного аналізу (выражения) (реферат, курсова, диплом, контрольна)
Новокузнецький филиал-институт.
Кемеровський Державний Университет.
Факультет Інформаційних Технологий.
Кафедра Автоматизованих Систем.
КУРСОВА РАБОТА.
Дисциплина:
" Мови програмування й фізичні методи трансляції «.
Тема:
" Конвертер програми з підмножини мови Сі в Паскаль з допомогою LL (1) методу синтаксичного анализа.
(висловлювання) «.
Выполнили:
Студенти групи ИАС-00.
Мардасова У. А.
Шалудько У. А.
Проверил:
Бочаров М. И.
Новокузнецьк, 2002 г.
При знайомство з мовою СІ, особливо — по вивчення Паскаля і Бейсика, занурення у деталі його образотворчих коштів може затушувати важливу думку: хоча СІ написати будь-яку прикладну програму, він спочатку при цьому не призначений. СІ є наслідком еволюційного розвитку мов створення системних програмних засобів. Якщо прикладному програмуванні еволюція йшла від Фортрану до Алголу, Коболу, Паскалю тощо., то системному — від Ассемблеров, прив’язаних до архітектури ЕОМ, до СІ, для якого створено трансляторы, які його хоч й незалежною від архітектури, але з що основного предназначения.
З допомогою СІ можна зробити це, що у Паскале вдіяти не можна (чи практично неможливо) — наприклад, написати фрагмент ОС (чи нову операційну систему), утиліти тощо. Так, ряд трансляторів з Паскаля написані на СІ; зворотне неможливо уявити. У той самий час, неодноразово зазначалося, що прикладні програми, написані Паскале, відрізняються більшої надійністю, ніж написані СІ; їх легше читати, передавати від одного програміста іншому для вдосконалювання і супроводу. Це пов’язана з тим, що Паскаль містить значно більше обмежень і є мовою вищого рівня із сильною типизацией даних. Для мови ж, призначеним і розробити системного програмного забезпечення, що менше обмежень, краще; це у СІ можливі неявні перетворення всіх базових типів даних, і покажчиків один одного, що вкрай бажано під час створення системних коштів, але за неуважності програміста призводить до помилок, не улавливаемым транслятором з СІ (Паскаль такі неприпустимі операції припиняє немедленно).
Зрозуміло, сказане вище годі було абсолютизувати. Програмісти, які звикли СІ, успішно пишуть у ньому програми різних класів. Це стосується як СІ - згадайте про експертних системах, написаних на Бейсике. У той самий час, при масовому програмуванні дотримуватися «розподіл праці «між мовами видається більш естественным.
Широкій популярності Паскаля серед програмістів сприяють такі причины:
. Завдяки своєї компактності, вдалому початкового описанию.
Паскаль виявилося досить легенею для изучения.
. Мова програмування Паскаль відбиває фундаментальні і найважливіші концепції (ідеї) алгоритмів в очевидною і легко сприймають формі, що надає програмісту кошти, які допомагають проектувати программы.
. Мова Паскаль дозволяє чітко реалізувати ідеї структурного програмування і структурної організації данных.
. Мова Паскаль відіграв велику роль розвитку методів аналітичного докази правильності програм, тож дозволив реально вийти з методів налагодження програм до систем автоматичної перевірки вмотивованості программ.
. Застосування мови Паскаль значно підняло «планку «надёжности розроблюваних програм рахунок вимог Паскаля до опису які у програмі змінних, перевірки узгодженості програми при компіляції без її выполнения.
. Використання в Паскале і гнучких структур управління: розгалужень, циклов.
З іншого боку мову програмування СІ - це універсальну мистецьку мову з багатим набором операторів і компактним способом записи висловів. Завдяки гнучкості, виразності і компактності своєї конструкції СІ завоював найбільшу популярність у середовищі професійних програмістів і широко використовується розробки системних і прикладних программ.
Мова СІ є вдалий компроміс між бажанням розташовувати тими можливостями, які зазвичай надають програмісту настільки зрозумілі й зручні мови високого рівня, і прагненням ефективно використовувати особливості комп’ютера. Крім набору коштів, властивих сучасним мовам програмування високого рівня (структурність, модульність, зумовлені типи даних) у нього включено кошти на програмування «майже «лише на рівні ассемблера (використання покажчиків, побітові операції, операції зсуву). Великий набір операторів дозволяє писати компактні й ефективні програми. Проте, такі потужні кошти вимагає від програміста обережності, акуратності й хорошого знання мови із його перевагами та недоліками. На відміну від мов програмування типу Паскаль, потребують жорсткої дисципліни програмування обмежують свободу програміста, сприяють усунення багатьох помилок поки що не стадії трансляції, мову СІ надає програмісту найбільшу свободу. Проте, відповідальність за коректність програм у своїй повністю лягає на його программиста.
Нині є велика кількість систем програмування на СІ до різних типів комп’ютерів. Розроблено багато бібліотек модулів, інструментальних коштів розробки та налагодження, які полегшують створення нових програм. Програми на СІ мають високу мобільність, без жодних змін вони переносяться, транслюються і виконуються машинами різного типа.
У межах навчального проекту реалізована програмна система, звана надалі конвертором, що дозволяє автоматизувати процес перетворення програм на Паскале у випуску програми мовою СІ. На вхід конвертора подається синтаксично правильна програма на Паскале, на виході його формується еквівалентна їй програма мовою СИ.
Завдання розробки конвертора належить до класу завдань автоматизації реинженеринга програм з застарілих мов на сучасні мови програмування й побудувати нові платформи. Розробка конвертора для мови Паскаль є дуже трудоёмкой через особливості синтаксису і семантики мови Паскаль.
Мова Паскаль передбачає використання принципів замовчувань і скорочень, вимагає суворого дотримання відповідності типів даних, у ньому жорстко регламентовані структура і важливе місце описи програмних объектов.
З огляду на вище сказаного, навіть ручний переклад програми на Паскале на мову СІ жадає від програміста докладання значних інтелектуальних зусиль, а реалізація конвертора для мови Паскаль можлива лише за наявності істотних тимчасових і матеріальних ресурсів. Крім синтаксичних обмежень вхідні програма конвертора має низку суто семантичних обмежень, що з реалізацією власне конвертора. Перерахуємо основні з них:
. Обмежене використання типів даних, може підтримуються лише арифметичні типи данных.
. Вкладеність блоків, у яких використовуються однойменні об'єкти, має перевищувати двох уровней.
. Процедурні блоки нічого не винні бути всередині BEGIN-блоков, вкладеність процедурних блоків не ограничивается.
. Допускається використовувати лише одномірні масиви із відкритою правої кордоном (динамічні масиви) як параметрів процедурних блоків; у своїй адресуються елементи масиву в Паскаль програмі, починаючи з нульового элемента.
. Обмежене використання змішання різних типів данных.
Висловлювання в Паскале.
Конструкція мови, задающая порядок виконання дії над елементами даних, називається вираженням. Вислів складається з операндов (operand — елемент даних, що у операції), — величин і висловів, над якими виробляється операція (константи і які змінюються всіх типів, звернення функцій); круглих скобок і знаків операцій. Операції визначають дії, що треба виконати над операндами. Наприклад, в вираженні (X+Y-10) X, Y і десяти — операнды; а «+ «і «- «- знаки операцій складання і вычитания.
У найпростішому разі вираз може складатися з однієї перемінної чи константи. Круглі дужки ставляться як і, як і у звичних арифметичних висловлюваннях керувати асоціативністю і порядком виконання операций.
Операції у мові Паскаль діляться на арифметичні, відносини, логічні (булевские), операцію @, строковые та інших. Висловлювання відповідно називаються арифметичними, відносини, булевскими, строковыми тощо. залежно від цього, якого типу операнды та проведення операції в них используются.
Тип значення, вычисляемого з допомогою висловлювання, визначається типом його операндов і знаками виконуваних з них операций.
Операції може бути унарными і бінарними. У першому випадку операція належить одного операнду і завжди записується проти нього, у другому — операція висловлює ставлення між двома операндами і записується між ними.
Наприклад, -А — унарная операція, Х+У — бинарная.
Арифметичні вислови й операции.
Арифметичним називається вираз, складене з операндов арифметичного типу, і що використовує лише знаки арифметичних операцій та круглі дужки. Порядок обчислення визначається дужками і старшинством операций.
Арифметичне вираз породжує ціле, або дійсне (речовинне) значення. Найбільш простими формами арифметичних висловів є:. Ціла чи справжня константа без знака;. Ціла чи справжня змінна;. Елемент масиву цілого чи дійсного типу;. Функція, приймаюча ціле, або дійсне значение.
Значення перемінної чи елемента масиву має бути визначено до їх появи у арифметическом вираженні. Інші арифметичні висловлювання складаються з перелічених вище простих форм шляхом застосування круглих скобок і арифметичних операций.
Арифметичні операції виконують арифметичні дії висловлюваннях над значеннями операндов цілочислових і речовинних типів. Арифметичні операції мови Паскаль представлені у таблице1.
Арифметичні операції |Операція |Дія |Типи операндов |Тип результату | |Бінарні | |+ |Складання |Цілий |Цілий | | | |Речовинний |Речовинний | |- |Віднімання |Цілий |Цілий | | | |Речовинний |Речовинний | |* |Множення |Цілий |Цілий | | | |Речовинний |Речовинний | |/ |Розподіл |Цілий |Речовинний | | | |Речовинний |Речовинний | |DIVX |Целочисленное розподіл |Цілий |Цілий | |MOD |Залишок від розподілу |Цілий |Цілий | |AND |Арифметичне І |Цілий |Цілий | |SHL |Зрушення вліво |Цілий |Цілий | |SHR |Зрушення вправо |Цілий |Цілий | |OR |Арифметичне АБО |Цілий |Цілий | |XOR |Виключає диз’юнкція |Цілий |Цілий | | | | | | |Унарные | |+ |Збереження знака |Цілий |Цілий | | | |Речовинний |Речовинний | |- |Заперечення знака |Цілий |Цілий | | | |Речовинний |Речовинний | |NOT |Арифметичне заперечення |Цілий |Цілий |.
Висловлювання та постійні операції отношения.
Вираженням відносини називається словосполучення мови, у якому два висловлювання пов’язані знаком операції відносини. Вислів відносини визначає істинність чи неправдивість результату. Операції відносини виконують порівняння двох операндов визначають, істинно значення висловлювання чи ложно.
У мові Паскаль операції взаємини спікера та розглянуті нижче булевские операції важливіші під час написання програм, ніж у сусідніх мовами, оскільки вони інтенсивно йдуть на реалізації разветвляющихся і циклічних алгоритмів. У таблиці 2 наведено операції відносини, допустимі в версії мови Паскаль для ПЭВМ.
Порівнянні величини можуть належати до будь-якого скалярному чи перечисляемому типу даних. Результат має булевский тип і приймає з двох значень: True (істина) чи False (ложь).
Операції відносини. |Операция|Название |Вислів |Результат | |= |Так само |A=B |True, якщо, А одно У | | |Не одно |AB |True, якщо, А одно У | |> |Більше |A>B |True, якщо, А більше У | |< |Менше |A= |Більше або дорівнює |A>=B |True, якщо, А більше або одно У | |=B | B= П | П=B П (+C B (BBB' 28. B1(BB' 44. B'(=BB' 46. B'(=П 10. B'(| | |27 | | |43 | | | | | | | |< | | |28 | | |44 | | | | | | | |- | | |26 | | |42 | | | | | | | |+ | | |25 | | |41 | | | | | | | |/ | | |24 | | |40 | | | | | | | |* | | |23 | | |39 | | | | | | | |% | | |22 | | |38 | | | | | | | |— |56 |20 |7 |15 | | | | | | | | | |++ |57 |21 |8 |17 | | | | | | | | | |K | | | |18 | | | | | | | | | |I |54 |1 | |12 | | | |16 | | | | | |) | | |37 | | |53 |13 | |19 |59 |10 | | |(|55 |11 |9 |14 | | | | | | | | | | |P.S |B |B1 |B2 |B3 |B' |З |C1 |C2 |P.S' |S1 |# |.
Керуюча таблиця висловлення мовою Turbo Pascal 7.0.
||- | | |11 | |32 | |23 | | |19 |38 |39 | |Or | | | | |32 | |23 | | |18 | | | |= | | |9 | |32 | |23 | | |19 | | | |> | | |7 | |32 | |23 | | |19 | | | |< | | |6 | |32 | |23 | | |19 | | | | | | |8 | |32 | |23 | | |19 | | | |= | | |5 | |32 | |23 | | |19 | | | |And | | | | |31 | |23 | | | | | | |Mod | | | | |30 | |23 | | | | | | |DivX | | | | |29 | |23 | | | | | | |/ | | | | |28 | |23 | | | | | | |* | | | | |27 | |23 | | | | | | |- |34 |2 | | |32 | |23 | |13 |17 | | | |+ |33 |1 | | |32 | |23 | |12 |16 | | | |, | | |11 | |32 | |23 | | |19 |37 | | |I |35 |3 | |25 | |20 | | |14 | | | | |) | | |11 | |32 | |23 |24 | |19 |38 | | |(|36 |4 | |26 | |21 |22 | |15 | | | | | |P.S |B |B' |З |З' |M |M' |M1 |П |П' |P.S' |# |.
Приклад роботи програми Ввели вираз мовою СІ: КУРСОВА РОБОТА ПО ЯПМТ Виберете мову: 1 — СІСІ++ 2 — Turbo Pascal 7.0 1 Напишіть вираз мовою З: (e+e==7) Дескрипторный текст: 0 2 9 2 16 2 1.
Заменить (S ", В2) Сдвиг.
Заменить (C, В1) Сдвиг.
Заменить (В ", У) Сдвиг.
Заменить (В1) Сдвиг.
Заменить (В ", У) Сдвиг.
Заменить (В1) Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Виштовхнути Держать.
Заменить (В ") Сдвиг.
Виштовхнути Держать.
Виштовхнути Тримати ДОПУСТИТИ Вихідна стрічка: 55 12 25 1 31 1 37 53 53 13 53 59 60.
Ввели не вираз: КУРСОВА РОБОТА ПО ЯПМТ Виберете мову: 1 — СІСІ++ 2 — Turbo Pascal 7.0 1 Напишіть вираз мовою З: t+ Дескрипторный текст: 2 9.
Заменить (S ", В1) Сдвиг.
Заменить (В ", У) Зрушення Відкинути Вихідна стрічка: 54 25 0.
Ввели вираз на Паскале: КУРСОВА РОБОТА ПО ЯПМТ Виберете мову: 1 — СІСІ++ 2 — Turbo Pascal 7.0 2 Напишіть вираз мовою TP: ww=s+1 Дескрипторный текст: 2 11 2 4 2.
Заменить (В «П «З «M ») Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Виштовхнути Держать.
Заменить (П) Сдвиг.
Заменить (П «З «M ») Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Заменить (П «З) Сдвиг.
Заменить (C «M ») Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Виштовхнути Тримати ДОПУСТИТИ Вихідна стрічка: 3 23 32 19 5 14 23 32 16 25 23 32 19 39 Ввели не вираз КУРСОВА РОБОТА ПО ЯПМТ Виберете мову: 1 — СІСІ++ 2 — Turbo Pascal 7.0 2 Напишіть вираз мовою TP: f=s+ Дескрипторный текст: 2 11 2 4.
Заменить (В «П «З «M ») Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Виштовхнути Держать.
Заменить (П) Сдвиг.
Заменить (П «З «M ») Сдвиг.
Виштовхнути Держать.
Виштовхнути Держать.
Заменить (П «З) Зрушення Відкинути Вихідна стрічка: 3 23 32 19 5 14 23 32 16 0.
Лістинг программы:
#include #include #define n 100 #define t 17 #define m 53 #define g 11.
char s1[n], s[n], a[n]; int j=0,h, vl[n], y=0;
/*—————————————-ВВОД ВИСЛОВЛЮВАННЯ———————————————*/ int vvod () { int і; printf («tttКУРСОВАЯ РОБОТА ПО ЯПМТn »); printf («Виберете мову: 1 — СІСІ++ 2 — Turbo Pascal 7.0n »); scanf («%d » ,&y); if (y==1).
printf («Напишіть вираз мовою С: n »); {for (i=0;i.