Merge
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
REGEX
|
||||
(a|b)
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user