This commit is contained in:
Yorick Rommers
2017-06-12 16:02:47 +02:00
8 changed files with 220 additions and 79 deletions
-2
View File
@@ -1,2 +0,0 @@
REGEX
(a|b)
-7
View File
@@ -1,7 +0,0 @@
Tabs voor openstaande grafieken, met manier om te sluiten ofzo
File selector voor dot files
Error message
loading bar
regex input
exporteren van plaatje
exporteren van raw data
+30
View File
@@ -90,4 +90,34 @@ public class Automata <T extends Comparable> extends Importable {
}
return "Automata" + sb.toString();
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Automata))
return false;
if(this.type != ((Automata<T>)obj).type)
return false;
DFA<String> dfa1;
DFA<String> dfa2;
if(this.type == Type.NDFA)
{
dfa1 = ((NDFA<T>)this).toDFA().minimaliseerHopcroft();
dfa2 = ((NDFA<T>) obj).toDFA().minimaliseerHopcroft();
}
else
{
dfa1 = ((DFA<String>)this).minimaliseerHopcroft();
dfa2 = ((DFA<String>) obj).minimaliseerHopcroft();
}
DFA<String> result = dfa2.ontkenning().en(dfa1).minimaliseerHopcroft();
if(result.states.size() <= 1)
return true;
return false;
}
}
+16 -6
View File
@@ -92,17 +92,27 @@ public class Graph {
return text;
}
public static synchronized void generateImage(Automata<String> a, String fileName) {
public static synchronized File generateImage(Automata<String> a)
{
return generateImage(a, null);
}
public static synchronized File generateImage(Automata<String> a, String fileName) {
File f;
if (fileName != null) {
f = new File("images/" + fileName + ".png");
} else {
f = new File("images/" + a.hashCode() + ".png");
}
try {
MutableGraph g = Parser.read(Graph.generateImageString(a));
if (fileName != null) {
Graphviz.fromGraph(g).width(Math.max(a.states.size() * 150, 750)).render(Format.PNG).toFile(new File("images/" + fileName + ".png"));
} else {
Graphviz.fromGraph(g).width(Math.max(a.states.size() * 150, 750)).render(Format.PNG).toFile(new File("images/" + a.hashCode() + ".png"));
}
Graphviz.fromGraph(g).width(Math.max(a.states.size() * 150, 750)).render(Format.PNG).toFile(f);
} catch (IOException e) {
e.printStackTrace();
}
return f;
}
}
+21
View File
@@ -0,0 +1,21 @@
package com.imegumii;
/**
* Created by kenny on 12-6-2017.
*/
public class Util {
public static String randomString(int lenght)
{
String s = "";
String all = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for(int i = 0; i < lenght; i++)
{
int rand = (int)(Math.random() * all.length());
s += all.substring(rand, rand+1);
}
return s;
}
}
+141 -44
View File
@@ -10,6 +10,7 @@ import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Point2D;
import java.io.*;
import java.awt.image.BufferedImage;
@@ -43,6 +44,7 @@ public class GraphPanel extends JPanel {
buttonPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.BLACK), BorderFactory.createEmptyBorder(10, 10, 10, 10)));
JButton closeTab = new JButton("Close");
closeTab.setForeground(new Color(200, 100, 100));
closeTab.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@@ -50,31 +52,37 @@ public class GraphPanel extends JPanel {
}
});
JButton exportData = new JButton("Export raw data");
JButton exportData = new JButton("Export data");
exportData.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String filename = "raw." + name.toLowerCase() + ".dot";
File file = new File("export/" + filename);
if(file.exists()){
int reply = JOptionPane.showConfirmDialog(null, "The file " + filename + "already exists. Do you want to overwrite it?", "File exists", JOptionPane.YES_NO_OPTION);
if (reply != JOptionPane.YES_OPTION) {
StatusPanel.Instance().setStatus("Cancelled export");
return;
BackgroundWorker.instance().addWorker(new BackgroundWorker.Worker() {
@Override
public void execute() {
String filename = "data." + Util.randomString(5) + ".dot";
File file = new File("export/" + filename);
if(file.exists()){
int reply = JOptionPane.showConfirmDialog(null, "The file " + filename + "already exists. Do you want to overwrite it?", "File exists", JOptionPane.YES_NO_OPTION);
if (reply != JOptionPane.YES_OPTION) {
StatusPanel.Instance().setStatus("Cancelled export");
return;
}
}
PrintWriter w = null;
try {
w = new PrintWriter(file);
w.print(automata.getTransitions());
w.flush();
w.close();
StatusPanel.Instance().setStatus("Success: " + filename);
} catch (FileNotFoundException e1) {
StatusPanel.Instance().setStatus("Something went wrong while exporting the file");
}
}
}
PrintWriter w = null;
try {
w = new PrintWriter(file);
w.print(automata.getTransitions());
w.flush();
w.close();
StatusPanel.Instance().setStatus("Success: " + filename);
} catch (FileNotFoundException e1) {
StatusPanel.Instance().setStatus("Something went wrong while exporting the file");
}
});
}
});
@@ -86,7 +94,7 @@ public class GraphPanel extends JPanel {
BackgroundWorker.instance().addWorker(new BackgroundWorker.Worker() {
@Override
public void execute() {
String filename = "img." + name.toLowerCase() + ".png";
String filename = "img." + Util.randomString(5) + ".png";
File file = new File("export/" + filename);
if(file.exists()){
@@ -108,7 +116,7 @@ public class GraphPanel extends JPanel {
}
});
JButton minimizeButton = new JButton("Minimize graph");
JButton minimizeButton = new JButton("Hopcroft");
minimizeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@@ -117,50 +125,140 @@ public class GraphPanel extends JPanel {
public void execute() {
if(automata.type == Importable.Type.NDFA)
{
StatusPanel.Instance().setStatus("Converting to DFA " + name, 20);
StatusPanel.Instance().setStatus("Converting to DFA ", 20);
DFA<String> convert = ((NDFA<String>) automata).toDFA();
StatusPanel.Instance().setStatus("Generating image for DFA " + name, 30);
Graph.generateImage(convert, "cdfa");
TabPanel.Instance().addGraph("DFA: " + name, new File("images/cdfa.png"), convert);
StatusPanel.Instance().setStatus("Minimizing cdfa." + name, 50);
StatusPanel.Instance().setStatus("Generating image for DFA", 30);
File img = Graph.generateImage(convert);
TabPanel.Instance().addGraph(name, img, convert);
StatusPanel.Instance().setStatus("Minimizing DFA", 50);
DFA<String> mini = convert.minimaliseerHopcroft();
StatusPanel.Instance().setStatus("Generating minimized image", 70);
Graph.generateImage(mini, "mcdfa");
TabPanel.Instance().addGraph("DFA: mcdfa." + name, new File("images/mcdfa.png"), mini);
File img2 = Graph.generateImage(mini);
TabPanel.Instance().addGraph(name, img2, mini);
StatusPanel.Instance().setStatus("Done", 100);
}
else if(automata.type == Importable.Type.DFA)
{
DFA<String> dfa = (DFA<String>) automata;
StatusPanel.Instance().setStatus("Minimizing dfa." + name, 40);
DFA<String> dfa = (DFA<String>) automata;
DFA<String> mini = dfa.minimaliseerHopcroft();
StatusPanel.Instance().setStatus("Generating minimized image", 60);
Graph.generateImage(mini, "mcdfa");
TabPanel.Instance().addGraph("DFA: mcdfa." + name, new File("images/mcdfa.png"), mini);
File img3 = Graph.generateImage(mini);
TabPanel.Instance().addGraph(name, img3, mini);
StatusPanel.Instance().setStatus("Done", 100);
}
}
});
}
});
JButton minimize2Button = new JButton("Bryzowski");
minimize2Button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BackgroundWorker.instance().addWorker(new BackgroundWorker.Worker() {
@Override
public void execute() {
if(automata.type == Importable.Type.NDFA)
{
StatusPanel.Instance().setStatus("Converting to DFA ", 20);
DFA<String> convert = ((NDFA<String>) automata).toDFA();
StatusPanel.Instance().setStatus("Generating image for DFA", 30);
File img = Graph.generateImage(convert);
TabPanel.Instance().addGraph(name, img, convert);
StatusPanel.Instance().setStatus("Minimizing DFA", 50);
DFA<String> mini = convert.minimaliseer();
StatusPanel.Instance().setStatus("Generating minimized image", 70);
File img2 = Graph.generateImage(mini);
TabPanel.Instance().addGraph(name, img2, mini);
StatusPanel.Instance().setStatus("Done", 100);
}
else if(automata.type == Importable.Type.DFA)
{
StatusPanel.Instance().setStatus("Minimizing dfa." + name, 40);
DFA<String> dfa = (DFA<String>) automata;
DFA<String> mini = dfa.minimaliseer();
StatusPanel.Instance().setStatus("Generating minimized image", 60);
File img3 = Graph.generateImage(mini);
TabPanel.Instance().addGraph(name, img3, mini);
StatusPanel.Instance().setStatus("Done", 100);
}
}
});
}
});
JButton reverseButton = new JButton("Reverse");
reverseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BackgroundWorker.instance().addWorker(new BackgroundWorker.Worker() {
@Override
public void execute() {
StatusPanel.Instance().setStatus("Reversing ", 20);
NDFA<String> reverse = ((DFA<String>) automata).reverse();
StatusPanel.Instance().setStatus("Generating reversed image", 70);
File img = Graph.generateImage(reverse);
TabPanel.Instance().addGraph("Reverse " + name, img, reverse);
StatusPanel.Instance().setStatus("Done", 100);
}
});
}
});
JButton notButton = new JButton("Not");
notButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BackgroundWorker.instance().addWorker(new BackgroundWorker.Worker() {
@Override
public void execute() {
StatusPanel.Instance().setStatus("Nothing ", 20);
DFA<String> not = ((DFA<String>) automata).ontkenning();
StatusPanel.Instance().setStatus("Generating not image", 70);
File img = Graph.generateImage(not);
TabPanel.Instance().addGraph("Not " + name, img, not);
StatusPanel.Instance().setStatus("Done", 100);
}
});
}
});
buttonPanel.add(Box.createHorizontalGlue());
if(automata.type == Importable.Type.DFA) {
buttonPanel.add(notButton);
buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPanel.add(reverseButton);
buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
}
buttonPanel.add(minimize2Button);
buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPanel.add(minimizeButton);
buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPanel.add(exportImage);
@@ -170,6 +268,5 @@ public class GraphPanel extends JPanel {
buttonPanel.add(closeTab);
this.add(buttonPanel, BorderLayout.SOUTH);
}
}
+9 -19
View File
@@ -51,15 +51,12 @@ public class InputPanel extends JPanel {
@Override
public void execute() {
String regS = text.getText().trim();
String name = "regex1";
text.setText("");
String name = regS;
StatusPanel.Instance().setStatus("Parsing REGEX", 20);
RegExp regex = new RegExp();
regex = regex.naarRegExp(regS);
// System.out.println(regex.getTaal(4, 10));
StatusPanel.Instance().setStatus("Converting REGEX to NDFA", 40);
@@ -67,9 +64,9 @@ public class InputPanel extends JPanel {
StatusPanel.Instance().setStatus("Generating image for NDFA", 70);
Graph.generateImage(ndfa, name);
File img = Graph.generateImage(ndfa);
TabPanel.Instance().addGraph("REGEX: " + name, new File("images/" + name + ".png"), ndfa);
TabPanel.Instance().addGraph(name, img, ndfa);
StatusPanel.Instance().setStatus("Generating taal", 90);
@@ -125,9 +122,9 @@ public class InputPanel extends JPanel {
StatusPanel.Instance().setStatus("Generating image for NDFA", 60);
NDFA<String> ndfa = (NDFA<String>)p;
Graph.generateImage(ndfa, name);
File f = Graph.generateImage(ndfa);
TabPanel.Instance().addGraph("NDFA: " + name, new File("images/" + name + ".png"), ndfa);
TabPanel.Instance().addGraph(name, f, ndfa);
}
if(p.type == Importable.Type.DFA)
@@ -135,9 +132,9 @@ public class InputPanel extends JPanel {
StatusPanel.Instance().setStatus("Generating image for DFA", 60);
DFA<String> dfa = (DFA<String>)p;
Graph.generateImage(dfa, name);
File f = Graph.generateImage(dfa);
TabPanel.Instance().addGraph("DFA: " + name, new File("images/" + name + ".png"), dfa);
TabPanel.Instance().addGraph(name, f, dfa);
}
if(p.type == Importable.Type.REGEX)
@@ -145,19 +142,13 @@ public class InputPanel extends JPanel {
StatusPanel.Instance().setStatus("Converting REGEX to NDFA", 40);
RegExp regex = (RegExp) p;
// System.out.println(regex.getTaal(10));
NDFA<String> ndfa = ThompsonConverter.convert(regex);
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
}
StatusPanel.Instance().setStatus("Generating image for NDFA", 70);
Graph.generateImage(ndfa, name);
File f = Graph.generateImage(ndfa);
TabPanel.Instance().addGraph("REGEX: " + name, new File("images/" + name + ".png"), ndfa);
TabPanel.Instance().addGraph(name, f, ndfa);
}
StatusPanel.Instance().setStatus("Done", 100);
@@ -169,7 +160,6 @@ public class InputPanel extends JPanel {
bottomPanel.add(fileButton);
bottomPanel.add(Box.createHorizontalGlue());
this.add(bottomPanel, BorderLayout.SOUTH);
}
+3 -1
View File
@@ -28,7 +28,9 @@ public class TabPanel extends JTabbedPane {
public void addGraph(String name, File image, Automata<String> a)
{
this.addTab(name, new GraphPanel(name, image, a));
String n = a.type.toString() + ": " + name;
this.addTab(n, new GraphPanel(name, image, a));
this.setSelectedIndex(this.getTabCount() - 1);
}