Конвертор из языка Pascal в C++
Донбасский
государственный технический университет
Специализированные
компьютерные системы
КУРСОВАЯ
РАБОТА
на тему:
Конвертор из языка Pascal в C++
Студент III курса СКС-1 группы
Богданова Ю.А.
Руководитель кандидат экономических
наук, доцент Бизянов Е.Е.
г. Алчевск-
2015 год
РЕФЕРАТ
конвертор синтаксис массив данные
Пояснительная записка содержит: 28 с., 4 рисунка, 1 блок-схема, 1
приложение.
Цель курсовой работы - создать программу, которая выполняет
преобразование кода объявления переменных, констант, условного оператора if и
цикла for с языка Pascal на язык C++.
Программа из одного текстового поля заменяет синтаксис одного языка
высокого уровня на синтаксис другого языка и выводит преобразованный код во
втором текстовом поле., C++, PASCAL, КОНСТАНТА, ПЕРЕМЕННАЯ, ФУНКЦИЯ, ЦИКЛ FOR,
УСЛОВНЫЙ ОПЕРАТОР IF
ВВЕДЕНИЕ
Java
- объектно-ориентированный язык программирования
<https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F>,
разработанный компанией Sun Microsystems <https://ru.wikipedia.org/wiki/Sun_Microsystems>
(в последующем приобретённой компанией Oracle
<https://ru.wikipedia.org/wiki/Oracle>). Приложения Java обычно
транслируются
<https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%82%D0%BE%D1%80>
в специальный байт-код <https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82-%D0%BA%D0%BE%D0%B4>,
поэтому они могут работать на любой виртуальной Java-машине
<https://ru.wikipedia.org/wiki/Java_Virtual_Machine> вне зависимости от
компьютерной архитектуры <https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0>.
Дата официального выпуска - 23 мая 1995 года.
Изначально
язык назывался Oak («Дуб») разрабатывался Джеймсом Гослингом
<https://ru.wikipedia.org/wiki/%D0%93%D0%BE%D1%81%D0%BB%D0%B8%D0%BD%D0%B3,_%D0%94%D0%B6%D0%B5%D0%B9%D0%BC%D1%81>
для программирования бытовых электронных устройств. Впоследствии он был
переименован в Java и стал использоваться для написания клиентских приложений и
серверного
<https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)>
программного обеспечения.
Достоинством
подобного способа выполнения программ является полная независимость байт-кода
от операционной системы
<https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0>
и оборудования
<https://ru.wikipedia.org/wiki/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B0>,
что позволяет выполнять Java-приложения на любом устройстве, для которого существует
соответствующая виртуальная машина. Другой важной особенностью технологии Java
является гибкая система безопасности, в рамках которой исполнение программы
полностью контролируется виртуальной машиной. Любые операции, которые превышают
установленные полномочия программы (например, попытка несанкционированного
доступа к данным или соединения с другим компьютером), вызывают немедленное
прерывание[1].
1.
АНАЛИЗ ЗАДАНИЯ
1.1
Теоретические сведения, необходимые для выполнения работы
Чтобы
выполнить курсовой проект, нам необходимо ознакомиться с основами Java.
Программы
на Java транслируются
<https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%82%D0%BE%D1%80>
в байт-код <https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82-%D0%BA%D0%BE%D0%B4>,
выполняемый виртуальной машиной Java
<https://ru.wikipedia.org/wiki/Java_Virtual_Machine>(JVM) - программой,
обрабатывающей байтовый код и передающей инструкции оборудованию как
интерпретатор <https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%82%D0%BE%D1%80>.
Достоинством
подобного способа выполнения программ является полная независимость байт-кода
от операционной системы
<https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0>
и оборудования
<https://ru.wikipedia.org/wiki/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B0>,
что позволяет выполнять Java-приложения на любом устройстве, для которого
существует соответствующая виртуальная машина. Другой важной особенностью
технологии Java является гибкая система безопасности, в рамках которой
исполнение программы полностью контролируется виртуальной машиной. Любые
операции, которые превышают установленные полномочия программы (например,
попытка несанкционированного доступа к данным или соединения с другим
компьютером), вызывают немедленное прерывание[2].
.2
Концепция решения задания
Основное
задание в курсовом проекте - это возможность преобразования данных из одного
языка в другой.
Самый
лучший путь замены синтаксиса является использование регулярных выражений.
Примером элементарных замен синтаксиса может служить объявления типов данных
констант и переменных Integer - int ,bool-Boolean и т.д.
Далее,
необходимо понять работу циклов For и If в Pascal, их отличие от тех же циклов,
но уже в языке C++.
Далее
необходимо предусмотреть удобный в использовании и лёгкий в создании интерфейс
пользователя. Таким интерфейсом может служить форма на которой расположены 2
текстовых поля, 1е поле для ввода команд на языке Pascal, 2е выводит данные на
языке С++.
Всё
вышеперечисленное является необходимым, но не недостаточным условием завершения
работы над курсовым проектом. Как и любая завершенная программа, она должна
содержать меню инструментов и панель инструментов, справку, содержащую
информацию о создателе программы. Что касается интерфейса, необходимо
предусмотреть возможность выполнения стандартных для Windows операций, а именно
копирование, вставка и операция «вырезать». Так же в наш проект необходимо
дополнить очистку полей ввода/вывода информации, чтобы повторно использовать
программу.
2.
ВЫБОР И ОБЗОР СРЕДЫ РАЗРАБОТКИ
Для
выполнения данной работы необходимо определить язык программирования и
платформу, на которой будет реализован этот язык. При определении этого,
необходимо учитывать на какой операционной системе проект будет
распространяться, его системные требования, необходимость интернета для работы с
ним и другие особенности.
Учитывая
особенность данной работы, а именно применение классов, функции и регулярных
выражений рационально было бы использовать объектно-ориентированный язык
программирования. Наиболее подходящие варианты - языки С++ и Java.
Рассмотрим
преимущества и недостатки каждого языка, относительно друг друга, для
определения выбора языка.
Преимущества
языка Java:
отсутствие
необходимости освобождать память в явном виде;
независимость
от платформы, на которой выполняется программа;
введение
истинных массивов и запрещение указателей;
исключено
множественное наследование.
Преимущества
языка С++:
наличие
шаблонов классов и функций;
выполнение
программы в 2-3 быстрее, чем на языке Java;
полный
контроль над выделением памяти.
В
остальном же, эти языки очень похожи. Учитывая наше задание, у нас нет
необходимости создавать шаблоны классов, от контроля памяти в нашей программе
мало, что зависит, а приятный интерфейс компилятора вкупе с
кроссплатформенностью языка явно перевешивают быстродействие программ
написанных на С++, т.к. программа, из-за своих размеров, не заставляет думать о
быстродействии.
Осталось
определиться с платформой, которая будет использована для реализации нашего
проекта. Для Java существует множество платформ программирования, самыми
популярными являются Eclipse и NetBeans. Из-за качества и больших возможностей
был выбран NetBeans.
3.
РАЗРАБОТКА ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ
Интерфейс
(от англ. Interface - граница раздела, стык, область контакта и взаимодействия)
- совокупность средств и методов взаимодействия между элементами системы.
Есть
ряд различных интерфейсов:
командный
интерфейс. Он называется так потому, что в этом виде интерфейса человек подает
"команды" компьютеру, а компьютер их выполняет и выдает результат
человеку. Командный интерфейс реализован в виде пакетной технологии и
технологии командной строки;- интерфейс (Window - окно, Image - образ, Menu -
меню, Pointer - указатель). Хотя и в этом интерфейсе машине подаются команды,
но это делается "опосредственно", через графические образы. Этот вид
интерфейса реализован на двух уровнях технологий: простой графический интерфейс
и "чистый" WIMP интерфейс;- интерфейс (Speech - речь, Image - образ,
Language - язык, Knowlege - знание). Компьютер находит для себя команды,
анализируя человеческое поведение[3].
В
данной курсовой работе в качестве интерфейса были использованы формы.Так как он
прост в обращении из-за наглядности интерфейса, легок для понимания, а также
отлично подходит как для небольших задач - как например этот проект, так и для
больших проектов.
Интерфейс
программы представлен на рисунке 3.1
Интерфейс
состоит из формы, которая содержит поле для ввода данных (слева на рисунке),
поле вывода преобразованных данных (справа на рисунке), а также поле для вывода
возможных ошибок (внизу формы).
Вверху
формы расположены меню инструментов и панель инструментов.
Кнопка
«Конвертировать» выполняет основную функцию нашей программы - конвертирование
из одного языка в другой.
Рисунок
3.1 - Интерфейс программы
4.
БЛОК-СХЕМА ОСНОВНОГО АЛГОРИТМА
Блок-схема
основного алгоритма представлена на рисунке 4.1.
Рисунок 4.1 - Алгоритм работы основной функции программы
5. ОПИСАНИЕ АЛГОРИТМА ПРОГРАММЫ
При запуске программы появляются 2 текстовых поля(2): для ввода и вывода.
Далее начинается ввод пользователем данных в поле с названием Pascal, так же
можно загрузить уже готовую информацию (с расширением .txt) и вставить его в
поле слева с помощью команды Файл- Открыть(3).
При нажатии на кнопку «Конвертировать», выполняется конвертация программы
с одного языка на другой(4).
Далее происходит проверка текста на ошибки, если такие были допущены, то
программа указывает пользователю на строки, где совершены ошибки. Можно их
убрать и программа будет работать дальше(5-7)
Над программой можно выполнить и другие действия: очистить поля,
вырезать, вставить, сохранить. Так же можно просмотреть данные об авторе
программы.
6.
ТЕСТИРОВАНИЕ ПРОГРАММЫ
При
тестировании программы была проверена работоспособность программы при вводе
некорректных данных, выходе и входе в меню выполнения программы, а также при
проверке всех функций. Ошибок не было обнаружено.
При
запуске программы пользователь может видеть главное меню программы, которое
приведено на рисунке 6.1.
Рисунок
6.1 - Интерфейс программы
Если необходимо открыть или сохранить файл, можно воспользоваться меню
файл или кнопкой на панели инструментов, форма изображенная на рис. 6.2.
Рисунок 6.2 - Выбор файла
Рисунок 6.3 - Введенный и конвертированный текст
ВЫВОДЫ
В современном мире, где информационные технологии развиваются как никогда
быстро, а вместе с ними и языки программирования, вопрос о переходе с одного
языка высокого уровня на другой стоит на первых позициях. Невозможно найти
универсальный язык, какие-то языки лучше для новичков, какие-то более быстрые.
Бывает и такое, что человек не знает как реализовать программу на том или ином
языке, конвертор как никто лучше может нам предоставить такую возможность.
Конверторы существуют и находят свое применение в личных целях
программистов создавшего его. Как и эта программа конвертор просто облегчает
заполнение, уменьшает затрачиваемое время на преобразование готовой программы
на другой язык.
Во время кодировки были приобретены навыки работы с классами, функциями,
регулярными выражениями, формами. В ходе программы использовались различные
типы данных, функций, массивы переменных.
Овладели навыками анализа программно-технической литературы,
использование справочников технической литературы, а также использования
стандартов. К вышеперечисленному, овладели навыками создания удобного и
простого в освоении пользовательского интерфейса.
СПИСОК ЛИТЕРАТУРЫ
Введение в
Java [Электронный ресурс] // Metanit.com Cайт о программировании, про создание
сайтов и IT-технологии, 2012-2015. URL:
http://metanit.com/java/tutorial/1.1.php. (Дата обращения: 14.11.2015).
Монахов В. И.
Язык программирования Java и среда NetBeans / В.И. Монахов. - Петербург :
БХВ-Петербург, 2012. - 704с.
Классификация
интерфейсов [Электронный ресурс] // Интерфейсы, 2012. URL: http://www.yudenisov.narod.ru/EIS/Vol11/a000.htm. (Дата обращения: 14.11.2015).
Кен А.В. Язык
программирования JAVA [Учебное пособие] / А.В. Кен. - Санкт-Петербург : Питер,
1997. - 304.
ПРИЛОЖЕНИЕ А
Листинг программы
//--------------------------------------
// Конвертор из языка Pascal в язык C++
//--------------------------------------
// Курсовой проект
// вариант 3
// группа - СКС-13
// автор - Богданова Ю.А.
// среда разработки - NetBeans
//---------------------------------------
// Программа реализует замену синтаксиса
// языка Pascal на язык C++ при объявлении
// переменных и констант, вводе операторов
// условия if и циклов for.
// --------------------------------------
//------- БИБЛИОТЕКИ
-------java.awt.*;java.awt.datatransfer.DataFlavor;java.awt.datatransfer.StringSelection;java.awt.datatransfer.Transferable;java.awt.event.MouseAdapter;java.awt.event.MouseEvent;java.io.*;java.util.regex.Matcher;java.util.regex.Pattern;javax.swing.GroupLayout.Alignment;javax.swing.*;javax.swing.LayoutStyle.ComponentPlacement;javax.swing.filechooser.FileFilter;
//--------------------------
//------- ВЫПОЛНЯЮЩАЯФУНКЦИЯ -------class Konverter extends JFrame {
//------- ГЛОБАЛЬНЫЕПЕРЕМЕННЫЕ -------static final long serialVersionUID = 1L; // Default
IDfinal JSplitPane splitPane = new JSplitPane(); // "раздвоенный" контейнер[] pascal_types = {"integer",
"longint", "string", "byte", "boolean",
"double", "real"}; // элементы для замещения[] cpp_types = {"int", "long",
"string", "byte", "bool", "double",
"float"}; // "заместители"
boolean check_if = false; // нужно для различия конструкции if ... от for
...JFileChooser choose; // выбор файла для сохранения
private String fileName; // название этого файлаBufferedWriter bw; // осуществление записиKonverter frame = new
Konverter(); // объект нашего
классаmainFlag = false;
//-------------------------------------
//------- ЗАПУСК ОСНОВНОГО ПОТОКА -------static void main(String[] args) {.invokeLater(new
Runnable() {void run() {{frame = new Konverter();.setVisible(true);
} catch (Exception e) {.printStackTrace();
}
}
});
}
//---------------------------------------
//------- КОНСТРУКТОРКЛАССА -------Konverter() {
//------- ОБЪЯВЛЕНИЕПЕРЕМЕННЫХЭЛЕМЕНТОВ -------scrollPane = new JScrollPane(); // контейнеры со скролломscrollPane_1 = new
JScrollPane();panel = new JPanel(); // просто
контейнерJTextPane pascal_pane =
new JTextPane();JTextPane cpp_pane = new JTextPane(); // текстовые поляJTextPane number_pane = new JTextPane();menuBar = new
JMenuBar(); // контейнер для менюtoolBar = new JToolBar(); // панель инструментовopen_button = new JButton("");save_button = new
JButton(""); clear_button = new JButton(""); // кнопки панели инструментовcopy_button = new
JButton("");run_button = new JButton("Конвертировать");file_menu = new
JMenu("Файл"); // менюedit_menu = new JMenu("Правка");help_menu = new JMenu("Справка");open_menuitem = new
JMenuItem("Открыть"); // айтемыменюшекsave_menuitem = new JMenuItem("Сохранить");exit_menuitem = new
JMenuItem("Выход");cut_menuitem = new
JMenuItem("Вырезать");copy_menuitem =
new JMenuItem("Копировать");past_menuitem =
new JMenuItem("Вставить");delete_menuitem =
new JMenuItem("Очистить поля");about_menuitem = new JMenuItem("О программе");Pascal_label = new
JLabel("Pascal"); // надписиCpp_label
= new JLabel("C++");file_separator = new JSeparator(); // сепараторedit_separator = new JSeparator(); //
сепаратор
//----------------------------------------------------------------------------------
//------- СВОЙСТВАФОРМЫИКОНТЕЙНЕРА
-------().setBackground(Color.WHITE);(Color.WHITE);groupLayout = new
GroupLayout(getContentPane());.setHorizontalGroup(.createParallelGroup(Alignment.TRAILING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
.addComponent(splitPane, Alignment.LEADING,
GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
.addContainerGap())
.addComponent(panel, Alignment.LEADING,
GroupLayout.DEFAULT_SIZE, 584, Short.MAX_VALUE)
);.setVerticalGroup(.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 36,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(splitPane, GroupLayout.DEFAULT_SIZE, 235,
Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGap(7))
);.setLayout(new BorderLayout(0, 0));
//-------------------------------------------
//------- ОСТАЛЬНЫЕ СВОЙСТВА -------.setLeftComponent(scrollPane); // в
основном это добавления в свой контейнер и цвет
scrollPane.setViewportView(pascal_pane);_label.setBackground(new
Color(255, 255, 224));.setColumnHeaderView(Pascal_label);_pane.setEditable(false);.setRowHeaderView(number_pane);.setRightComponent(scrollPane_1);_1.setViewportView(cpp_pane);_label.setBackground(new
Color(255, 255,
255));_1.setColumnHeaderView(Cpp_label);(JFrame.EXIT_ON_CLOSE);(370, 150, 600,
450);().setLayout(groupLayout);.setBackground(new Color(255, 255,
255));(menuBar);_menu.setFont(new Font("Arial", Font.PLAIN,
12));_menu.setBackground(new Color(255, 255,
255));.add(file_menu);_menuitem.setBackground(new Color(255, 255,
255));_menu.add(open_menuitem);_menuitem.setBackground(new Color(255, 255,
255));_menu.add(save_menuitem);_menu.add(file_separator);_menuitem.setBackground(new
Color(255, 255, 255));_menu.add(exit_menuitem);_menu.setFont(new
Font("Arial", Font.PLAIN, 12));.add(edit_menu);_menuitem.setBackground(new
Color(255, 255, 255));_menu.add(cut_menuitem);_menuitem.setBackground(new
Color(255, 255, 255));_menu.add(copy_menuitem);_menuitem.setBackground(new
Color(255, 255,
255));_menu.add(past_menuitem);_menu.add(edit_separator);_menuitem.setBackground(new
Color(255, 255, 255));_menu.add(delete_menuitem);_menu.setFont(new
Font("Arial", Font.PLAIN,
12));.add(help_menu);_menuitem.setBackground(new Color(255, 255,
255));_menu.add(about_menuitem);.setBackground(new Color(159, 224,
254));.setFloatable(false);.add(toolBar, BorderLayout.CENTER);_pane.setFont(new
Font("Tahoma", Font.PLAIN, 12));_pane.setFont(new
Font("Tahoma", Font.PLAIN, 12));_pane.setFont(new
Font("Tahoma", Font.PLAIN, 12));_button.setIcon(new
ImageIcon(Konverter.class.getResource("img/open.png")));.add(open_button);_button.setIcon(new
ImageIcon(Konverter.class.getResource("img/save.png")));.add(save_button);_button.setIcon(new
ImageIcon(Konverter.class.getResource("img/clean.png")));.add(clear_button);_button.setIcon(new
ImageIcon(Konverter.class.getResource("img/copy.png")));_button.setSelectedIcon(new
ImageIcon(Konverter.class.getResource("img/open.png")));.add(copy_button);_button.setIcon(new
ImageIcon(Konverter.class.getResource("img/run24.png")));.add(run_button);.setBackground(new
Color(255, 255, 255));.setResizeWeight ( 0.5 );
//-------------------------------------------
//------- СОБЫТИЯ МЕНЮ -------_button.addMouseListener(new MouseAdapter() { // открытиефайла
@Overridevoid mouseClicked(MouseEvent arg0){= new
JFileChooser();.setDialogTitle("Выберитефайл");.setFileSelectionMode(JFileChooser.FILES_ONLY);res =
choose.showOpenDialog(Konverter.this);(res == JFileChooser.APPROVE_OPTION)
{fileName = choose.getSelectedFile().toString();
{
BufferedReader fr = new BufferedReader(new
FileReader(fileName));_pane.read(fr, false);.close();
} (FileNotFoundException ex) {}(IOException ea) {}
}
});_button.addMouseListener(new MouseAdapter() { // записьфайла
@Overridevoid mouseClicked(MouseEvent e) {= new
JFileChooser();.addChoosableFileFilter(new TextFileFilter());.setDialogTitle("Выберитефайл");.setFileSelectionMode(JFileChooser.FILES_ONLY);res
= choose.showSaveDialog(Konverter.this);(res == JFileChooser.APPROVE_OPTION)
{=
choose.getSelectedFile().toString();(!fileName.endsWith(".cpp")) +=
".cpp";
{= new BufferedWriter( new
FileWriter(fileName));_pane.write(bw);.close();
} (FileNotFoundException ex) {}(IOException ea) {}
}
}
});_button.addMouseListener(new MouseAdapter() { // очисткаполей
@Overridevoid mouseClicked(MouseEvent e)
{_pane.setText(null);_pane.setText(null);_pane.setText(null);
}
});_button.addMouseListener(new MouseAdapter() { // копировать
@Overridevoid mouse Clicked (MouseEvent e) {stringSelection =
new
StringSelection(pascal_pane.getSelectedText());.getDefaultToolkit().getSystemClipboard().setContents(stringSelection,
null);
}
});_menuitem.addMouseListener(new MouseAdapter() // открытие файла
{
@Overridevoid mousePressed(MouseEvent arg0) {= new
JFileChooser();.setDialogTitle("Выберитефайл");.setFileSelectionMode(JFileChooser.FILES_ONLY);res =
choose.showOpenDialog(Konverter.this);(res == JFileChooser.APPROVE_OPTION)
{fileName = choose.getSelectedFile().toString();{fr = new BufferedReader(new
FileReader(fileName));_pane.read(fr, false);.close();
} catch (FileNotFoundException ex) {
} catch (IOException ea) {
}
}
}
});_menuitem.add Mouse Listener(new MouseAdapter() // сохранить документ
{
@Overridevoid mousePressed(MouseEvent e) {= new
JFileChooser();.addChoosableFileFilter(new
TextFileFilter());.setDialogTitle("Выберитефайл");.setFileSelectionMode(JFileChooser.FILES_ONLY);res =
choose.showSaveDialog(Konverter.this);(res == JFileChooser.APPROVE_OPTION) {=
choose.getSelectedFile().toString();(!fileName.endsWith(".cpp")) +=
".cpp"; {= new BufferedWriter(new FileWriter(fileName));_pane.write(bw);.close();
} catch (FileNotFoundException ex) {
} catch (IOException ea) {
}
}
}
});_menuitem.addMouseListener(new MouseAdapter() // очистить поля
{
@Overridevoid mousePressed(MouseEvent e)
{_pane.setText(null);_pane.setText(null);_pane.setText(null);
}
});_menuitem.addMouseListener(new MouseAdapter() // выход
{
@Overridevoid mousePressed(MouseEvent e) {.exit(0);
}
});
_menuitem.addMouseListener(new MouseAdapter() // копировать
{
@Overridevoid mousePressed(MouseEvent e) {stringSelection =
new StringSelection(pascal_pane.getSelectedText());.getDefaultToolkit().getSystemClipboard().setContents(stringSelection,
null);
}
});_menuitem.addMouseListener(new MouseAdapter() // вставить
{
@Overridevoid mouse Pressed (MouseEvent e) {clip =
"";trans = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);{=
(String) trans.getTransferData(DataFlavor.stringFlavor);
} catch (Exception exc) {
}_pane.replaceSelection(clip);
}
});_menuitem.addMouseListener(new MouseAdapter() // вырезать
{
@Overridevoid mousePressed(MouseEvent e) {stringSelection =
new
StringSelection(pascal_pane.getSelectedText());_pane.replaceSelection("");.getDefaultToolkit().getSystemClipboard().setContents(stringSelection,
null);
}
});_menuitem.addMouseListener(new MouseAdapter() // О программе
{
@Overridevoid mousePressed(MouseEvent e)
{.showMessageDialog(frame, "Программа реализует замену
синтаксиса\n" +
"языка Pascal на язык C++ при объявлении\n" +
"переменных и констант, вводе операторов \n" +
"условия if и циклов for.\n\n" +
"Курсовой проект\n" +
"вариант 3\n" +
"группа - СКС-13\n" +
"автор - Богданова Ю.А.\n");
}
});
//----------------------------
//------- СОБЫТИЕ КНОПКИ -------_button.addMouseListener(new MouseAdapter() {
@Overridevoid mousePressed(MouseEvent e) {[] errors_of_string
= pascal_pane.getText().split("\n"); // нужен для нахождения ошибо кв тексте
char bukva = 0; // проверяет последний символ строки на наличие ошибки
errors = ""; // записывает номера строк с
ошибками_pane.setText(null); // панель с количеством введенных строк
int cntBegin = 0;cntEnd = 0;(int i = 0; i <
errors_of_string.length; i++) // определение строк с ошибками
{+= i + 1 + ", "; // запись номеров строк
}
} catch (Exception e1) {
}(errors_of_string[i].toLowerCase().indexOf("begin")
!= -1)+= 1;(errors_of_string[i].toLowerCase().indexOf("end") != -1)+=
1;
}(cntBegin != cntEnd).showMessageDialog(frame, "Количество Begin не соответстует количеству End!");
if (errors != "") { // если допустили ошибку, то выводит
сообщение.showMessageDialog(frame, "Вы допустили ошибку в строках с
номерами: " + errors.substring(0, errors.length() -
2));_pane.setText(null); // и очищаем правое поле
} else {_pane.setText(null); // и очищаем правое поле[] pascal_text =
pascal_pane.getText().split(";"); // разделяем текст на блоки
разделенные ";"= true; (int i = 0; i < pascal_text.length; i++) //
каждый блок отправляем на "обработку" в спец. функцию
{_text[i] = containsWords(pascal_text[i]); // присваиваем обработанные данные_pane.setText(cpp_pane.getText()
+ pascal_text[i]); // и выводим
на правую
панель
}
}_pane.setText(null); // очищаем панель нумерации строк, чтобы всегда
начиналась с 1(int i = 1; i <= errors_of_string.length; i++) // в
зависимости от количества строк в левом поле
{_pane.setText(number_pane.getText() + i + ":\n");
// на считвываем нумерацию
}
}containsWords(String text) // функция обработки (перевода) данных
{= text.toLowerCase();if_searth =
Pattern.compile("if"); // ищем слово "if"if_find =
if_searth.matcher(text); // в остправленном блокеfor_searth = Pattern.compile("for"); // ищем слово
"for"for_find = for_searth.matcher(text); // всё там же(mainFlag){(text.startsWith("begin")){=
text.replaceAll("begin\r\n", "");=
text.replaceAll("begin\n", "");=
text.replaceAll("begin", "");
}= false;
}(if_find.find() == true) // если нашли "if"
{_if = true; // см. строки 446-457
} else // если не нашли
{[] pascal_set_type = text.split(":"); // разделяем, если
возможно, блок на части по этому знаку
for (int i = 0; i < pascal_types.length; i++) // см. 50 строку
{pattern = Pattern. compile(pascal_types[i]); // ищемкаждыйизэтихэлементовmatcher;(pascal_set_type.length
> 1 )
matcher = pattern.matcher(pascal_set_type[1]); // в правой части объекта
(т.е. справа от знака ":")
else =
pattern.matcher(pascal_set_type[0]); // в левой части объекта (т.е. слева от знака
":")
Pattern const_searth = Pattern.compile("const"); //
ищемслово
"const"const_find = const_searth.matcher(pascal_set_type[0]); // тамже(matcher.find() == true) // если нашли
"integer", "longint", "string" ... или "real"
{(const_find.find() == true) // если нашли слово "const"
{(pascal_set_type.length >= 2) // если у нас строка типа "const x: Integer = 5;"
{_set_type[1] =
pascal_set_type[1].replaceAll(pascal_types[i], ""); // то убераем "Integer",
"Longint" ... ит.д._set_type[0] =
pascal_set_type[0].replaceAll("const", "const "+
cpp_types[i] + " ");= pascal_set_type[0] + pascal_set_type[1] +
";"; // и выводим: const int x = 5;
} // знак равно и часть, что была справа, например " 6"// если
у нас строка типа "x: Integer;"
{_set_type[1] =
pascal_set_type[1].replaceAll(pascal_types[i], ""); // тоубераем "integer",
"longint" ... ит.д._set_type[0] =
pascal_set_type[0].replaceAll("const", "const "+
cpp_types[i] + " ");= pascal_set_type[0] + ";"; // выводим: const int x;
}
} else if (for_find.find() == true) // если нашли слово "for"
{_if = false;// см. строки 460-466
} // если не нашли слова "for", "const" и
"if", значит остаются обычные объявления переменных
{(pascal_set_type.length >= 2) // если у нас строка типа "x: Integer = 6;"
{_set_type[1] =
pascal_set_type[1].replaceAll(pascal_types[i], ""); // заменяемтипыданныхна ""=
cpp_types[i] + " " + pascal_set_type[0] + pascal_set_type[1] +
";"; // выводим результат как выше
}
}
}
}
}(check_if == true) // этодля "if"
{
// if a = 5 then... -> if(a == 5)...[] if_parts =
text.split("then");_parts[0] = if_parts[0].replaceAll("if",
"if (");_parts[0] = if_parts[0].replaceAll("=",
"==");_parts[0] = if_parts[0].replaceAll("<>",
"!=");_parts[0] = if_parts[0].replaceAll("and",
"&&");_parts[0] = if_parts[0].replaceAll("or",
"||");_parts[0] = if_parts[0].replaceAll("not",
"!");= if_parts[0] + ") ";(if_parts.length >= 2){[]
else_parts = if_parts[1].split("else"); // обрабатываем else(else_parts.length >=
2){_parts[1] = else_parts[0].trim() + "; else" + else_parts[1];
}= text + if_parts[1] + ";";
}_if = false;
} else // этодля
"for"
{
// for i := 1 to N do... -> for(i = 1; i < n ;
i++)...[] assign = text.split(":="); [0] =
assign[0].replaceAll("for ", "").trim(); // получаем переменную цикла i=
text.replaceAll("to", "; " + assign[0] + "
<");// получаем ; i < n=
text.replaceAll("do", "; " + assign[0] + "++ )"
); // получаем ; i++)=
text.replaceAll("for ", "for(
");(text.endsWith(";") == false &&
text.trim().equals("") == false)
text = text + ";";
}= text.replaceAll(":=", "="); // а это заменяем
всегда и везде
text = text.replaceAll("begin", "\\{");=
text.replaceAll("end;", "\\}");=
text.replaceAll("end.", "\\}");=
text.replaceAll("end", "\\}");=
text.replaceAll("div", "\\/");= text.replaceAll("mod",
"\\%");= text.replaceAll("};", "\\}");=
text.replaceAll("var", "");[] writeln_parts =
text.split("writeln"); // заменяем WriteLn на cout
// WriteLn(xyz) -> cout << xyz <<
endl(writeln_parts.length >= 2){= writeln_parts[0];_parts[1] =
writeln_parts[1].replaceAll("\\(", " << ");_parts[1]
= writeln_parts[1].replaceAll("\\)", " << endl");=
text + "cout" + writeln_parts[1];
}[] write_parts = text.split("write"); // заменяем Write на cout
// Write(xyz) -> cout << xyz(write_parts.length
>= 2){= write_parts[0];_parts[1] =
write_parts[1].replaceAll("\\(", " << ");_parts[1] =
write_parts[1].replaceAll("\\)", "");= text +
"cout" + write_parts[1];
}(mainFlag){= "void main()\n{\n" + text; // добавляем main() C++= false;
};// возвращаем
обработанный блок
}
});
}
}TextFileFilter extends FileFilter // нужно для сохранения
{boolean accept(java.io.File file) {(file.isDirectory())
{true;
}(file.getName().endsWith("cpp"));
}String getDescription() {"C++ files (*.cpp)";
}
}