48695 (Разработка транслятора в среде Java и С+)
Описание файла
Документ из архива "Разработка транслятора в среде Java и С+", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48695"
Текст из документа "48695"
Введение
Тема, цель, актуальность работы
Анализ проектов, реализованных на языках программирования 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
20
14 := 21 е
15 := 22 23
24 := 25 class 26 идентификатор 27 28 {29 30} 31;
32:= 34: 35 идентификатор
33:= 36е
37:= 40. 41 идентификатор 42 43;
38:= 44 45;
39:= 46;
47 := 49 (50)
48 := 80 е
51 := 52 53 идентификатор 55
56:= 58 (59) 60 (61 62 return 63 литерал 64; 81)
57:= 65
66 := 68, 69 идентификатор 70
67 := 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
20
14 := 21 е
15 := 22 23
24 := 25 class 26 идентификатор 27 28 {29 30} 31;
32:= 34: 35 идентификатор
33:= 36е
37:= 40 -> 41 идентификатор 42 43;
38:= 44 45;
39:= 46;
47 := 49 (50)
48 := 80 е
51 := 52 53 54 идентификатор 55
56:= 58 (59) 60 (61 62 return 63 литерал 64; 81)
57:= 65
66 := 68, 69 идентификатор 70
67 := 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}
={: | {}
={. | (|;)
={(|;)
={(|, |;)
={, |;}
={int | float | char | идентификатор}
Грамматика java
={using | class | идентификатор | int | float | char}
={class | идентификатор | int | float | char}
={: | {}
={-> | (|;)
={(|;)
={(|, |;)
={, |;}
={int | float | char | идентификатор}
={* | идентификатор}
Таблицы разбора
Таблица разбора С#
№ | Ожидаемый терминал | Переход | Принять | В стек | Из стека | Ошибка |
1. | ~ | 2 | - | - | - | - |
2. | ~ | 7 | - | - | - | - |
3. | namespace | 4 | + | - | - | + |
4. | { | 5 | + | - | - | + |
5. | ~ | 12 | - | + | - | - |
6. | } | 0 | + | - | + | + |
7. | using | 9 | - | - | - | - |
8. | ~ | 11 | - | - | - | - |
9. | using | 10 | + | - | - | + |
10. | ~ | 7 | - | - | - | - |
11. | ~ | 3 | - | - | - | - |
12. | class | 16 | - | - | - | - |
13. | идентификатор | 18 | - | - | - | - |
14. | } | 21 | - | - | - | - |
15. | ~ | 22 | - | - | - | - |
16. | ~ | 24 | - | + | - | - |
17. | ~ | 12 | - | - | - | - |
18. | идентификатор | 19 | + | - | - | + |
19. | ~ | 37 | - | + | - | - |
20. | ~ | 12 | - | - | - | - |
21. | ~ | 0 | - | - | + | - |
22. | ~ | 51 | - | + | - | - |
23 | ~ | 12 | - | - | - | - |
24 | ~ | 25 | - | - | - | - |
25 | class | 26 | + | - | - | + |
26 | идентификатор | 27 | + | - | - | + |
27 | ~ | 32 | - | + | - | - |
28 | { | 29 | + | - | - | + |
29 | ~ | 12 | - | + | - | - |
30 | ) | 31 | + | - | - | + |
31 | ; | 0 | + | - | + | + |
32 | : | 34 | - | - | - | - |
33 | ~ | 36 | - | - | - | - |
34 | : | 35 | + | - | - | + |
35 | идентификатор | 0 | + | - | + | + |
36 | ~ | 0 | - | - | + | - |
37 | . | 40 | - | - | - | - |
38 | ( | 44 | - | - | - | - |
39 | ; | 46 | - | - | - | + |
40 | . | 41 | + | - | - | + |
41 | идентификатор | 42 | + | - | - | + |
42 | ~ | 47 | - | + | - | - |
43 | ; | 0 | + | - | + | + |
44 | ~ | 47 | - | + | - | - |
45 | ; | 0 | + | - | + | + |
46 | ; | 0 | + | - | + | + |
47 | ( | 49 | - | - | - | - |
48 | ~ | 80 | - | - | - | - |
49 | ( | 50 | + | - | - | + |
50 | ) | 0 | + | - | + | + |
51 | ~ | 52 | - | - | - | - |
52 | ~ | 72 | - | + | - | - |
53 | идентификатор | 55 | + | - | - | + |
54 | ||||||
55 | ~ | 56 | - | - | - | - |
56 | ( | 58 | - | - | - | - |
57 | ~ | 65 | - | - | - | - |
58 | ( | 59 | + | - | - | + |
59 | ) | 60 | + | - | - | + |
60 | { | 61 | + | - | - | + |
61 | ~ | 12 | - | + | - | - |
62 | return | 63 | + | - | - | + |
63 | литерал | 64 | + | - | - | + |
64 | ; | 81 | + | - | - | + |
65 | ~ | 66 | - | - | - | - |
66 | , | 68 | - | - | - | - |
67 | ; | 71 | - | - | - | + |
68 | , | 69 | + | - | - | + |
69 | идентификатор | 70 | + | - | - | + |
70 | ~ | 66 | - | - | - | - |
71 | ; | 0 | + | - | + | + |
72 | int | 76 | - | - | - | - |
73 | float | 77 | - | - | - | - |
74 | char | 78 | - | - | - | - |
75 | идентификатор | 79 | - | - | - | + |
76 | int | 0 | + | - | + | + |
77 | float | 0 | + | - | + | + |
78 | char | 0 | + | - | + | + |
79 | идентификатор | 0 | + | - | + | + |
80 | ~ | 0 | - | - | + | - |
81 | } | 0 | + | - | + | + |
Таблица разбора java
№ | Ожидаемый терминал | Переход | Принять | В стек | Из стека | Ошибка |
1. | ~ | 2 | - | - | - | - |
2. | ~ | 7 | - | - | - | - |
3. | ~ | 12 | - | - | - | - |
7. | using | 9 | - | - | - | - |
8. | ~ | 11 | - | - | - | - |
9. | using | 10 | + | - | - | + |
10. | ~ | 7 | - | - | - | - |
11. | ~ | 3 | - | - | - | - |
12. | class | 16 | - | - | - | - |
13. | идентификатор | 18 | - | - | - | - |
14. | } | 21 | - | - | - | - |
15. | ~ | 22 | - | - | - | - |
16. | ~ | 24 | - | + | - | - |
17. | ~ | 12 | - | - | - | - |
18. | идентификатор | 19 | + | - | - | + |
19. | ~ | 37 | - | + | - | - |
20. | ~ | 12 | - | - | - | - |
21. | ~ | 0 | - | - | + | - |
22. | ~ | 51 | - | + | - | - |
23 | ~ | 12 | - | - | - | - |
24 | ~ | 25 | - | - | - | - |
25 | class | 26 | + | - | - | + |
26 | идентификатор | 27 | + | - | - | + |
27 | ~ | 32 | - | + | - | - |
28 | { | 29 | + | - | - | + |
29 | ~ | 12 | - | + | - | - |
30 | ) | 31 | + | - | - | + |
31 | ; | 0 | + | - | + | + |
32 | : | 34 | - | - | - | - |
33 | ~ | 36 | - | - | - | - |
34 | : | 35 | + | - | - | + |
35 | идентификатор | 0 | + | - | + | + |
36 | ~ | 0 | - | - | + | - |
37 | -> | 40 | - | - | - | - |
38 | ( | 44 | - | - | - | - |
39 | ; | 46 | - | - | - | + |
40 | -> | 41 | + | - | - | + |
41 | идентификатор | 42 | + | - | - | + |
42 | ~ | 47 | - | + | - | - |
43 | ; | 0 | + | - | + | + |
44 | ~ | 47 | - | + | - | - |
45 | ; | 0 | + | - | + | + |
46 | ; | 0 | + | - | + | + |
47 | ( | 49 | - | - | - | - |
48 | ~ | 80 | - | - | - | - |
49 | ( | 50 | + | - | - | + |
50 | ) | 0 | + | - | + | + |
51 | ~ | 52 | - | - | - | - |
52 | ~ | 72 | - | + | - | - |
53 | ~ | 82 | - | - | + | - |
54 | идентификатор | 55 | + | - | - | + |
55 | ~ | 56 | - | - | - | - |
56 | ( | 58 | - | - | - | - |
57 | ~ | 65 | - | - | - | - |
58 | ( | 59 | + | - | - | + |
59 | ) | 60 | + | - | - | + |
60 | { | 61 | + | - | - | + |
61 | ~ | 12 | - | + | - | - |
62 | return | 63 | + | - | - | + |
63 | литерал | 64 | + | - | - | + |
64 | ; | 81 | + | - | - | + |
65 | ~ | 66 | - | - | - | - |
66 | , | 68 | - | - | - | - |
67 | ; | 71 | - | - | - | + |
68 | , | 69 | + | - | - | + |
69 | идентификатор | 70 | + | - | - | + |
70 | ~ | 66 | - | - | - | - |
71 | ; | 0 | + | - | + | + |
72 | int | 76 | - | - | - | - |
73 | float | 77 | - | - | - | - |
74 | char | 78 | - | - | - | - |
75 | идентификатор | 79 | - | - | - | + |
76 | int | 0 | + | - | + | + |
77 | float | 0 | + | - | + | + |
78 | char | 0 | + | - | + | + |
79 | идентификатор | 0 | + | - | + | + |
80 | ~ | 0 | - | - | + | - |
81 | } | 0 | + | - | + | + |
82 | * | 84 | - | - | - | - |
83 | ~ | 85 | - | - | - | - |
84 | * | 0 | + | - | + | + |
85 | ~ | 0 | - | - | + | - |
Разработка программы
Классовая модель
Диаграмма прецедентов
Диаграмма классов