Введення
Тема, мета, актуальність роботи
Аналіз проектів, реалізованих на мовах програмування Java і C # на предмет взаємодії між класами.
Результат роботи програми необхідно вивести у файл *. xml.
Актуальність роботи полягає в тому, що на сьогоднішній день немає відомих аналогів програми. Не варто порівнювати цей проект із такими програмними продуктами як Telelogic Rapsody або Rational - він є повною протилежністю названих вище програм, так як аналізує вже «готовий», написаний проект, в той час як Telelogic Rapsody (Rational) генерує код по діаграмах.
Даний проект може використовуватися для поглибленого вивчення мов програмування Java і C # в рамках програми університету, аналізу проектів на предмет взаємодії класів.
Проект може існувати як автономне застосування, а також може бути доповнений і доопрацьований функціонально.
Дослідницька частина
C # і Java-два дуже схожих між собою сучасних мови програмування із збіркою сміття і компіляцією при виконанні. Обидві мови - об'єктно-орієнтовані, з синтаксисом, успадкованим від C + +, але значно переробленим.
Java - об'єктно-орієнтована мова програмування, що розробляється компанією Sun Microsystems і офіційно випущений 23 травня 1995 року. Java - так називають не тільки сама мова, але і платформу для створення додатків рівня підприємств на основі цієї мови.
Спочатку мова програмування називався Oak (укр. Дуб) і розроблявся Джеймс Гослінг для побутової електроніки, але згодом був перейменований в Java і став використовуватися для написання клієнтських додатків і серверного програмного забезпечення. Програми на Java транслюються в байт-код, що виконується віртуальної java-машиною (JVM) - програмою, що обробляє байтовий код і передавальної інструкції устаткуванню як інтерпретатор, але з тією відмінністю, що байтовий код, на відміну від тексту, обробляється значно швидше. Гідність подібного способу виконання програм - в повній незалежності байт-коду від ОС і устаткування, що дозволяє виконувати Java-додатки на будь-якому пристрої, що підтримує віртуальну машину. Іншою важливою особливістю технології Java є гнучка система безпеки завдяки тому, що виконання програми повністю контролюється віртуальною машиною.
Довжини і діапазони значень примітивних типів визначаються стандартом. Така жорстка стандартизація була необхідна, щоб зробити мову платформо-незалежним, що є одним з ідеологічних вимог до Java і однією з причин її успіху. Тим не менш, одна невелика проблема з платформної незалежністю все ж залишилася. Деякі процесори використовують для проміжного зберігання результатів 10-байтові регістри або іншими способами поліпшують точність обчислень.
У мові Java є тільки динамічно створювані об'єкти. Причому змінні об'єктного типу та об'єкти в Java - абсолютно різні сутності. Змінні об'єктного типу є посиланнями, тобто неявними покажчиками на динамічно створювані об'єкти. Це підкреслюється синтаксисом опису змінних.
C # (Вимовляється сі-шарп) - мова програмування, що поєднує об'єктно-орієнтовані і аспектно-орієнтовані концепції. Розроблений в 1998 - 2001 роках групою інженерів під керівництвом Андерса Хейлсберг в компанії Microsoft як основна мова розробки додатків для платформи Microsoft.NET. C # відноситься до сім'ї мов з C-подібним синтаксисом, з них його синтаксис найбільш близький до С + + і Java. Мова має строгу статичну типізацію, підтримує поліморфізм, перевантаження операторів, вказівники на функції-члени класів, атрибути, події, властивості, винятку, коментарі у форматі XML. Перейнявши багато що від своїх попередників - мов С + +, Java, Delphi, Модула і Smalltalk - С #, спираючись на практику їх використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем: так, C # не підтримує множинне спадкування класів (на відміну від C + +).
У Java модифікатор protected в описі, крім доступу з класів-нащадків, надати їм доступ з усіх класів, що входять в той самий пакет, що й клас-власник.
В C # для об'єктів, які повинні бути видно в межах збірки (приблизний аналог пакету Java) введено окремий модифікатор internal, а protected зберігає свій початковий сенс, взятий з C + + - доступ тільки з класів-нащадків. Допускається комбінувати internal і protected - тоді вийде область доступу, відповідна protected в Java.
Внутрішні класи в C # мають доступ тільки до статичних членам зовнішнього класу, а для доступу до нестатичні членам потрібно явно вказувати примірник зовнішнього класу. Локальні внутрішні класи в C # не підтримуються, обробка подій в ньому не вимагає таких класів, оскільки будується на інших механізмах. В обох мовах методи, за аналогією з C + + - функції, визначені в класі. Тіло методу розташовується всередині опису класу. Підтримуються статичні методи, абстрактні методи. У C # також є явна реалізація методів інтерфейсу, що дозволяє класу реалізовувати методи інтерфейсу окремо від власних методів або давати різні реалізації однойменних методів, що належать двом різним інтерфейсів. C # також підтримує явне опис передачі параметрів по посиланню (ключові слова ref і out). При використанні out компілятор контролює наявність в методі надання значення. C # дозволяє створювати користувацькі типи-значення, використовуючи ключове слово struct. Це пряме спадщина мови С + + від якого творці Java свідомо відмовилися.
Java підтримує імпорт статичних імен (import static) з класів, що дозволяє окремо імпортувати деякі або всі статичні методи та змінні класу і використовувати їх імена без кваліфікації імпортуючий модулі. У C # імпортується тільки складання і при кожному використанні імпортованих статичних імен потрібне вказувати клас.
У Java константи в оператори switch повинні ставитися або до целочисленному, або до перераховуваній типу. У C # в switch можна використовувати текстові рядки.
Java містить конструкцію strictfp, гарантує однакові результати операцій з плаваючою точкою на всіх платформах.
C # містить конструкції checked і unchecked, що дозволяють локально вмикати і вимикати динамічну перевірку арифметичного переповнення.
C # підтримує оператор переходу goto. Звичайне використання - передача управління на різні мітки case в операторі switch і вихід із вкладеного циклу. У Java від використання goto свідомо відмовилися.
Java підтримує мітки в циклах і дозволяє використовувати їх у командах break і continue, завдяки чому виключається такий привід використання goto, як вихід із вкладеного циклу.
C # підтримує окреме поняття іменованої типізованої константи і ключове слово const. У Java констант як таких немає, замість них використовуються статичні змінні класу з модифікатором final - Ефект від їх використання точно такий же.
Розробка транслятора
Розробка лексичного аналізатора
Алфавіт мови
Великі і малі літери англійського алфавіту: a.. Z, A.. Z
Цифри: 0,1,2,3,4,5,6,7,8,9.
Інші символи: '<', '>', ':', ',',''','; ',' {», '}', '(",') '
Класи лексем
зарезервовані слова;
знаки операцій та роздільники;
літерали;
ідентифікатори
Лексика мов
Клас ідентифікатори: до цього класу відносяться всі набори ланцюжків, крім зарезервованих слів
Клас зарезервованих слів:
Для C #
using, class, int, float, char, public, protected, private, return, namespace
Для Java
using, class, int, float, char, public, protected, private, return
Клас знаків операцій і роздільників:
() {}:; = ->. , '*
Клас літералів:
Літерал - цілочисельна або текстова константа.
Структура таблиці ідентифікаторів
ім'я | номер у класі | тип |
Структура таблиці літералів
ім'я | тип |
Розробка синтаксичного аналізатора
Граматика мов
У даному проекті досліджується лише мала частина можливостей і особливостей вищевказаних мов. У зв'язку з цим спроектовані граматики для цих мов включатимуть лише ті структури мови, які нам необхідні
Граматика С #
1 <програма>: = 2 <предпроцессор> 3 namespace 4 {5 <оператори> 6}
7 <предпроцессор>: = 9 using 10 <предпроцессор>
8 <предпроцессор>: = 11 е
12 <оператори>: = 16 <клас> 17 <оператори>
13 <оператори>: = 18 ідентифікатор 19 <продолженіе1>
20 <оператори>
14 <оператори>: = 21 е
15 <оператори>: = 22 <декларація> 23 <оператори>
24 <клас>: = 25 class 26 ідентифікатор 27 <спадкування> 28 {29 <оператори> 30} 31;
32 <спадкування>: = 34: 35 ідентифікатор
33 <спадкування>: = 36Е
37 <продолженіе1>: = 40. 41 ідентифікатор 42 <продолженіе2> 43;
38 <продолженіе1>: = 44 <продолженіе2> 45;
39 <продолженіе1>: = 46;
47 <продолженіе2>: = 49 (50)
48 <продолженіе2>: = 80 е
51 <декларація>: = 52 <тип> 53 ідентифікатор 55 <продолженіе3>
56 <продолженіе3>: = 58 (59) 60 (61 <оператори> 62 return 63 літерал 64; 81)
57 <продолженіе3>: = 65 <продолженіе4>
66 <продолженіе4>: = 68, 69 ідентифікатор 70 <продолженіе4>
67 <продолженіе4>: = 71;
72 <тип>: = 76 int
73 <тип>: = 77 float
74 <тип>: = 78 char
75 <тип>: = 79 ідентифікатор
Граматика java
1 <програма>: = 2 <предпроцессор> 3 <оператори>
7 <предпроцессор>: = 9 using 10 <предпроцессор>
8 <предпроцессор>: = 11 е
12 <оператори>: = 16 <клас> 17 <оператори>
13 <оператори>: = 18 ідентифікатор 19 <продолженіе1>
20 <оператори>
14 <оператори>: = 21 е
15 <оператори>: = 22 <декларація> 23 <оператори>
24 <клас>: = 25 class 26 ідентифікатор 27 <спадкування> 28 {29 <оператори> 30} 31;
32 <спадкування>: = 34: 35 ідентифікатор
33 <спадкування>: = 36Е
37 <продолженіе1>: = 40 -> 41 ідентифікатор 42 <продолженіе2> 43;
38 <продолженіе1>: = 44 <продолженіе2> 45;
39 <продолженіе1>: = 46;
47 <продолженіе2>: = 49 (50)
48 <продолженіе2>: = 80 е
51 <декларація>: = 52 <тип> 53 <посилання> 54 ідентифікатор 55 <продолженіе3>
56 <продолженіе3>: = 58 (59) 60 (61 <оператори> 62 return 63 літерал 64; 81)
57 <продолженіе3>: = 65 <продолженіе4>
66 <продолженіе4>: = 68, 69 ідентифікатор 70 <продолженіе4>
67 <продолженіе4>: = 71;
72 <тип>: = 76 int
73 <тип>: = 77 float
74 <тип>: = 78 char
75 <тип>: = 79 ідентифікатор
82 <посилання>: = 84 *
83 <посилання>: = 85 e
Доказ приналежності до LL (1) - граматики
С #
<Предпроцессор> = {using | namespace}
<Оператори> = {class | ідентифікатор |} | int | float | char}
<Спадкування> = {: | {}
<Продолженіе1> = {. | (|;)
<Продолженіе2 >={(|;)
<Продолженіе3 >={(|, |;)
<Продолженіе4> = {, |;}
<Тип> = {int | float | char | ідентифікатор}
Граматика java
<Предпроцессор> = {using | class | ідентифікатор | int | float | char}
<Оператори> = {class | ідентифікатор | int | float | char}
<Спадкування> = {: | {}
<Продолженіе1 >={-> | (|;)
<Продолженіе2 >={(|;)
<Продолженіе3 >={(|, |;)
<Продолженіе4> = {, |;}
<Тип> = {int | float | char | ідентифікатор}
<Посилання> = {* | ідентифікатор}
Таблиці розбору
Таблиця розбору С #
№ | Очікуваний термінал | Перехід | Прийняти | У стек | З стека | Помилка |
1. | ~ | 2 | - | - | - |