Конвертор из языка Pascal в C++
Разработка программы конвертации синтаксиса одного языка высокого уровня на синтаксис другого. Особенности работы с классами, функциями, регулярными выражениями, формами. Использование для создания программы разных типов данных, массивов переменных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 30.01.2016 |
Размер файла | 567,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Донбасский государственный технический университет
Специализированные компьютерные системы
КУРСОВАЯ РАБОТА
на тему: Конвертор из языка Pascal в C++
Студент III курса СКС-1 группы
Богданова Ю.А.
Руководитель кандидат экономических наук, доцент Бизянов Е.Е.
г. Алчевск- 2015 год
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
РЕФЕРАТ
конвертор синтаксис массив данные
Пояснительная записка содержит: 28 с., 4 рисунка, 1 блок-схема, 1 приложение.
Цель курсовой работы - создать программу, которая выполняет преобразование кода объявления переменных, констант, условного оператора if и цикла for с языка Pascal на язык C++.
Программа из одного текстового поля заменяет синтаксис одного языка высокого уровня на синтаксис другого языка и выводит преобразованный код во втором текстовом поле.
NETBEANS, C++, PASCAL, КОНСТАНТА, ПЕРЕМЕННАЯ, ФУНКЦИЯ, ЦИКЛ FOR, УСЛОВНЫЙ ОПЕРАТОР IF
ВВЕДЕНИЕ
Java -- объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. Дата официального выпуска -- 23 мая 1995 года.
Изначально язык назывался Oak («Дуб») разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Впоследствии он был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения.
Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание[1].
1. АНАЛИЗ ЗАДАНИЯ
1.1 Теоретические сведения, необходимые для выполнения работы
Чтобы выполнить курсовой проект, нам необходимо ознакомиться с основами Java.
Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java(JVM) -- программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание[2].
1.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 - граница раздела, стык, область контакта и взаимодействия) - совокупность средств и методов взаимодействия между элементами системы.
Есть ряд различных интерфейсов:
командный интерфейс. Он называется так потому, что в этом виде интерфейса человек подает "команды" компьютеру, а компьютер их выполняет и выдает результат человеку. Командный интерфейс реализован в виде пакетной технологии и технологии командной строки;
WIMP - интерфейс (Window - окно, Image - образ, Menu - меню, Pointer - указатель). Хотя и в этом интерфейсе машине подаются команды, но это делается "опосредственно", через графические образы. Этот вид интерфейса реализован на двух уровнях технологий: простой графический интерфейс и "чистый" WIMP интерфейс;
SILK - интерфейс (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.
Рисунок 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.
// --------------------------------------
//------- БИБЛИОТЕКИ -------
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.GroupLayout.Alignment;
import javax.swing.*;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.filechooser.FileFilter;
//--------------------------
//------- ВЫПОЛНЯЮЩАЯФУНКЦИЯ -------
public class Konverter extends JFrame {
//------- ГЛОБАЛЬНЫЕПЕРЕМЕННЫЕ -------
private static final long serialVersionUID = 1L; // Default ID
private final JSplitPane splitPane = new JSplitPane(); // "раздвоенный" контейнер
String[] pascal_types = {"integer", "longint", "string", "byte", "boolean", "double", "real"}; // элементы для замещения
String[] cpp_types = {"int", "long", "string", "byte", "bool", "double", "float"}; // "заместители"
boolean check_if = false; // нужно для различия конструкции if ... от for ...
private JFileChooser choose; // выбор файла для сохранения
private String fileName; // название этого файла
private BufferedWriter bw; // осуществление записи
static Konverter frame = new Konverter(); // объект нашего класса
boolean mainFlag = false;
//-------------------------------------
//------- ЗАПУСК ОСНОВНОГО ПОТОКА -------
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Konverter frame = new Konverter();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
//---------------------------------------
//------- КОНСТРУКТОРКЛАССА -------
public Konverter() {
//------- ОБЪЯВЛЕНИЕПЕРЕМЕННЫХЭЛЕМЕНТОВ -------
JScrollPane scrollPane = new JScrollPane(); // контейнеры со скроллом
JScrollPane scrollPane_1 = new JScrollPane();
JPanel panel = new JPanel(); // просто контейнер
final JTextPane pascal_pane = new JTextPane();
final JTextPane cpp_pane = new JTextPane(); // текстовые поля
final JTextPane number_pane = new JTextPane();
JMenuBar menuBar = new JMenuBar(); // контейнер для меню
JToolBar toolBar = new JToolBar(); // панель инструментов
JButton open_button = new JButton("");
JButton save_button = new JButton("");
JButton clear_button = new JButton(""); // кнопки панели инструментов
JButton copy_button = new JButton("");
JButton run_button = new JButton("Конвертировать");
JMenu file_menu = new JMenu("Файл"); // меню
JMenu edit_menu = new JMenu("Правка");
JMenu help_menu = new JMenu("Справка");
JMenuItem open_menuitem = new JMenuItem("Открыть"); // айтемыменюшек
JMenuItem save_menuitem = new JMenuItem("Сохранить");
JMenuItem exit_menuitem = new JMenuItem("Выход");
JMenuItem cut_menuitem = new JMenuItem("Вырезать");
JMenuItem copy_menuitem = new JMenuItem("Копировать");
JMenuItem past_menuitem = new JMenuItem("Вставить");
JMenuItem delete_menuitem = new JMenuItem("Очистить поля");
JMenuItem about_menuitem = new JMenuItem("О программе");
JLabel Pascal_label = new JLabel("Pascal"); // надписи
JLabel Cpp_label = new JLabel("C++");
JSeparator file_separator = new JSeparator(); // сепаратор
JSeparator edit_separator = new JSeparator(); // сепаратор
//----------------------------------------------------------------------------------
//------- СВОЙСТВАФОРМЫИКОНТЕЙНЕРА -------
getContentPane().setBackground(Color.WHITE);
setBackground(Color.WHITE);
GroupLayout groupLayout = new GroupLayout(getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.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)
);
groupLayout.setVerticalGroup(
groupLayout.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))
);
panel.setLayout(new BorderLayout(0, 0));
//-------------------------------------------
//------- ОСТАЛЬНЫЕ СВОЙСТВА -------
splitPane.setLeftComponent(scrollPane); // в основном это добавления в свой контейнер и цвет
scrollPane.setViewportView(pascal_pane);
Pascal_label.setBackground(new Color(255, 255, 224));
scrollPane.setColumnHeaderView(Pascal_label);
number_pane.setEditable(false);
scrollPane.setRowHeaderView(number_pane);
splitPane.setRightComponent(scrollPane_1);
scrollPane_1.setViewportView(cpp_pane);
Cpp_label.setBackground(new Color(255, 255, 255));
scrollPane_1.setColumnHeaderView(Cpp_label);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(370, 150, 600, 450);
getContentPane().setLayout(groupLayout);
menuBar.setBackground(new Color(255, 255, 255));
setJMenuBar(menuBar);
file_menu.setFont(new Font("Arial", Font.PLAIN, 12));
file_menu.setBackground(new Color(255, 255, 255));
menuBar.add(file_menu);
open_menuitem.setBackground(new Color(255, 255, 255));
file_menu.add(open_menuitem);
save_menuitem.setBackground(new Color(255, 255, 255));
file_menu.add(save_menuitem);
file_menu.add(file_separator);
exit_menuitem.setBackground(new Color(255, 255, 255));
file_menu.add(exit_menuitem);
edit_menu.setFont(new Font("Arial", Font.PLAIN, 12));
menuBar.add(edit_menu);
cut_menuitem.setBackground(new Color(255, 255, 255));
edit_menu.add(cut_menuitem);
copy_menuitem.setBackground(new Color(255, 255, 255));
edit_menu.add(copy_menuitem);
past_menuitem.setBackground(new Color(255, 255, 255));
edit_menu.add(past_menuitem);
edit_menu.add(edit_separator);
delete_menuitem.setBackground(new Color(255, 255, 255));
edit_menu.add(delete_menuitem);
help_menu.setFont(new Font("Arial", Font.PLAIN, 12));
menuBar.add(help_menu);
about_menuitem.setBackground(new Color(255, 255, 255));
help_menu.add(about_menuitem);
toolBar.setBackground(new Color(159, 224, 254));
toolBar.setFloatable(false);
panel.add(toolBar, BorderLayout.CENTER);
pascal_pane.setFont(new Font("Tahoma", Font.PLAIN, 12));
cpp_pane.setFont(new Font("Tahoma", Font.PLAIN, 12));
number_pane.setFont(new Font("Tahoma", Font.PLAIN, 12));
open_button.setIcon(new ImageIcon(Konverter.class.getResource("img/open.png")));
toolBar.add(open_button);
save_button.setIcon(new ImageIcon(Konverter.class.getResource("img/save.png")));
toolBar.add(save_button);
clear_button.setIcon(new ImageIcon(Konverter.class.getResource("img/clean.png")));
toolBar.add(clear_button);
copy_button.setIcon(new ImageIcon(Konverter.class.getResource("img/copy.png")));
copy_button.setSelectedIcon(new ImageIcon(Konverter.class.getResource("img/open.png")));
toolBar.add(copy_button);
run_button.setIcon(new ImageIcon(Konverter.class.getResource("img/run24.png")));
toolBar.add(run_button);
splitPane.setBackground(new Color(255, 255, 255));
splitPane.setResizeWeight ( 0.5 );
//-------------------------------------------
//------- СОБЫТИЯ МЕНЮ -------
open_button.addMouseListener(new MouseAdapter() { // открытиефайла
@Override
public void mouseClicked(MouseEvent arg0){
choose = new JFileChooser();
choose.setDialogTitle("Выберитефайл");
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
int res = choose.showOpenDialog(Konverter.this);
if (res == JFileChooser.APPROVE_OPTION)
{
String fileName = choose.getSelectedFile().toString();
try
{
BufferedReader fr = new BufferedReader(new FileReader(fileName));
pascal_pane.read(fr, false);
fr.close();
}
catch (FileNotFoundException ex) {}
catch(IOException ea) {}
}
}
});
save_button.addMouseListener(new MouseAdapter() { // записьфайла
@Override
public void mouseClicked(MouseEvent e) {
choose = new JFileChooser();
choose.addChoosableFileFilter(new TextFileFilter());
choose.setDialogTitle("Выберитефайл");
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
int res = choose.showSaveDialog(Konverter.this);
if (res == JFileChooser.APPROVE_OPTION)
{
fileName = choose.getSelectedFile().toString();
if(!fileName.endsWith(".cpp"))
fileName += ".cpp";
try
{
bw = new BufferedWriter( new FileWriter(fileName));
cpp_pane.write(bw);
bw.close();
}
catch (FileNotFoundException ex) {}
catch(IOException ea) {}
}
}
});
clear_button.addMouseListener(new MouseAdapter() { // очисткаполей
@Override
public void mouseClicked(MouseEvent e) {
number_pane.setText(null);
pascal_pane.setText(null);
cpp_pane.setText(null);
}
});
copy_button.addMouseListener(new MouseAdapter() { // копировать
@Override
public void mouse Clicked (MouseEvent e) {
StringSelection stringSelection = new StringSelection(pascal_pane.getSelectedText());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
});
open_menuitem.addMouseListener(new MouseAdapter() // открытие файла
{
@Override
public void mousePressed(MouseEvent arg0) {
choose = new JFileChooser();
choose.setDialogTitle("Выберитефайл");
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
int res = choose.showOpenDialog(Konverter.this);
if (res == JFileChooser.APPROVE_OPTION) {
String fileName = choose.getSelectedFile().toString();
try {
BufferedReader fr = new BufferedReader(new FileReader(fileName));
pascal_pane.read(fr, false);
fr.close();
} catch (FileNotFoundException ex) {
} catch (IOException ea) {
}
}
}
});
save_menuitem.add Mouse Listener(new MouseAdapter() // сохранить документ
{
@Override
public void mousePressed(MouseEvent e) {
choose = new JFileChooser();
choose.addChoosableFileFilter(new TextFileFilter());
choose.setDialogTitle("Выберитефайл");
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
int res = choose.showSaveDialog(Konverter.this);
if (res == JFileChooser.APPROVE_OPTION) {
fileName = choose.getSelectedFile().toString();
if(!fileName.endsWith(".cpp"))
fileName += ".cpp";
try {
bw = new BufferedWriter(new FileWriter(fileName));
cpp_pane.write(bw);
bw.close();
} catch (FileNotFoundException ex) {
} catch (IOException ea) {
}
}
}
});
delete_menuitem.addMouseListener(new MouseAdapter() // очистить поля
{
@Override
public void mousePressed(MouseEvent e) {
number_pane.setText(null);
pascal_pane.setText(null);
cpp_pane.setText(null);
}
});
exit_menuitem.addMouseListener(new MouseAdapter() // выход
{
@Override
public void mousePressed(MouseEvent e) {
System.exit(0);
}
});
copy_menuitem.addMouseListener(new MouseAdapter() // копировать
{
@Override
public void mousePressed(MouseEvent e) {
StringSelection stringSelection = new StringSelection(pascal_pane.getSelectedText());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
});
past_menuitem.addMouseListener(new MouseAdapter() // вставить
{
@Override
public void mouse Pressed (MouseEvent e) {
String clip = "";
Transferable trans = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try {
clip = (String) trans.getTransferData(DataFlavor.stringFlavor);
} catch (Exception exc) {
}
pascal_pane.replaceSelection(clip);
}
});
cut_menuitem.addMouseListener(new MouseAdapter() // вырезать
{
@Override
public void mousePressed(MouseEvent e) {
StringSelection stringSelection = new StringSelection(pascal_pane.getSelectedText());
pascal_pane.replaceSelection("");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
});
about_menuitem.addMouseListener(new MouseAdapter() // О программе
{
@Override
public void mousePressed(MouseEvent e) {
JOptionPane.showMessageDialog(frame, "Программа реализует замену синтаксиса\n" +
"языка Pascal на язык C++ при объявлении\n" +
"переменных и констант, вводе операторов \n" +
"условия if и циклов for.\n\n" +
"Курсовой проект\n" +
"вариант 3\n" +
"группа - СКС-13\n" +
"автор - Богданова Ю.А.\n");
}
});
//----------------------------
//------- СОБЫТИЕ КНОПКИ -------
run_button.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
String[] errors_of_string = pascal_pane.getText().split("\n"); // нужен для нахождения ошибо кв тексте
char bukva = 0; // проверяет последний символ строки на наличие ошибки
String errors = ""; // записывает номера строк с ошибками
number_pane.setText(null); // панель с количеством введенных строк
int cntBegin = 0;
int cntEnd = 0;
for (int i = 0; i < errors_of_string.length; i++) // определение строк с ошибками
{
try {
bukva = errors_of_string[i].toCharArray()[errors_of_string[i].length() - 2]; // -2 потомучтовконце
if (bukva != 'n' && bukva != 'd' && bukva != 'o' && bukva != ';' && bukva != ' ') // каждой строки есть "\n"
{
errors += i + 1 + ", "; // запись номеров строк
}
} catch (Exception e1) {
}
if (errors_of_string[i].toLowerCase().indexOf("begin") != -1)
cntBegin += 1;
if (errors_of_string[i].toLowerCase().indexOf("end") != -1)
cntEnd += 1;
}
if (cntBegin != cntEnd)
JOptionPane.showMessageDialog(frame, "Количество Begin не соответстует количеству End!");
if (errors != "") { // если допустили ошибку, то выводит сообщение
JOptionPane.showMessageDialog(frame, "Вы допустили ошибку в строках с номерами: " + errors.substring(0, errors.length() - 2));
cpp_pane.setText(null); // и очищаем правое поле
} else {
cpp_pane.setText(null); // и очищаем правое поле
String[] pascal_text = pascal_pane.getText().split(";"); // разделяем текст на блоки разделенные ";"
mainFlag = true;
for (int i = 0; i < pascal_text.length; i++) // каждый блок отправляем на "обработку" в спец. функцию
{
pascal_text[i] = containsWords(pascal_text[i]); // присваиваем обработанные данные
cpp_pane.setText(cpp_pane.getText() + pascal_text[i]); // и выводим на правую панель
}
}
number_pane.setText(null); // очищаем панель нумерации строк, чтобы всегда начиналась с 1
for (int i = 1; i <= errors_of_string.length; i++) // в зависимости от количества строк в левом поле
{
number_pane.setText(number_pane.getText() + i + ":\n"); // на считвываем нумерацию
}
}
String containsWords(String text) // функция обработки (перевода) данных
{
text = text.toLowerCase();
Pattern if_searth = Pattern.compile("if"); // ищем слово "if"
Matcher if_find = if_searth.matcher(text); // в остправленном блоке
Pattern for_searth = Pattern.compile("for"); // ищем слово "for"
Matcher for_find = for_searth.matcher(text); // всё там же
if(mainFlag){
if(text.startsWith("begin")){
text = text.replaceAll("begin\r\n", "");
text = text.replaceAll("begin\n", "");
text = text.replaceAll("begin", "");
}
else
mainFlag = false;
}
if (if_find.find() == true) // если нашли "if"
{
check_if = true; // см. строки 446-457
} else // если не нашли
{
String[] pascal_set_type = text.split(":"); // разделяем, если возможно, блок на части по этому знаку
for (int i = 0; i < pascal_types.length; i++) // см. 50 строку
{
Pattern pattern = Pattern. compile(pascal_types[i]); // ищемкаждыйизэтихэлементов
Matcher matcher;
if (pascal_set_type.length > 1 )
matcher = pattern.matcher(pascal_set_type[1]); // в правой части объекта (т.е. справа от знака ":")
else
matcher = pattern.matcher(pascal_set_type[0]); // в левой части объекта (т.е. слева от знака ":")
Pattern const_searth = Pattern.compile("const"); // ищемслово "const"
Matcher const_find = const_searth.matcher(pascal_set_type[0]); // тамже
if (matcher.find() == true) // если нашли "integer", "longint", "string" ... или "real"
{
if (const_find.find() == true) // если нашли слово "const"
{
if (pascal_set_type.length >= 2) // если у нас строка типа "const x: Integer = 5;"
{
pascal_set_type[1] = pascal_set_type[1].replaceAll(pascal_types[i], ""); // то убераем "Integer", "Longint" ... ит.д.
pascal_set_type[0] = pascal_set_type[0].replaceAll("const", "const "+ cpp_types[i] + " ");
text = pascal_set_type[0] + pascal_set_type[1] + ";"; // и выводим: const int x = 5;
} // знак равно и часть, что была справа, например " 6"
else // если у нас строка типа "x: Integer;"
{
pascal_set_type[1] = pascal_set_type[1].replaceAll(pascal_types[i], ""); // тоубераем "integer", "longint" ... ит.д.
pascal_set_type[0] = pascal_set_type[0].replaceAll("const", "const "+ cpp_types[i] + " ");
text = pascal_set_type[0] + ";"; // выводим: const int x;
}
} else if (for_find.find() == true) // если нашли слово "for"
{
check_if = false;// см. строки 460-466
}
else // если не нашли слова "for", "const" и "if", значит остаются обычные объявления переменных
{
if (pascal_set_type.length >= 2) // если у нас строка типа "x: Integer = 6;"
{
pascal_set_type[1] = pascal_set_type[1].replaceAll(pascal_types[i], ""); // заменяемтипыданныхна ""
text = cpp_types[i] + " " + pascal_set_type[0] + pascal_set_type[1] + ";"; // выводим результат как выше
}
}
}
}
}
if (check_if == true) // этодля "if"
{
// if a = 5 then... -> if(a == 5)...
String[] if_parts = text.split("then");
if_parts[0] = if_parts[0].replaceAll("if", "if (");
if_parts[0] = if_parts[0].replaceAll("=", "==");
if_parts[0] = if_parts[0].replaceAll("<>", "!=");
if_parts[0] = if_parts[0].replaceAll("and", "&&");
if_parts[0] = if_parts[0].replaceAll("or", "||");
if_parts[0] = if_parts[0].replaceAll("not", "!");
text = if_parts[0] + ") ";
if (if_parts.length >= 2){
String[] else_parts = if_parts[1].split("else"); // обрабатываем else
if (else_parts.length >= 2){
if_parts[1] = else_parts[0].trim() + "; else" + else_parts[1];
}
text = text + if_parts[1] + ";";
}
check_if = false;
} else // этодля "for"
{
// for i := 1 to N do... -> for(i = 1; i < n ; i++)...
String[] assign = text.split(":=");
assign[0] = assign[0].replaceAll("for ", "").trim(); // получаем переменную цикла i
text = text.replaceAll("to", "; " + assign[0] + " <");// получаем ; i < n
text = text.replaceAll("do", "; " + assign[0] + "++ )" ); // получаем ; i++)
text = text.replaceAll("for ", "for( ");
if (text.endsWith(";") == false && text.trim().equals("") == false)
text = text + ";";
}
text = text.replaceAll(":=", "="); // а это заменяем всегда и везде
text = text.replaceAll("begin", "\\{");
text = text.replaceAll("end;", "\\}");
text = text.replaceAll("end.", "\\}");
text = text.replaceAll("end", "\\}");
text = text.replaceAll("div", "\\/");
text = text.replaceAll("mod", "\\%");
text = text.replaceAll("};", "\\}");
text = text.replaceAll("var", "");
String[] writeln_parts = text.split("writeln"); // заменяем WriteLn на cout
// WriteLn(xyz) -> cout << xyz << endl
if (writeln_parts.length >= 2){
text = writeln_parts[0];
writeln_parts[1] = writeln_parts[1].replaceAll("\\(", " << ");
writeln_parts[1] = writeln_parts[1].replaceAll("\\)", " << endl");
text = text + "cout" + writeln_parts[1];
}
String[] write_parts = text.split("write"); // заменяем Write на cout
// Write(xyz) -> cout << xyz
if (write_parts.length >= 2){
text = write_parts[0];
write_parts[1] = write_parts[1].replaceAll("\\(", " << ");
write_parts[1] = write_parts[1].replaceAll("\\)", "");
text = text + "cout" + write_parts[1];
}
if(mainFlag){
text = "void main()\n{\n" + text; // добавляем main() C++
mainFlag = false;
}
returntext;// возвращаем обработанный блок
}
});
}
}
class TextFileFilter extends FileFilter // нужно для сохранения
{
public boolean accept(java.io.File file) {
if (file.isDirectory()) {
return true;
}
return (file.getName().endsWith("cpp"));
}
public String getDescription() {
return "C++ files (*.cpp)";
}
}
Размещено на Allbest.ru
Подобные документы
Описание возможностей языка программирования Turbo Pascal. Написание программы создания файлов с прямым доступом, которая также будет обрабатывать наборы данных с определенными полями и ограничениями. Контрольный пример работы поисковой программы.
курсовая работа [563,6 K], добавлен 22.01.2016Взаимосвязь стадий процесса проектирования сложных программных систем. Создание компилятора подмножества языка высокого уровня (Pascal) на язык Ассемблера. Структура входных и выходных данных, алгоритмы их обработки. Рабочая документация программы.
курсовая работа [256,7 K], добавлен 27.07.2014Особенности представления алгебраических операций над регулярными языками. Операторы, основные принципы работы с регулярными выражениями, способы их построения. Разработка программ для поиска в тексте необходимой информации, их тестирование и отладка.
контрольная работа [197,9 K], добавлен 07.08.2013Разработка программ на языке Turbo Pascal на основе использования массивов данных. Особенности хранения данных, способы объявления переменных, действия над элементами массивов, их ввод и вывод. Практическое применение одномерных и многомерных массивов.
методичка [17,8 K], добавлен 25.11.2010Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.
курсовая работа [1,0 M], добавлен 03.07.2011Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.
курсовая работа [1,5 M], добавлен 08.02.2011Ознакомление со структурой языка программирования Turbo-Pascal 7.0, его алфавитом, выражениями и простейшими конструкциями (метками, идентификаторами). Способы описания арифметических, вещественных, логических и символьных операций в программной среде.
реферат [68,2 K], добавлен 07.02.2011Разработка комплекса алгоритмов. Кодирование и компиляция. Тестирование, отладка, испытание и сдача программы. Минимальные системные требования для использования Delphi 7. Написание программы с использованием инструментального языка высокого уровня.
курсовая работа [2,7 M], добавлен 21.02.2011Характеристика и основные особенности языка Pascal. Создание числового массива с использованием встроенной функции. Использование записей, массивов и файлов. Обработка и графическая визуализация данных средствами табличного процессора и пакета MathCAD.
курсовая работа [1,0 M], добавлен 22.08.2012Синтаксис языка РНР, его переменные и чувствительность их имен к регистру. Гибкость в отношении типов переменных, преобразование типов. Набор основных типов данных при работе с переменными. Методы передача переменных скрипту. Операторы цикла и выбора.
дипломная работа [27,3 K], добавлен 15.04.2009