Материал: Конвертор из языка Pascal в C++

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

.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)";

}

}